1.简介

在使用MyCat分库分表之后,如果还是使用MySql中的主键自增的话,已经无法保证这个自增主键在MySql集群中的唯一性了,为了实现全局唯一主键,MyCat提供了好几种方式实现全局唯一主键,分别有:

本地文件方式
数据库方式
时间戳方式
分布式 ZK ID生成器
ZK递增ID 生成
12345

本文将对本地文件方式进行简单的说明,并通过一个示例描述其使用方法。

2.本地文件方式

此方式 MyCat 将 sequence 配置到文件中,当使用到 sequence 中的配置后,MyCat会更新sequence_conf.properties 文件中 sequence 当前的值(currentValue)。

具体步骤如下:

【a】sequence_conf.properties配置:

ORDER.HISIDS=
ORDER.MINID=1001
ORDER.MAXID=2000
ORDER.CURID=1000
 
ORDERDETAIL.HISIDS=
ORDERDETAIL.MINID=1001
ORDERDETAIL.MAXID=2000
ORDERDETAIL.CURID=1000
123456789

【b】server.xml中执行序列生成方式sequnceHandlerType=0为本地文件方式:

<property name="sequnceHandlerType">0</property>
1

【c】server.xml配置逻辑库以及MyCat访问的用户信息:

 <user name="root">
                <property name="password">123456</property>
                <property name="schemas">mycat_order</property>
 
                <!-- 表级 DML 权限设置 -->
                <!-- <privileges check="false"> <schema name="TESTDB" dml="0110" > <table name="tb01" dml="0000"></table> <table name="tb02" dml="1111"></table> </schema> </privileges> -->
        </user>
 
        <user name="user">
                <property name="password">123456</property>
                <property name="schemas">mycat_order</property>
                <property name="readOnly">true</property>
        </user>
1234567891011121314151617181920

【d】schema.xml配置分片节点、节点主机等信息:

<schema name="mycat_order" checkSQLschema="false" sqlMaxLimit="100">
            <table name="t_order" dataNode="dn1,dn2" rule="mod-long">
                    <childTable name="t_order_detail" primaryKey="od_id" joinKey="order_id" parentKey="order_id"></childTable>
            </table>
    </schema>

    <dataNode name="dn1" dataHost="host1" database="test_mycat" />
    <dataNode name="dn2" dataHost="host2" database="test_mycat" />

    <dataHost name="host1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
            <heartbeat>select user()</heartbeat>
            <!-- can have multi write hosts -->
            <writeHost host="host1" url="192.168.70.128:3306" user="root" password="123">
            </writeHost>
    </dataHost>

    <dataHost name="host2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
            <heartbeat>select user()</heartbeat>
            <!-- can have multi write hosts -->
            <writeHost host="host2" url="192.168.70.130:3306" user="root" password="123">
            </writeHost>
    </dataHost>
1234567891011121314151617181920212223242526

【e】rule.xml配置分片规则:

 <tableRule name="mod-long">
                <rule>
                        <columns>order_id</columns>
                        <algorithm>mod-long</algorithm>
                </rule>
        </tableRule>
 
 <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
                <!-- how many data nodes -->
                <property name="count">2</property>
</function>
1234567891011

【f】接着启动MyCat进行测试,使用序列插入主键:

INSERT INTO `t_order`
            (`order_id`,
             `user_id`,
             `pay_mode`,
             `amount`)
VALUES (NEXT VALUE FOR MYCATSEQ_ORDER,101,1,111.1);
 
INSERT INTO `t_order`
            (`order_id`,
             `user_id`,
             `pay_mode`,
             `amount`)
VALUES (NEXT VALUE FOR MYCATSEQ_ORDER,102,5,222.2);
 
INSERT INTO `t_order`
            (`order_id`,
             `user_id`,
             `pay_mode`,
             `amount`)
VALUES (NEXT VALUE FOR MYCATSEQ_ORDER,103,7,333.3);
select * from t_order;
123456789101112131415161718192021

其中MYCATSEQ_ORDER对应序列名称ORDER,同理,使用order_detail为next value for MYCATSEQ_ORDERDETAIL

【g】测试结果:

可见,此时order_id已经根据本地配置自动增长:


【h】vim sequence_conf.properties : 可以看到ORDER.CURID=1003记录了当前序列已经到了1003,说明本地序列配置生效。

vim sequence_conf.properties 
1


如果需要详细的实现步骤,可以参考前面的一篇文件,https://blog.csdn.net/BruceLiu_code/article/details/104731096,这个入门示例也是使用的本地文件实现全局序列,保证主键全局唯一。

3.总结

在实际项目中,一般也不会采用本地文件方式生成主键,下面是其优缺点:

优点:本地加载,读取速度较快。
缺点:当 MyCAT 重新发布后,配置文件中的 sequence 会恢复到初始值。