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语句进行选举拆分列
    • 选举规则:先避开自增列(如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)
    

results matching ""

    No results matching ""