08、Mycat实战: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;

1的值改为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

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: