1.13 Schema下默认拆分表
1.13.1 背景
需要3000+张拆分规则相同的表参与poc测试,手动逐个配置表较繁琐,希望在对应schema节点配置默认拆分规则,凡是在此schema下建立的表默认采用其拆分规则进行路由。
1.13.2 配置模版
<!-- schema default multi shardingNode[dn1,dn2] and split algorithm[func_common_hash];
In multi shardingNode, loaded tables are called 'default sharding tables'; In fact, equivalent to shardingTable;
But, it is not recommended to configure the Sharding table in the production environment -->
<schema name="testdb3" shardingNode="dn1,dn2" function="func_common_hash"/>
【注意】:不建议在生产环境中使用此配置方式创建拆分表
1.13.3 实际演练
1.13.3.1 配置
<schema name="TESTDB0" shardingNode="dn9,dn10" function="func_common_hash" sqlMaxLimit="100">
<shardingTable name="tableA" shardingNode="dn1,dn2" function="func_common_hash" shardingColumn="c1"/>
</schema>
1.13.3.2 创建表
CREATE TABLE `tableA` (
`c1` int(11) ,
`c2` varchar(200) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `tableB` (
`c1` int(11) auto_increment,
`c2` varchar(200) DEFAULT NULL,
`c3` int(11) ,
`c4` int(11) ,
`c5` int(11) ,
`c6` int(11) ,
INDEX indexs (c5,c6),
unique KEY (`c4`),
KEY `index1` (`c3`),
primary KEY (`c1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
1.13.3.3 详解
- Dble启动时:加载所有分片中均存在的表;若各个节点表不一致会有相应的日志或者告警
- shardingNode和function匹配:与shardingTable中的shardingNode和function匹配规则一致
- 拆分列选举规则:对schema下默认拆分表,拆分列由Dble内部选举规则决定
- 选举时机:
- 根据执行DDL语句中仅对
create table
语句进行选举拆分列;其他修改表结构的DDL不会重新选举拆分列 - 加载元数据(如启动/reload),会根据
show creata table
语句进行选举拆分列
- 根据执行DDL语句中仅对
- 选举规则:先避开自增列(如auto_increment列),根据优先级高低选举为拆分列:主键->唯一键->索引列->id列->第一列; (不支持与function的数据类型智能选举列); 如tableB选举的拆分列为'c4';
- 注意事项:若中途执行修改表结构的DDL后,重新加载元数据(执行
reload @@metadata
),拆分列会因重新选举而可能发生变化(导致后续路由结果与之前的不一致)
- 选举时机:
- View支持度:schema有配置默认拆分算法时,该schema仅支持Dble层面的View
- DML&DDL支持度:与shardingTable支持度一致
- 告警:开启告警功能,在加载元数据时(如reload)或者开启表一致性检查时(bootstrap.cnf中
-DcheckTableConsistency=1
)- 部分shardingNode对应的物理库中表存在丢失场景,Dble会有对应告警提示
- 所有shardingNode对应的物理库中表均丢失场景,Dble会从内存中移除该表;对应日志关键字检索:
has been lost, will remove his metadata
- reload
reload @@metadata [where schema=? [and table=?]]
:从默认拆分片中加载元数据reload @@config_all [-s] [-f] [-r]
:是否从默认拆分片中加载元数据需具体场景而定(理论上与默认单分片加载元数据的逻辑一致)
管理端表:
- dble_schema中,支持查看function列
- dble_table、dble_table_sharding_node、dble_sharding_table表中,id字段增加以'FC'前缀的表,表示该表是从schema默认拆分片加载出来的;('FC'前缀id实际上为全局id,Dble运行过程中途可能会存在表丢失或者多次reload操作等行为,会出现id不连续)
mysql> select * from dble_schema; +---------+---------------+------------------+---------------+ | name | sharding_node | function | sql_max_limit | +---------+---------------+------------------+---------------+ | TESTDB0 | dn9,dn10 | func_common_hash | 100 | +---------+---------------+------------------+---------------+ 1 row in set (0.00 sec) mysql> select * from dble_table; +------+--------+---------+-----------+----------+ | id | name | schema | max_limit | type | +------+--------+---------+-----------+----------+ | C1 | tableA | TESTDB0 | 100 | SHARDING | | FC2 | tableB | TESTDB0 | 100 | SHARDING | +------+--------+---------+-----------+----------+ 2 rows in set (0.00 sec) mysql> select * from dble_table_sharding_node; +------+---------------+-------+ | id | sharding_node | order | +------+---------------+-------+ | C1 | dn1 | 0 | | C1 | dn2 | 1 | | FC2 | dn9 | 0 | | FC2 | dn10 | 1 | +------+---------------+-------+ 4 rows in set (0.01 sec) mysql> select * from dble_sharding_table; +------+------------------+-----------------+-----------------------+------------------+ | id | increment_column | sharding_column | sql_required_sharding | algorithm_name | +------+------------------+-----------------+-----------------------+------------------+ | C1 | NULL | C1 | false | func_common_hash | | FC2 | NULL | C4 | false | func_common_hash | +------+------------------+-----------------+-----------------------+------------------+ 2 rows in set (0.00 sec)