MyCat-10之centos7上mycat全局序列的用法

一、目標

什麼叫全局序列?前面學習過了mycat的分片分表,比如一張表被切分爲兩份或多份並放到不同的物理服務器上,我們知道一張表通暢情況下都有主鍵,這個主鍵是自動增長的,而且主鍵有唯一性。那萬一一張表出現兩個相同的主鍵怎麼辦?那豈不是亂套了嗎?哎嘿,這個時候,全局序列就出來了,他能解決這個問題。

全局序列是解決主鍵重複問題的方法之一,還可以使用程序自己生成唯一id,使用時間戳生成唯一id等等方法,但聽說貌似只有全局序列的優勢更大,因爲全局序列是需要在mysql上建一個序列表,這樣它就能與我們的應用程序實線解耦。

二、前言

全局序列是需要建在某個節點服務器的mysql的數據庫裏(mycat的物理庫),我們本次打算將全局序列表建在node1的xkahn數據庫裏。(囉嗦:本系列的mycat帖子使用的ip均爲31、32。由於特殊原因ip的前三位我經常變,無需理會)

我們之前的架構再拿出來
主機名        ip                          所裝必須的軟件                                             角色
mycat31     192.168.73.31      java1.8及以上,mycat1.6.7.5,mysql5.7      mycat服務器、node1
mycat32     192.168.73.32      mysql5.7                                                        node2
 

三、建立mycat全局序列(以下需要在mycat31上執行)

1.在node1服務器,即mycat31上登錄mysql,並使用mycat試驗用到的物理數據庫xkahn

mysql -uroot -p123123
use xkahn;

2.在dn1(mycat31的mysql裏)上創建全局序列表

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;

 

3.在dn1(mycat31的mysql裏)創建全局序列所需的函數(不是十分了解的話,不要修改裏面的內容)

DELIMITER $$
CREATE FUNCTION mycat_seq_currval(seq_name VARCHAR(50)) RETURNS VARCHAR(64) 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 ;

 

4.在dn1(mycat31的mysql裏)繼續創建全局序列所需的函數(不是十分了解的話,不要修改裏面的內容)

DELIMITER $$
CREATE FUNCTION mycat_seq_setval(seq_name VARCHAR(50),VALUE INTEGER) RETURNS VARCHAR(64)
DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE SET current_value = VALUE WHERE NAME = seq_name;
RETURN mycat_seq_currval(seq_name);
END $$
DELIMITER ;

 

5.在dn1(mycat31的mysql裏)繼續創建全局序列所需的函數(不是十分了解的話,不要修改裏面的內容)

DELIMITER $$
CREATE FUNCTION mycat_seq_nextval(seq_name VARCHAR(50)) RETURNS VARCHAR(64)
DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = current_value + increment WHERE NAME = seq_name;
RETURN mycat_seq_currval(seq_name);
END $$
DELIMITER ;

 

6.在dn1(mycat31的mysql裏)插入初始化數據

INSERT INTO MYCAT_SEQUENCE(NAME,current_value,increment) VALUES ('student',400000,100);

 注意:這裏的student可以根據自己的情況去更改,感覺僅僅是個代稱而已。但這個值非常有用,寫好了就記住它,它student必須和下面的STUDENT保持一致,只不過第七條必須大寫。

註釋:序列號從400000開始,每次從全局序列庫裏調出100個號碼,用完了繼續再調100個。那麼但當mycat重啓的話,之前被調用的那100個即使沒用完,下次也不會再用了,而是重新開下一輪的100個序列號。

7.修改配置文件vim /usr/local/mycat/conf/sequence_db_conf.properties,

echo "STUDENT=dn1" >> /usr/local/mycat/conf/sequence_db_conf.properties

註釋:STUDENT=dn1,這個值dn1應當在schema.xml中存在。STUDENT必須大寫。它同時必須和第6條中的小寫的student保持一致,只不過第6條的student是小寫。

8.修改配置文件:vim /usr/local/mycat/conf/server.xml

將<property name="sequenceHandlerType">1</property>的值改爲1。
註釋:0爲本地模式,1爲數據庫模式,2爲時間戳模式。

四、測試

1.在mycat31上啓動mycat程序 

cd /usr/local/mycat/bin
./mycat console

2-1.再新開一個mycat31的終端,以登錄mycat的數據管理平臺

mysql -umycat -p123456 -h 10.100.100.31 -P 8066
use TESTDB;

2-2.囉嗦:回顧一下student表結構(在mycat31的mysql模式下看xkahn數據的student的表結構)
DESc student;

select * from student;

2-3.再回到mycat的數據管理平臺在student表裏插入數據

insert into student(xid,name) values (next value for MYCATSEQ_STUDENT,'ledi');
insert into student(xid,name) values (next value for MYCATSEQ_STUDENT,'kufei');
insert into student(xid,name) values (next value for MYCATSEQ_STUDENT,'fanbingbing');
insert into student(xid,name) values (next value for MYCATSEQ_STUDENT,'jiajingwen');
insert into student(xid,name) values (next value for MYCATSEQ_STUDENT,'liqin');
insert into student(xid,name) values (next value for MYCATSEQ_STUDENT,'dilireba');

這裏就可以看到主鍵id的數字就變成了從400100開始了,感覺應該是從400000開始,可能是因爲第一次做測試的時候失敗了,所以用掉了100個。然後我又重啓了mycat,所以它又重新調取100個序列號。所以看到的400開頭的是400100。

這個全局序列我又做了個蛋疼的測試,就是實驗做到現在,我往其他表裏插入了幾條數據(使用了全局序列的id值),結果發現是能使用的,而再往student裏插入數據時,自然的被用到其他地方的序列號就沒了,但它仍然會自增加(缺少那幾個被用到其他表的序列值而已)

-----------------END-------------------2020年3月28日21:20:07---------------------------------------------

老鐵雙擊666 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章