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>
myid.properties文件:
#使用zk管理mycat和ID
#zk服务器的地址和端口
#本机房mycat集群的ID
#集群内mycat的ID
#mycat节点的名称
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,下面会解释)
6、测试是否有效
ACCOUNT);
注:这里的ACCOUNT一定要与sequence_conf.properties中配置的一样
以下是个人研究,可能会有错误。
一、首先查看myid.properties文件,各个配置项的用户
1,看源码,找到启动mycat的类MycatStartup.java
不太理解zookeeper,所以这个方法没有细究)
3、跳入这个方法查看,当loadZk设置成true时,会加载ZK
具体还未研究
<property name="sequnceHandlerType">4</property>
1、继续查看源码,此处会初始化MycatServer类
2、通过单例模式,得到mycatserver实例,首先会读取配置文件,通过MycatConfig这个类去操作
MycatConfig类主要是获取配置文件的内容,根据配置文件内容处理不同步骤是在ConfigInitializer类
4、ConfigInitializer类的构造函数
5、具体读取到server.xml文件的类是XMLServerLoader.java
ConfigInitializer类会根据读取到配置,做相应的操作
7、IncrSequenceZKHandler这个类会加载zk的sequence
8、继续这个类,handle方法,会操作zk
这里的seqPath根据zk的路径,还有table+seq生成zk的节点,其中table就是在
squenc_conf.properties文件中,截取.MINID之前的字符串,在这里我们之前配置的是ACCOUNT,所以会生成一个ACCOUNT节点,而节点的值val就是配置的ACCOUNT.MINID
seq是:
9、最后会有一个fetchNextPeriod(table)方法,这个方法是用来计算节点的开始值,这里应该是有一个 bug 的,导致配置的起始值不生效。
在这个方法中的最后几行,计算出下面几个数字,期望值=最大值-最小值,当前值=zk节点上的值,
更新到zk上的值=当前值+期望值+1
以之前配置的值计算,当前值=1;期望值=2000-1=1999
那么更新到zk上的值=1+19999+1=2001,则入库的时候,会以2001为开始的节点入库。不会以1为起始点。ACCOUNT.CURID=0在启动mycat获取节点的时候,没有用处!
create by ryze on 2017/06/13