1. 程式人生 > >mycat使用zk自增ID

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和IDzkURL=192.168.0.65:2181 #zk伺服器的地址和埠clusterId=mycat-cluster-1  #本機房mycat叢集的ID
myid=mycat_fz_01 #叢集內mycat的IDclusterNodes=mycat_fz_01 #mycat節點的名稱3、修改sequence_distributed_conf.properties檔案INSTANCEID=ZK #代表使用zkCLUSTERID=mycat-cluster-1 #與myid.properties中的CLUSTERID設定的值相同4、配置需要使用自增ID的sequence,修改sequence_conf.properties檔案增加一段自己的配置# self define sequenceACCOUNT.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.java2、裡面有這麼一段程式碼,首先就會載入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