mycat學習日記:全局sequence

  mycat分庫分表的狀況下,原生mysql的自增加主鍵沒法知足主鍵全局惟一這個要求。看了MYCAT社區從零開始的一篇博客,加上本身的實踐,大概總結一下。html

  目前mycat對於全局sequence主要提供2種方法,本地文件方式和數據庫方式。node

 

  1.本地文件:mysql

  本地文件的方式配置很簡單,只須要修改2個文件便可。首先在conf下的servel.xml中添加:  sql

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

  而後再sequence_conf.properties中配置:數據庫

  TEST.HISIDS=
   TEST.MINID=1001
   TEST.MAXID=200000
   TEST.CURID=1000

  注:TEST爲自定義的名稱,建議根據各個表的表名進行命名,好比TEST就爲tab_test表的主鍵seq。函數

  MINID爲最小seq,MAXID爲最大seq,CURID爲目前seq的值。測試

  保存退出,經過 select next value for MYCAT_TEST便可測試是否成功。spa

 

  2.數據庫方式:server

   仍是首先配置server.xml  xml

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

  而後選擇一個數據庫,我這裏選擇的是本機mysql中的db1,對應的dataNode是dn1。登錄mysql(非mycat),執行腳本:

  

DROP TABLE IF EXISTS 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;
-- ----------------------------
-- Function structure for `mycat_seq_currval`
-- ----------------------------
DROP FUNCTION IF EXISTS `mycat_seq_currval`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_currval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET latin1
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 ;
-- ----------------------------
-- Function structure for `mycat_seq_nextval`
-- ----------------------------
DROP FUNCTION IF EXISTS `mycat_seq_nextval`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_nextval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET latin1
DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = current_value + increment WHERE name = seq_name;
RETURN mycat_seq_currval(seq_name);
END
;;
DELIMITER ;
-- ----------------------------
-- Function structure for `mycat_seq_setval`
-- ----------------------------
DROP FUNCTION IF EXISTS `mycat_seq_setval`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_setval`(seq_name VARCHAR(50), value INTEGER) RETURNS varchar(64) CHARSET latin1
DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = value
WHERE name = seq_name;
RETURN mycat_seq_currval(seq_name);
END
;;
DELIMITER ;
INSERT INTO MYCAT_SEQUENCE VALUES ('GLOBAL', 0, 100);
SELECT MYCAT_SEQ_SETVAL('GLOBAL', 1);
SELECT MYCAT_SEQ_CURRVAL('GLOBAL');
SELECT MYCAT_SEQ_NEXTVAL('GLOBAL'); 
4.插入序列數據:
INSERT INTO MYCAT_SEQUENCE VALUES ('GLOBAL', 0, 100); 
INSERT INTO MYCAT_SEQUENCE VALUES ('GLOBAL', 0, 100); 

  這裏我貼上博主從零開始的解釋:

    

  說明:

  • 在某個分區(dataNode)數據庫上建立序列號相關的表格和函數,SQL腳本在doc目錄下的sequnce-sql.txt中,須要在數據庫上而非Mycat上執行。
  • Mycat_home/conf/quence_db_conf.properties 中記錄了sequnce所存放的db對應的配置信息。
  #sequence stored in datanode
  GLOBAL=dn1
  COMPANY=dn1
  CUSTOMER=dn1
  • 在sequnce表中,插入相應的sequnce記錄,並肯定其初始值,以及增加步長,步長建議一個合適的範圍,好比50-500,須要在數據庫上而非Mycat上執行。
  INSERT INTO MYCAT_SEQUENCE VALUES ('GLOBAL', 0, 100);
  • 修改sequnce的當前值爲某個新值,須要在數據庫上而非Mycat上執行。
  SELECT mycat_seq_curval('GLOBAL');

  提示:步長選擇多大,取決與你數據插入的TPS,假如是每秒1000個,則步長爲1000×60=6萬,也不是很大,即60秒會從新從數據庫讀取下一批次的序列號值。

   最後,修改mycat配置文件sequence_db_conf.properties

    GLOBAL=dn1

    TEST=dn1

   經過 select 10040能夠進行測試。

相關文章
相關標籤/搜索