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 会恢复到初始值。