在实现分库分表的情况下,数据库自增主键已无法保证自增主键的全局唯一。为此,MyCat 提供了全局sequence,并且提供了包含本地配置和数据库配置等多种实现方式,实现方式主要有三种:本地文件方式、数据库方式、本地时间戳算法。
一、本地文件方式
原理:此方式MyCAT将sequence配置到文件中,当使用到sequence中的配置后,MyCAT会更下conf中的sequence_conf.properties文件中sequence当前的值。
譬如:
?
1 2 3 4 5 6 7 |
|
使用方式:
1、配置MyCat的Server.xml
?
1 2 3 4 | |
2、配置sequence_conf.properties
?
1 2 3 4 5 6 7 |
|
设置完成以后重启MyCat
3、测试
?
1 2 3 4 5 |
|
?
1 2 3 4 5 6 7 8 9 10 11 |
|
二、数据库方式
原理:在数据库中建立一张表,存放sequence名称(name),sequence当前值(current_value),步长(increment int类型每次读取多少个sequence,假设为K)等信息;
?
1 2 3 4 5 |
|
使用方式:
1、配置Server.xml
?
1 2 3 4 | |
2、在其中一个分片点对应的数据库中创建表和存储过程
因我在schema.xml 中配置的是: <dataNode name="dn$1-4" dataHost="localhost1" database="db$1-4" />
譬如我在dn2中创建,对应的数据库名为db2(为什么这里会涉及到datanode,因为后续的sequence_db_conf.properties文件会使用到),
注意,是登录到数据库中创建,
而不是在mycat中创建。
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
|
在表MYCAT_SEQUENCE中,其中:
– name sequence名称
– current_value 当前value
– increment增长步长! 可理解为mycat在数据库中一次读取多少个sequence. 当这些用完后, 下次再从数据库中读取.
注意:MYCAT_SEQUENCE必须大写。
创建存储函数:
注意:必须在同一个数据库中创建,在本例中,是db2。一共要创建三个。
– 获取当前sequence的值(返回当前值,增量)
3、 插入sequence记录
?
1 2 3 4 5 |
|
?
1 2 3 4 5 6 7 | |
至此,数据库方面的准备工作已结束完毕。
4、设置 sequence_db_conf.properties
在mycat conf目录下的sequence_db_conf.properties文件中添加如下内容:DICT=dn3 dn3:表示我把表和函数都建在了dn3节点上
注意:DICT必须为大写,这个与表的数据是否大写无关,事实上,MYCAT_SEQUENCE中name是否大小写对结果没有影响。
重启MyCat
5、开始测试
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
错误处理:
?
1 | |
因为对于sequence_db_conf.properties的修改当前的mycat并不知晓,这时候,可重启mycat或者登录9066管理端口进行 reload @@config;
至此,测试完毕,关键还是两点:MYCAT_SEQUENCE必须大写,sequence_db_conf.properties文件中DICT=dn3必须大写。
三、本地时间戳算法
待续。。。
















