mycat使用zk自增ID


1、修改server.xml文件中:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="defaultSqlParser">druidparser</property>
<property name="useCompression">1</property>
<property name="serverPort">3306</property>
<property name="managerPort">3308</property>
<property name="maxStringLiteralLength">65535</property>
<!--4表示使用zk自增ID方式-->
<property name="sequnceHandlerType">4</property>
</system>
<user name="root">
<property name="password">root</property>
<property name="schemas">pay</property>
</user>
</mycat:server>


 2、修改myid.properties文件:
loadZk=true ##使用zk管理mycat和ID
zkURL=192.168.0.65:2181 #zk服务器的地址和端口
clusterId=mycat-cluster-1  #本机房mycat集群的ID
myid=mycat_fz_01 #集群内mycat的ID
clusterNodes=mycat_fz_01 #mycat节点的名称



3、修改sequence_distributed_conf.properties文件
INSTANCEID=ZK #代表使用zk
CLUSTERID=mycat-cluster-1 #与myid.properties中的CLUSTERID设置的值相同

4、配置需要使用自增ID的sequence,修改sequence_conf.properties文件
增加一段自己的配置
# self define sequence
ACCOUNT.HISIDS= #可以不填写
ACCOUNT.MINID=1 #某线程当前区间内最小值
ACCOUNT.MAXID=2000 #某线程当前区间内最大值
ACCOUNT.CURID=0 #某线程当前区间内当前值



5、重启mycat ,命令:./mycat restart
此时会在zookeeper节点中,新增一个ACCOUNT的节点,seq值为2001(为什么是生成2001,而不是1,下面会解释)
mycat使用zk自增ID


6、测试是否有效
insert into user(id) values(next value for MYCATSEQ_ACCOUNT);
注:这里的ACCOUNT一定要与sequence_conf.properties中配置的一样


注:各个配置文件的配置用处何在?以下是个人研究,可能会有错误。
一、首先查看myid.properties文件,各个配置项的用户
1,看源码,找到启动mycat的类MycatStartup.java
2、里面有这么一段代码,首先就会加载zk(不太理解zookeeper,所以这个方法没有细究
mycat使用zk自增ID

3、跳入这个方法查看,当loadZk设置成true时,会加载ZK
mycat使用zk自增ID
4、初始化ZK时,会根据myid.properties文件中的配置,加载关于zk的信息,具体还未研究
mycat使用zk自增ID


二、修改server.xml文件中的,<property name="sequnceHandlerType">4</property>
1、继续查看源码,此处会初始化MycatServer类
mycat使用zk自增ID
2、通过单例模式,得到mycatserver实例,首先会读取配置文件,通过MycatConfig这个类去操作
mycat使用zk自增ID
3、MycatConfig类主要是获取配置文件的内容,根据配置文件内容处理不同步骤是在ConfigInitializer类
mycat使用zk自增ID
4、ConfigInitializer类的构造函数
mycat使用zk自增ID
5、具体读取到server.xml文件的类是XMLServerLoader.java
mycat使用zk自增ID
6、ConfigInitializer类会根据读取到配置,做相应的操作
mycat使用zk自增ID

mycat使用zk自增ID
7、IncrSequenceZKHandler这个类会加载zk的sequence
mycat使用zk自增ID

mycat使用zk自增ID
8、继续这个类,handle方法,会操作zk
mycat使用zk自增ID
这里的seqPath根据zk的路径,还有table+seq生成zk的节点,其中table就是在
mycat使用zk自增ID
squenc_conf.properties文件中,截取.MINID之前的字符串,在这里我们之前配置的是ACCOUNT,所以会生成一个ACCOUNT节点,而节点的值val就是配置的ACCOUNT.MINID
mycat使用zk自增ID
seq是:
mycat使用zk自增ID
9、最后会有一个fetchNextPeriod(table)方法,这个方法是用来计算节点的开始值,这里应该是有一个bug的,导致配置的起始值不生效。
在这个方法中的最后几行,计算出下面几个数字,期望值=最大值-最小值,当前值=zk节点上的值,
更新到zk上的值=当前值+期望值+1
以之前配置的值计算,当前值=1;期望值=2000-1=1999
那么更新到zk上的值=1+19999+1=2001,则入库的时候,会以2001为开始的节点入库。不会以1为起始点。ACCOUNT.CURID=0在启动mycat获取节点的时候,没有用处!
mycat使用zk自增ID




create by ryze on 2017/06/13