MyCAT全局种类号,主键ID自拉长配置

1.MyCat中的全局连串号介绍

在促成分库分表的景观下,数据库自增主键已无法保证自增主键的大局唯一。为此,MyCat 提供了全局 sequence,况兼提供了包涵本地配置和数据库配置等多样落到实处况势。

MyCAT全局体系号,mycat全局

在贯彻分库分表的情景下,数据库自增主键已力不胜任确认保障自增主键的大局独一。为此,MyCat 提供了大局sequence,并且提供了含蓄本地配置和数据库配置等二种兑现形式。

地面文件措施

原理:此格局MyCAT将sequence配置到文件中,当使用到sequence中的配置后,MyCAT会更下conf中的sequence_conf.properties文件中sequence当前的值。

譬如:

#default global sequence
GLOBAL.HISIDS=
GLOBAL.MINID=10001
GLOBAL.MAXID=20000
GLOBAL.CURID=10000

内部HISIDS表示使用过的历史分段(日常无例外部要求要能够配置),MINID表示一点都不大ID值,MAXID表示最大ID值,CU昂CoraID表示方今ID值。

应用办法:

在server.xml中布署如下:

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

当中0,表示使用当麻芋果件措施。

测量试验如下:

mysql> create table test(id int,name varchar(20));
Query OK, 0 rows affected (0.13 sec)

mysql> insert into test(id,name) values(next value for MYCATSEQ_GLOBAL,@@hostname);
Query OK, 1 row affected, 1 warning (0.03 sec)

mysql> select * from test;
 ------- -------------- 
| id    | name         |
 ------- -------------- 
| 10001 | mysql-slave2 |
 ------- -------------- 
1 row in set (0.02 sec)

此时,sequence_conf.properties中GLOBAL.CUSportageID值为壹仟1。当然,能够接纳sequence_conf.properties中定义的别样法则,比方:

# self define sequence
COMPANY.HISIDS=
COMPANY.MINID=1001
COMPANY.MAXID=2000
COMPANY.CURID=1000

mysql> insert into test(id,name) values(next value for MYCATSEQ_COMPANY,@@hostname);
Query OK, 1 row affected, 1 warning (0.02 sec)

mysql> select * from test;
 ------- -------------- 
| id    | name         |
 ------- -------------- 
| 10001 | mysql-slave1 |
|  1001 | mysql-slave1 |
 ------- -------------- 
2 rows in set (0.10 sec)

这一个可自定义。

 

数据库格局

原理

在数据库中国建工业总群集团立一张表,存放sequence名称(name),sequence当前值(current_value),步长(increment int类型每便读取多少个sequence,假诺为K)等新闻;

Sequence获取步骤:

1).第一遍选用该sequence时,依据传入的sequence名称,从数据库那张表中读取current_value,和increment到MyCat中,并将数据库中的current_value设置为原current_value值 increment值(实现格局是依靠后续的蕴藏函数)

2).MyCat将读取到current_value increment作为此次要动用的sequence值,下一次使用时,自动加1,当使用increment次后,推行步骤1)一样的操作.
MyCat担负掩护那张表,用到何等sequence,只需求在此张表中插入一条记下就能够。若某次读取的sequence未有用完,系统就停掉了,则这一次读取的sequence剩余值不会再选取。

使用办法:

  1. 配置server.xml文件

    1

1代表行使数据库情势生成sequence

  1. 布署数据库

在中间叁个分片点对应的数据库中创造表和存款和储蓄进度

因本人在schem.xml中datanode的布置音讯如下:

<dataNode name="dn$1-3" dataHost="localhost1" database="db$1-3" />

譬喻说作者在dn第22中学开创,对应的数据库名称叫db2(为何这里会提到到datanode,因为三翻五次的sequence_db_conf.properties文件会选择到),注意,是登陆到数据库中创建,并非在mycat中开创

1> 创建MYCAT_SEQUENCE表

mysql> DROP TABLE IF EXISTS MYCAT_SEQUENCE;
Query OK, 0 rows affected, 1 warning (0.00 sec)

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;
Query OK, 0 rows affected (0.07 sec)

