1. 程式人生 > 其它 >MyCat配置檔案詳解--sequence配置

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記錄。