1. "globalTables": {
    2. "role_edges": {
    3. "broadcast": [{"targetName": "c0"},{"targetName": "c1"}]
    4. }
    5. }

    上述配置中,表示逻辑表role_edges在c0和c1两个存储数据库中,都有相同的数据.

    全局表一般是指在分布式数据库/中间件里面,每个存储节点都有相同数据的表,它使用数据冗余的方式,使用分片表的一个分片的数据可以与全局表的数据直接在存储节点上面的计算引擎处理,从而起到减少数据传输,减少计算节点处理数据量的效果.

    上述配置中的c0,c1未必是中间件里面的所有存储数据库,可以根据业务适当减少,减少同步数据的次数.

    全局表的数据同步方式与单个mysql的表状态有关系的时候,容易导致数据不一致(误操作),
    此处解决自增主键的情况下的问题,
    有下面四种方式进行选择,请根据业务sql的情况进行选择,
    建议sql里面都带有确切的值,避免使用自增主键

    一般全局表的同步方式有四种
    以上面的配置为例
    第一种,在计算引擎中 ,在执行插入语句的时候,,把SQL复制两次,分别插入到c0,c1中

    1. "globalTables": {
    2. "role_edges": {
    3. "sequenceType":"NO_SEQUENCE"
    4. "broadcast": [{"targetName": "c0"},{"targetName": "c1"}]
    5. }
    6. }

    第二种,在计算引擎中 ,在执行插入语句的时候,在计算引擎中 ,把SQL,直接插入到c0,然后使用第三方工具,把c0的表数据在后台复制到c1中,

    1. "globalTables": {
    2. "role_edges": {
    3. "sequenceType":"NO_SEQUENCE"
    4. "broadcast": [{"targetName": "c0"}]
    5. }
    6. }

    此处Mycat认为全局表在每个存储数据库都会存在,只涉及插入,查询全局表的时候会在c0操作,而涉及分片表的时候,是不会检查全局表在哪里的

    第三种,在计算引擎中 ,在执行插入语句,该插入语句带有自增字段,但是没有确切的值,mycat获取全局序列号,生成带有确切自增值的sql,然后插入c0,c1表

    1. "globalTables": {
    2. "role_edges": {
    3. "sequenceType":"GLOBAL_SEQUENCE"
    4. "broadcast": [{"targetName": "c0"},{"targetName": "c1"}]
    5. }
    6. }

    第四种,在计算引擎中 ,在执行插入语句,该插入语句带有自增字段,但是没有确切的值,,把SQL直接插入到c0,然后把插入后的自增值信息读取出来,生成一个新的sql,把该sql插入到c1

    1. "globalTables": {
    2. "role_edges": {
    3. "sequenceType":"FIRST_SEQUENCE"
    4. "broadcast": [{"targetName": "c0"},{"targetName": "c1"}]
    5. }
    6. }

    image.png
    深圳-木板

    sequenceType
    默认值
    NO_SEQUENCE

    可选值
    NO_SEQUENCE,
    GLOBAL_SEQUENCE
    FIRST_SEQUENCE
    不支持explain查看插入语句,因为这个插入语句的自增值依赖mysql

    2022-5-20后提供