mycat使用zk自增ID

1 篇文章 0 订阅

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,下面会解释)



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


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


3、跳入这个方法查看,当loadZk设置成true时,会加载ZK

4、初始化ZK时,会根据myid.properties文件中的配置,加载关于zk的信息, 具体还未研究



二、修改server.xml文件中的, <property name="sequnceHandlerType">4</property>
1、继续查看源码,此处会初始化MycatServer类

2、通过单例模式,得到mycatserver实例,首先会读取配置文件,通过MycatConfig这个类去操作

3、 MycatConfig类主要是获取配置文件的内容,根据配置文件内容处理不同步骤是在ConfigInitializer类

4、ConfigInitializer类的构造函数

5、具体读取到server.xml文件的类是XMLServerLoader.java

6、 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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值