其中: – name sequence名称
         – current_value 当前value
         – increment 增幅! 可清楚为mycat在数据库中叁回读取多少个sequence. 当这一个用完后, 后一次再从数据库中读取.

注意:MYCAT_SEQUENCE必得大写。

2> 插入sequence记录

mysql> INSERT INTO MYCAT_SEQUENCE(name,current_value,increment) VALUES ('mycat', 1, 100);
Query OK, 1 row affected (0.01 sec)

表示插入了多个名叫mycat的sequence,当前值为1,步长为100。

3> 成立存款和储蓄函数。

专心:必得在同几个数据库中创制,在本例中,是db2。一共要创造四个。

– 获取当前sequence的值(再次来到当前值,增量)

    DROP FUNCTION IF EXISTS mycat_seq_currval;
    DELIMITER $
    CREATE FUNCTION mycat_seq_currval(seq_name VARCHAR(50)) RETURNS varchar(64)     CHARSET utf8
    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 ;

– 设置sequence值

    DROP FUNCTION IF EXISTS mycat_seq_setval;
    DELIMITER $
    CREATE FUNCTION mycat_seq_setval(seq_name VARCHAR(50),value INTEGER) RETURNS     varchar(64) CHARSET utf8
    DETERMINISTIC
    BEGIN
    UPDATE MYCAT_SEQUENCE
    SET current_value = value
    WHERE name = seq_name;
    RETURN mycat_seq_currval(seq_name);
    END $
    DELIMITER ;

– 获取下七个sequence值

    DROP FUNCTION IF EXISTS mycat_seq_nextval;
    DELIMITER $
    CREATE FUNCTION mycat_seq_nextval(seq_name VARCHAR(50)) RETURNS varchar(64)     CHARSET utf8
    DETERMINISTIC
    BEGIN
    UPDATE MYCAT_SEQUENCE
    SET current_value = current_value   increment WHERE name = seq_name;
    RETURN mycat_seq_currval(seq_name);
    END $
    DELIMITER ;

到现在,数据库方面包车型大巴预备职业已终结截止。

  1. 在mycat conf目录下的sequence_db_conf.properties文件中加多如下内容:

    MYCAT=dn2

中间,dn2对应的是数据库db2的datanode

留意:MYCAT必需为大写,那些与表的多寡是或不是大写非亲非故,事实上,MYCAT_SEQUENCE中name是还是不是大小写对结果尚未影响。

发端测量试验:

登录mycat客户端

# mysql -h127.0.0.1 -utest -ptest -P8066 -DTESTDB

成立测量试验表

mysql> create table test(id int,name varchar(10));
Query OK, 0 rows affected (0.22 sec)

插入数据

安排的格式如下:

insert into table1(id,name) values(next value for MYCATSEQ_GLOBAL,'test');

mysql> mysql> insert into test(id,name) values(next value for MYCATSEQ_MYCAT,'test1');
ERROR 1003 (HY000): mycat sequnce err.org.opencloudb.config.util.ConfigException: can't find definition for sequence :MYCAT
mysql> insert into test(id,name) values(next value for MYCATSEQ_MYCAT,'test1');
Query OK, 1 row affected (0.11 sec)

mysql> select * from test;
 ------ ------- 
| id   | name  |
 ------ ------- 
|  101 | test1 |
 ------ ------- 
1 row in set (0.09 sec)

先是次会报如下错误:

ERROR 1003 (HY000): mycat sequnce err.org.opencloudb.config.util.ConfigException: can't find definition for sequence :MYCAT

因为对于sequence_db_conf.properties的修改当前的mycat并不知情,那时候,可重启mycat或然登陆9066管理端口进行 reload @@config;

迄今结束,测量试验甘休,关键还是两点:MYCAT_SEQUENCE必需大写,sequence_db_conf.properties文件中MYCAT=dn2必需大写。

 

 

宋德福

