一、目標
什麼叫全局序列?前面學習過了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