MyCat配置檔案詳解--sequence配置
在實現分庫分表的情況下,資料庫自增主鍵已經無法保證在叢集中是全域性唯一的主鍵了,因此mycat提供了全域性的sequence,並且提供了本地配置、資料庫配置等多種實現方式。
1. 本地檔案方式
採用該方式,mycat將sequence配置到classpath目錄的sequence_conf.properties檔案中,在sequence_conf.properties檔案做如下配置
GLOBAL_SEQ.HISIDS= GLOBAL_SEQ.MINID=1001 GLOBAL_SEQ.MAXID=100000000 GLOBAL_SEQ.CURID=1000
其中HISIDS表示歷史分段(一般無特殊需要則可以不配置),MINID表示最新的ID值,MAXID表示最大的ID值,CURID表示當前的ID值。
需要啟用這種方式,則首先需要在servier.xml中配置如下引數:
<system>
<property name="sequnceHandlerType">0</property>
</system>
注意:sequnceHandlerType配置為0,表示使用本地檔案方式
採用這種方式的優缺點:
- 缺點:mycat重新發布後,配置檔案中的sequence會恢復到初始值
- 優點:本地載入且讀取速度快。
2. 資料庫方式
在資料庫中建立一張表名為sequence的表,有sequence的當前值(current_value)、步長(increment int 型別,指每次讀取多少個sequence,假設值為K)等資訊。
2.1 squence的獲取步驟如下:
1)每次使用sequence時候,根據傳入的sequence名稱,從資料庫表中 讀取current_value、increment到mycat中,並將資料庫中的current_value 修改為current_value + increment的值。
2)mycat將讀取到的current_value+increment 作為本次使用的sequence值,在下次使用的時候,sequence自動加1,當使用increment次後,執行與步驟一相同操作。
3)mycat負責維護這張表,用到哪些sequence時,主需要在這張表插入一條記錄即可,若某次讀取sequence沒有用完就宕機了,則本次已經讀取sequence且未使用的值將會被丟棄。
若要啟用這種方式,需要在server.xml中配置如下引數:
<system> <property name="sequnceHandlerType">1</property> </system>
注意:這裡配置成1,表示使用資料庫方式生成sequence.
2.2 資料庫配置如下:
建立MYCAT_SEQUENCE的表
CREATE TABLE MYCAT_SEQUENCE(name VARCHAR(50) NOT NULL,current_value INT NOT NULL,increment INT NOT NULL DEFAULT 100,PRIMARY KEY(name)) ENGINE=InnoDB;
name、current_value和increment 分別sequence的名稱、當前value的值和增長步長。
插入一條sequence語句:
insert into MYCAT_SEQUENCE(name,current_value,increment) VALUES(‘GLOBAL’,10000,100);
建立相關的function
DROP FUNCTION IF EXISTS mycat_seq_currval; DELIMITER CREATE FUNCTION mycat_seq_currval(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET utf-8 DETERMINISTIC BEGIN DECLARE retval VARCHAR(64); SET retval=“-999999999,null”; SELECT concat(CAST(current_value AS CHAR),“,”,CAST(increment AS CHAR)) INTO retval FROM MYCAT_SEQUENCE WHERE name = seq_name; RETURN retval; END DELIMITER; – 謳置 sequence 值 DROP FUNCTION IF EXISTS mycat_seq_setval; DELIMITER CREATE FUNCTION mycat_seq_setval(seq_name VARCHAR(50),value INTEGER) RETURNS varchar(64) CHARSET utf-8 DETERMINISTIC BEGIN UPDATE MYCAT_SEQUENCE SET current_value = value WHERE name = seq_name; RETURN mycat_seq_currval(seq_name); END DELIMITER; – 獲叏下一個 sequence 值 DROP FUNCTION IF EXISTS mycat_seq_nextval; DELIMITER CREATE FUNCTION mycat_seq_nextval(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET utf-8 DETERMINISTIC BEGIN UPDATE MYCAT_SEQUENCE SET current_value = current_value + increment WHERE name = seq_name; RETURN mycat_seq_currval(seq_name); END DELIMITER;
sequence_db_conf.properties指定 sequence 相關配置在哪個節點上
USER_SEQ=test_dn1
使用示例:
insert into table1(id,name) values(next value for MYCATSEQ_GLOBAL,‘test’);
這樣做雖然MyCat為無狀態而且id有持久化,並且一次可以取出多個id,通過配置可以有主從切換。但是,id還是純數字,沒有有意義的資訊,而且,MyCat主從切換並不可靠,id生成有故障,則整個服務都無法正常進行,這在架構上有單點問題,是不推薦的。
3. 時間戳方式
ID= 64 位二進位制 (42(毫秒)+5(機器 ID)+5(業務編碼)+12(重複累加)
server.xml:
<system> <property name="sequnceHandlerType">2</property> </system>
sequence_time_conf.properties:
WORKID=0-31 任意整數 DATAACENTERID=0-31 任意整數
3. 其他方式
3.1通過catlet註解實現
select mycat_get_seq('GLOBAL',100);
注意:此方法獲取FLOBAL的100個sequence,例如當前最大的GLOBAL是5000,則此方法返回的是5100,同時更新資料庫的最大sequence值為5100,。
3.2 也可以使用zookeeper方式實現
4. 自增長主鍵
4.1 mysql定義自增長主鍵。
create table 1(‘id_’,INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,'name_' INT(10) UNSIGNED NOT NULL ,PARIMARY KEY ('id_'))ENGINE=MYISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf-8;
4.2 mycat 定義自增長主鍵
在table標籤中增加 autoIncrement="true":
<table name="A" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2" rule="mod-long"><table>
4.3 mycat對應的sequence_db_conf.properties新增響應配置。
TABLE1=dn1
4.4 在資料庫的mycat_sequenct 表中新增TABLE1表的sequence記錄。