在贯彻分库分表的情状下,数据库自增主键已无能为力确定保障自增主键的全局独一。为此,MyCat 提供了大局sequence,并且...

  在促成分库分表的情状下,数据库自增主键已力不胜任担保自增主键的大局独一。为此,MyCat 提供了全局sequence,并且提供了含有本地配置和数据库配置等三种落实形式,完成格局根本有两种:地面文件格局数据库格局本地时间戳算法。

2.数据库方式

原理:在数据库中确立一张表,存放 sequence 名称(name),sequence 当前值(current_value),步长(increment int 类型每回读取多少个sequence,如果为 K)等新闻;

获得步骤:

当第一应用该 sequence 时,依据传入的 sequence 名称,从数据库这张表中读取 current_value,和 increment 到 MyCat 中,并将数据库中的 current_value 设置为原 current_value 值 increment 值; .

MyCat 将读取到 current_value increment 作为这次要选用的 sequence 值,后一次使用时,自动加 1,当 使用 increment 次后,施行步骤 1)一样的操作. MyCat 肩负维护那张表,用到什么样 sequence,只供给在这里张表中插入一条记下即可。若某次读取的 sequence 未有用完,系统就停掉了,则本次读取的 sequence 剩余值不会再采取。

  一、本半夏件格局

3.安插数据库格局

<3.1> 修改Mycat配置文件server.xml

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

1意味选拔数据库格局生成sequence

<3.2> 修改Mycat配置文件schema.xml

<table name="test" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2,dn3" rule="mod-long"/>
<table name="mycat_sequence" primaryKey="name" dataNode="dn2"/>

<3.3> 修改Mycat 配置文件 sequence_db_conf.properties,添加MYCAT=dn2

#sequence stored in datanode
GLOBAL=dn1
COMPANY=dn1
CUSTOMER=dn1
ORDERS=dn1
MYCAT=dn2

<3.4> 在dn2节点的 db2 数据库中增加 MYCAT_SEQUENCE表

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;

<3.5> 在dn2节点的 db2 数据库中的 MYCAT_SEQUENCE 表插入sequence初阶记录

INSERT INTO MYCAT_SEQUENCE(name,current_value,increment) VALUES ('mycat', -99, 100);

意味着插入了三个名称叫mycat的sequence,当前值为-99,步长为100。

<3.6> 在dn2节点的 db2 数据库中创建存款和储蓄进度

(3.6.1) 获取当前sequence的值:

DROP FUNCTION IF EXISTS mycat_seq_currval;
DELIMITER $
CREATE FUNCTION mycat_seq_currval(seq_name VARCHAR(50)) RETURNS varchar(64)     CHARSET utf8
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 ;

  (3.6.2) 设置sequence值:

DROP FUNCTION IF EXISTS mycat_seq_setval;
DELIMITER $
CREATE FUNCTION mycat_seq_setval(seq_name VARCHAR(50),value INTEGER) RETURNS     varchar(64) CHARSET utf8
DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = value
WHERE name = seq_name;
RETURN mycat_seq_currval(seq_name);
END $
DELIMITER ;

  (3.6.3) 获取下三个sequence值:

DROP FUNCTION IF EXISTS mycat_seq_nextval;
DELIMITER $
CREATE FUNCTION mycat_seq_nextval(seq_name VARCHAR(50)) RETURNS varchar(64)     CHARSET utf8
DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = current_value   increment WHERE name = seq_name;
RETURN mycat_seq_currval(seq_name);
END $
DELIMITER ;

获得全局id的布置已经计划实现。

    原理:此措施MyCAT将sequence配置到文件中,当使用到sequence中的配置后,MyCAT会更下conf中的sequence_conf.properties文件中sequence当前的值。

4.测验获取全局自增ID

(4.1) 向dn1,dn2,dn3 中的db1,db2,db3 分别增加测量试验表 test

create table test(id int,name varchar(10));

(4.2) 重启mycat ,使用WorkBench链接mycat

SELECT * FROM db2.mycat_sequence;

图片 1

