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

Mycat之 主键ID自增长配置

程序员文章站 2022-05-08 23:09:32
...

一.前言

在实现分库分表的情况下,数据库自增主键已无法保证自增主键的全局唯一。为此, MyCat 提供了全局sequence,并且提供了包含本地配置和数据库配置等多种实现方式。

二.全局序列的三种方式

1.本地文件
  • 缺点
    在mycat重启后,配置文件中sequence会恢复到初始值,造成下次操作序列重复
  • 优点
    本地加载,读取速度较快
2. 数据库
  • 优点
    在mycat重启后,sequence值不会被初始化
  • 缺点
    如果存取sequence的数据库挂了,会遇到单点故障
3. 时间
  • 优点
    不存在上面两种方案因为mycat的重启导致id重复的现象
  • 缺点
    数据类型太长,建议采用bigint(最大取值18446744073709551615)
4. zookeeper

zookeeper自身解决单点和序列问题,建议采用

三. 实例分析

1.创建表

先在配置文件schema.xml 下增加 table,配置其主键自增

<table name="User" dataNode="dn1,dn2,dn3" primaryKey="id" autoIncrement="true" rule="auto-sharding-long" />

在mycat下创建表:

create table User(
 id  int(11) NOT NULL AUTO_INCREMENT,
username varchar(100),
password varchar(100),
PRIMARY KEY (id)
);

此时在3个数据库里面已经创建好此表
Mycat之 主键ID自增长配置
此时如果没有进行额外的配置进行添加数据,则会提示

can't find any valid datanode :USER -> ID -> 1134371327843635200

Mycat之 主键ID自增长配置
下面通过不同方式配置,测试其效果

2.使用本地文件方式

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

2.1 配置MyCat的Server.xml
    <property name="sequnceHandlerType">0</property>
2.2、配置sequence_conf.properties

编辑该文件添加以下

USER.HISIDS=
USER.MINID=1001
USER.MAXID=2000
USER.CURID=1000

其中HISIDS表示使用过的历史分段(一般无特殊需要可不配置),MINID表示最小ID值,MAXID表示最大ID值,CURID表示当前ID值。

配置完成后,重启mycat startup_nowrap.bat

此时再次执行插入语句,则发现可以正常插入
Mycat之 主键ID自增长配置
Mycat之 主键ID自增长配置

3.使用数据库方式

原理:在数据库中建立一张表,存放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剩余值不会再使用。

相关标签: mycat