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




zookeeper acl 权限修改 zookeeper设置myid_properties文件





6、测试是否有效


ACCOUNT);


注:这里的ACCOUNT一定要与sequence_conf.properties中配置的一样




以下是个人研究,可能会有错误。


一、首先查看myid.properties文件,各个配置项的用户


1,看源码,找到启动mycat的类MycatStartup.java


不太理解zookeeper,所以这个方法没有细究)



zookeeper acl 权限修改 zookeeper设置myid_加载_02




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



zookeeper acl 权限修改 zookeeper设置myid_配置文件_03



具体还未研究



zookeeper acl 权限修改 zookeeper设置myid_加载_04





<property name="sequnceHandlerType">4</property>


1、继续查看源码,此处会初始化MycatServer类



zookeeper acl 权限修改 zookeeper设置myid_配置文件_05



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



zookeeper acl 权限修改 zookeeper设置myid_加载_06



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



zookeeper acl 权限修改 zookeeper设置myid_properties文件_07



4、ConfigInitializer类的构造函数



zookeeper acl 权限修改 zookeeper设置myid_加载_08



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



zookeeper acl 权限修改 zookeeper设置myid_properties文件_09



ConfigInitializer类会根据读取到配置,做相应的操作



zookeeper acl 权限修改 zookeeper设置myid_zookeeper acl 权限修改_10





zookeeper acl 权限修改 zookeeper设置myid_properties文件_11



7、IncrSequenceZKHandler这个类会加载zk的sequence



zookeeper acl 权限修改 zookeeper设置myid_配置文件_12





zookeeper acl 权限修改 zookeeper设置myid_zookeeper acl 权限修改_13



8、继续这个类,handle方法,会操作zk



zookeeper acl 权限修改 zookeeper设置myid_properties文件_14



这里的seqPath根据zk的路径,还有table+seq生成zk的节点,其中table就是在



zookeeper acl 权限修改 zookeeper设置myid_配置文件_15



squenc_conf.properties文件中,截取.MINID之前的字符串,在这里我们之前配置的是ACCOUNT,所以会生成一个ACCOUNT节点,而节点的值val就是配置的ACCOUNT.MINID



zookeeper acl 权限修改 zookeeper设置myid_配置文件_16



seq是:



zookeeper acl 权限修改 zookeeper设置myid_properties文件_17



9、最后会有一个fetchNextPeriod(table)方法,这个方法是用来计算节点的开始值,这里应该是有一个 bug 的,导致配置的起始值不生效。


在这个方法中的最后几行,计算出下面几个数字,期望值=最大值-最小值,当前值=zk节点上的值,


更新到zk上的值=当前值+期望值+1


以之前配置的值计算,当前值=1;期望值=2000-1=1999


那么更新到zk上的值=1+19999+1=2001,则入库的时候,会以2001为开始的节点入库。不会以1为起始点。ACCOUNT.CURID=0在启动mycat获取节点的时候,没有用处!



zookeeper acl 权限修改 zookeeper设置myid_加载_18







create by ryze on 2017/06/13