linux mycat全局序列

15 篇文章 0 订阅
4 篇文章 0 订阅

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

1.本地文件

此方式 Mycat 将 sequence 配置到文件中,当使用到 sequence 中的配置后,Mycat 会更下 classpath 中的  sequence_conf.properties 文件中 sequence 当前的值。
   优点:本地加载,读取速度较快
   缺点:抗风险能力差,Mycat 所在主机宕机后,无法读取本地文件。

2、 数据库方式

利用数据库一个表 来进行计数累加。但是并不是每次生成序列都读写数据库,这样效率太低。Mycat 会预加载一部分号段到 Mycat 的内存中,这样大部分读写序列都是在内存中完成的。如果内存中的号段用完了 Mycat 会再向数据库要一次。


问:那如果 Mycat 崩溃了 ,那内存中的序列岂不是都没了?
     是的。如果是这样,那么 Mycat 启动后会向数据库申请新的号段,原有号段会弃用。也就是说如果 Mycat 重启,那么损失是当前的  号段没用完的号码,但是不会因此出现主键重复

① 建库序列脚本

在 dn1 上创建全局序列表
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;


#创建全局序列所需函数
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 ;




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 ;



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 ; #初始化序列表记录
INSERT INTO MYCAT_SEQUENCE(NAME,current_value,increment) VALUES ('ORDERS', 400000,
100);

② 修改 Mycat 配置

#修改sequence_db_conf.properties 
vim /usr/local/mycat/conf/sequence_db_conf.properties 

在这里插入图片描述

#修改server.xml 全局序列类型:0-本地文件,1-数据库方式,2-时间戳方式。此处应该修改成1。

 vim /usr/local/mycat/conf/server.xml

在这里插入图片描述

#重启Mycat

#登录 Mycat,插入数据
insert into orders(id,amount,customer_id,order_type) values(next value for 
MYCATSEQ_ORDERS,1000,101,102);

3.时间戳方式

全局序列ID= 64 位二进制 (42(毫秒)+5(机器 ID)+5(业务编码)+12(重复累加) 换算成十进制为 18 位数的long 类型,每毫秒可以并发 12 位二进制的累加。


  优点:配置简单
  缺点:18 位 ID 过长

4 自主生成全局序列


可在 java 项目里自己生成全局序列,如下:
   1. 根据业务逻辑组合
   2. 可以利用 redis 的单线程原子性 incr 来生成序列
但,自主生成需要单独在工程中用 java 代码实现,还是推荐使用 Mycat 自带全局序列。```



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值