那是Mycat重启从前的的 mycat_sequence起头化数据

图片 2

那室mycat 重启之后的  mycat_sequence 数据

(4.3) 向test表中加多测验数据,数十次试行以下语句,这里小编实施了9次增添数据

insert into test(id,name) values(next value for MYCATSEQ_MYCAT,(select database()));

(4.4) 查询增加的多寡

SELECT * FROM test order by id asc;

图片 3

全局自增id生成成功,同临时间数据被水平切分到 3个分片上

(4.5) 再一次重启mycat,推行(4.3)步骤,增加数拾壹遍数码,之后查看 mycat_sequence 数据

图片 4

察觉在上次的根底上平添了100

重启后的id重101方始计数

图片 5

 

    譬如:    

?

1
2
3
4
5
6
7
#default global sequence
 
GLOBAL.HISIDS=
GLOBAL.MINID=10001
GLOBAL.MAXID=20000
GLOBAL.CURID=10000
#其中HISIDS表示使用过的历史分段(一般无特殊需要可不配置),MINID表示最小ID值,MAXID表示最大ID值,CURID表示当前ID值。

   使用方法:

   1、配置MyCat的Server.xml

?

1
2
3
4
# 其中0,表示使用本地文件方式。
<system>
    <property name="sequnceHandlerType">0</property>
</system>

   2、配置sequence_conf.properties  

?

1
2
3
4
5
6
7
$ vim mycat/conf/sequence_conf.properties
#default global sequence
 
GLOBAL.HISIDS=
GLOBAL.MINID=10001
GLOBAL.MAXID=20000
GLOBAL.CURID=10000

    设置实现之后重启MyCat

  3、测试 

?

1
2
3
4
5
mysql> create table test(id int,name varchar(20));
 
mysql> insert into test(id,name) values(next value for MYCATSEQ_GLOBAL,@@hostname);
 
mysql> select * from test;

    

?

1
2
3
4
5
6
7
8
9
10
11
#此时,sequence_conf.properties中GLOBAL.CURID值为10001。当然,可以使用sequence_conf.properties中定义的任何规则,譬如:
# self define sequence
 
COMPANY.HISIDS=
COMPANY.MINID=1001
COMPANY.MAXID=2000
COMPANY.CURID=1000
 
# COMPANY 就是要使用自增的配置,在这里也可以使用其他的名字,但必须是大写的;定义以后可以在全局使用。
 
#可以使用 mysql>select next value for MYCATSEQ_xxx(自定义的名字); 来查看下一个自增ID。

  二、数据库情势   

    原理:在数据库中国建工总集团立一张表,贮存sequence名称(name),sequence当前值(current_value),步长(increment int类型每一次读取几个sequence,倘使为K)等消息;   

?

1
2
3
4
5
Sequence获取步骤:
  1).第一次使用该sequence时,根据传入的sequence名称,从数据库这张表中读取current_value,和increment到MyCat中,并将数据库中的current_value设置为原current_value值 increment值(实现方式是基于后续的存储函数)
 
  2).MyCat将读取到current_value increment作为本次要使用的sequence值,下次使用时,自动加1,当使用increment次后,执行步骤1)相同的操作. 
       MyCat负责维护这张表,用到哪些sequence,只需要在这张表中插入一条记录即可。若某次读取的sequence没有用完,系统就停掉了,则这次读取的sequence剩余值不会再使用。   

  

    使用方法:

   1、配置Server.xml

?

1
2
3
4
# 其中1,表示使用数据库方式。
<system>
    <property name="sequnceHandlerType">1</property>
</system>

   2、在其间贰个分片点对应的数据库中创造表和积攒进程

      因本身在schema.xml 中配备的是: <dataNode name="dn$1-4" dataHost="localhost1" database="db$1-4" />

