欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-08 19:42:07
...

一、目标

什么叫全局序列?前面学习过了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;

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

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 ;

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

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 ;

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

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 ;

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

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个***。
MyCat-10之centos7上mycat全局序列的用法

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是小写。
MyCat-10之centos7上mycat全局序列的用法

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

将<property name="sequenceHandlerType">1</property>的值改为1。
注释:0为本地模式,1为数据库模式,2为时间戳模式。
MyCat-10之centos7上mycat全局序列的用法

四、测试

1.在mycat31上启动mycat程序 

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

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

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;
MyCat-10之centos7上mycat全局序列的用法
select * from student;
MyCat-10之centos7上mycat全局序列的用法

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');

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

这里就可以看到主键id的数字就变成了从400100开始了,感觉应该是从400000开始,可能是因为第一次做测试的时候失败了,所以用掉了100个。然后我又重启了mycat,所以它又重新调取100个***。所以看到的400开头的是400100。

这个全局序列我又做了个蛋疼的测试,就是实验做到现在,我往其他表里插入了几条数据(使用了全局序列的id值),结果发现是能使用的,而再往student里插入数据时,自然的被用到其他地方的***就没了,但它仍然会自增加(缺少那几个被用到其他表的序列值而已)

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

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

老铁双击666 

相关标签: Mycat