Mycat 全局系列号(转载)

摘要:
概述本文介绍了在子数据库和子表的情况下,mycat如何保证主键的全局唯一性。接下来,我们将分析这三种方法的优缺点。另一种方法是,当A关闭时,因为mycat在缓存A之前没有重新启动全局序列ID,所以B的当前值是_值增加100。如果此时切换到A,B的值将不会与上一个值冲突,因为它是100100。如果此时开始A修复,此时还应更改A的电流_值增加200,以避免切换到A后与电流值发生冲突。

概述  

本篇文章介绍mycat怎样在分库分表的情况下保证主键的全局唯一方法,接下来就来分析三种方法各自的优缺点。

配置  

文件方式获取

1.修改server配置文件

 vim server.xml

<system><property name="sequnceHandlerType">0</property></system>
注:sequnceHandlerType 配置为0表示使用本地文件读取。

2.配置sequence_conf.properties配置文件

Mycat 全局系列号(转载)第1张

3.在mycat中运行语句测试(在逻辑库中测试)

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

缺点:在 MyCAT 重启后,配置文件中癿 sequence 会恢复到初始值。
优点:本地加载,读取速度较快。

数据库方式获取

1.修改server配置文件

 vim server.xml

<system><property name="sequnceHandlerType">1</property></system>
注:sequnceHandlerType 配置为1表示从数据库表中读取。

2.配置读取的节点,就是配置全局表在哪个节点上面,我这里配置在dn1节点上面。

vim sequence_db_conf.properties

Mycat 全局系列号(转载)第2张

 3.创建全局表和函数

选择mysql物理库的dn1节点上执行下面语句,我配置的dn1即db1数据库

复制代码
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 ;


INSERT INTO MYCAT_SEQUENCE(name,current_value,increment) VALUES ('GLOBAL', 100000, 100);

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 ;

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 ;


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 ;
复制代码

 4.测试插入数据,也是在mycat逻辑库上执行

insert into user(id,name) values(next value for MYCATSEQ_GLOBAL,'中文');


优点:在 MyCAT 重启后,sequence 值不会被初始化,比如当前MYCAT_SEQUENCE的初始值是100000,当mycat的重启之后再执行插入数据后MYCAT_SEQUENCE的初始值就加100变成100100,新插入到表的值也是在加100的基础上开始递增,

缺点:当配置了主从复制时(A主B从),一开始主从上面的MYCAT_SEQUENCE表的current_value初始值是100000;当前配置的读写分离方案是A负责写B负责读当A宕机之后B负责写A变成了读,加入现在的全局ID已经到了 100103,这个时候如果A宕机了,

mycat应该是存在缓存current_value还是记录的是A的值,不会立马切换使用B上的current_value的值,如果这个时候mycat重启了,这个时候全局系列号就开始使用B中的current_value值由于B值也是从100100开始那么这个时候插入全局记录到B中的表中就会和之前生成的100100到100103主键冲突了。不知道这算不算是一个BUG,所以当A宕机之后需要赶紧把A重启好,这样的话就算mycat重启之后还是从A开始读,这个时候全局ID就从100200开始了。

还有一种方法是当A宕机之后由于mycat还没有重启全局序列的ID还是缓存之前A的,这个时候把B的current_value增加100,这个时候如果切换到了A由于B的值是从100100开始不会和之前的冲突,如果这个时候A修复启动了这个时候也要把A的current_value增加200避免切换到A之后又和现在的值冲突。

本地时间戳方式获取

1.修改server配置文件

 vim server.xml

<system><property name="sequnceHandlerType">2</property></system>
注:sequnceHandlerType 配置为2表示时间戳方式。

2.测试插入数据,也是在mycat逻辑库上执行,注意时间戳的长度有18位,保证表的字段长度足够

insert into user(id,name) values(next value for MYCATSEQ_GLOBAL,'中文');

优点:不存在上面两种方案因为mycat的重启导致id重复的现象

缺点:数据类型太长

总结

 三种方式各有优缺点,根据自己的需求选择。

转载自:https://www.cnblogs.com/chenmh/p/5142943.html

免责声明:文章转载自《Mycat 全局系列号(转载)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇TCP协议粘包问题详解css 文本超出以省略号显示 与 文本换行下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

分布式数据库中间件 MyCat | 分库分表实践

MyCat 简介 MyCat 是一个功能强大的分布式数据库中间件,是一个实现了 MySQL 协议的 Server,前端人员可以把它看做是一个数据库代理中间件,用 MySQL 客户端工具和命令行访问;而后端人员可以用 MySQL 原生协议与多个 MySQL 服务器通信,也可以用 JDBC 协议与大多数主流数据库服务器通信。可以用作 读写分离、分库分表(分片)...

使用zookeeper管理远程MyCat配置文件、MyCat监控、MyCat数据迁移(扩容)

一、使用zookeeper管理远程Mycat配置文件 环境准备: 虚拟机192.168.152.130: zookeeper,具体参考前面文章 搭建dubbo+zookeeper+dubboadmin分布式服务框架(windows平台下) 虚拟机192.168.152.128: 安装好Mycat,具体参考前面文章数据库分库分表中间件mycat的安装和myc...

mycat 1.6.6.1安装以及配置docker 安装mysql 5.7.24 双主多从读写分离主主切换

mycat和mysql的高可用参考如下两个图    简介:应用程序仅需要连接HAproxy或者mycat,后端服务器的读写分离由mycat进行控制,后端服务器数据的同步由MySQL主从同步进行控制。 服务器主机规划 IP  功能 备注 192.168.0.200 Mysql Master1 Mysql Master1端口3306 192....

MyCAT-管理端常用命令

http://www.yoyoask.com/?p=770 默认管理端口9066 reload命令 #重新加载配置文件,在修改完配置文件之后,不用重启mycat,可以使用如下命令重新加载: reload @@config; 开启SQL监控分析功能: reload @@sqlstat=open. 关闭SQL监控分析功能: reload @@sql...

多租户实现之基于Mybatis,Mycat的共享数据库,共享数据架构

前言 SaaS模式是什么? 传统的软件模式是在开发出软件产品后,需要去客户现场进行实施,通常部署在局域网,这样开发、部署及维护的成本都是比较高的。 现在随着云服务技术的蓬勃发展,就出现了SaaS模式。 所谓SaaS模式即是把产品部署在云服务器上,从前的客户变成了“租户”,我们按照功能和租用时间对租户进行收费。 这样的好处是,用户可以按自己的需求来购买功...

mycat-web

Mycat-web是基于Mycat的一个性能监控工具,如:sql性能监控等。 在安装Mycat-web之前需要先安装Zookeeper: 可参考: http://blog.csdn.net/tlk20071/article/details/52028945 我自己也是按照该教程所写进行安装,安装成功。 一、下载 下载地址: https://github.c...