*       *比方小编在dn第22中学创立,对应的数据库名叫db2(为何这里会涉及到datanode,因为三番两次的sequence_db_conf.properties文件会采纳到),

      瞩目,是登陆到数据库中开创,

      并非在mycat中成立。   

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
--  创建MYCAT_SEQUENCE表<br>CREATE TABLE MYCAT_SEQUENCE (
`name` VARCHAR(50) NOT NULL,
current_value INT NOT NULL,
increment INT NOT NULL DEFAULT 1,
remark varchar(100),  -- remark 并不是必须的,在这里我是为了让每一个表都对应一个全局的自增,在Remark中配置自增项对应的表名。方便后期维护
PRIMARY KEY(name)) ENGINE=InnoDB;
<br>-- – 获取当前sequence的值(返回当前值,增量)
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 ;
 
-- 设置sequence值
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 ;
-- 获取下一个sequence值
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 ; 

      在表MYCAT_SEQUENCE中,其中:

       – name sequence名称
             – current_value 当前value
             – increment增幅! 可通晓为mycat在数据库中三回读取多少个sequence. 当那个用完后, 下一次再从数据库中读取.

        注意:MYCAT_SEQUENCE必需大写。

       创制存款和储蓄函数:

        注意:必得在同一个数据库中成立,在本例中,是db2。一共要成立三个。

        – 获取当前sequence的值(重返当前值,增量)

    3、  插入sequence记录

?

1
2
3
4
5
-- 插入sequence记录
INSERT INTO MYCAT_SEQUENCE(name,current_value,increment,remark) VALUES ('DICT', 1, 100,'match:tb_dic');
 
INSERT INTO MYCAT_SEQUENCE(name,current_value,increment,remark) VALUES ('GLOBAL', 1, 100,'GLOBAL');
-- 代表插入了一个名为mycat的sequence,当前值为1,步长为100。

?

1
2
3
4
5
6
7
mysql> select * from mycat_sequence;
---------------- --------------- ----------- --------------------------------
| name           | current_value | increment | remark                         |
---------------- --------------- ----------- --------------------------------
| DICT           |             1 |       100 | match:tb_dic                   |
| GLOBAL         |           200 |       100 | GLOBAL                         |
---------------- --------------- ----------- --------------------------------

  

    至此,数据库方面包车型客车备选职业已了结截至。

  4、设置 sequence_db_conf.properties

     在mycat conf目录下的sequence_db_conf.properties文件中增加如下内容:DICT=dn3 dn3:表示小编把表和函数都建在了dn3节点上

     注意:DICT必须为大写,那几个与表的数据是还是不是大写无关,事实上,MYCAT_SEQUENCE中name是还是不是大小写对结果尚未影响。

       重启MyCat  

  5、开首测验

    

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ mysql -h127.0.0.1 -utest -ptest -P8066 -DTESTDB
mysql>
create table tb_dic
(
   id                   int not null auto_increment,
   dic_name             varchar(100) not null comment '字典名称',
   dic_value            varchar(20) not null comment '字典值',
   dic_type             int not null comment '字典类型: 如果是类型,如支付方式等',
   primary key (id)
);
# 然后插入值
mysql>  INSERT into tb_dic(id,dic_name,dic_value,dic_type) VALUES(next value for MYCATSEQ_DICT,'支付方式','1',0);
----- -------------- ----------- ----------
| id  | dic_name     | dic_value | dic_type |
----- -------------- ----------- ----------
| 101 | 活动形式      | 2         |        0 |
| 102 | 表单类型      | 2         |        0 |
----- -------------- ----------- ----------

    错误处理: 

?

1
ERROR 1003 (HY000): mycat sequnce err.org.opencloudb.config.util.ConfigException: can't find definition for sequence :DICT

    因为对此sequence_db_conf.properties的改变当前的mycat并不领会,那时候,可重启mycat或许登入9066管制端口进行 reload @@config;

    至此,测量检验结束,关键依然两点:MYCAT_SEQUENCE必得大写,sequence_db_conf.properties文件中DICT=dn3必需大写。

 

  三、本地时间戳算法

    待续。。。

    

  

本文由星彩网app下载发布于星彩彩票app下载,转载请注明出处:MyCAT全局种类号,主键ID自拉长配置

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。