Mycat 全局系列号
标签:utf8
概述
本篇文章介绍mycat怎样在分库分表的情况下保证主键的全局唯一方法,接下来就来分析三种方法各自的优缺点。
配置
文件方式获取
1.修改server配置文件
vim server.xml
<system><property name="sequnceHandlerType">0</property></system>
注:sequnceHandlerType 配置为0表示使用本地文件读取。
2.配置sequence_conf.properties配置文件

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

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重复的现象
缺点:数据类型太长
总结
三种方式各有优缺点,根据自己的需求选择。
|
备注: 作者:pursuer.chen 博客:http://www.cnblogs.com/chenmh 本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接。 《欢迎交流讨论》 |
Mycat 全局系列号的更多相关文章
- Mycat 全局系列号(转载)
概述 本篇文章介绍mycat怎样在分库分表的情况下保证主键的全局唯一方法,接下来就来分析三种方法各自的优缺点. 配置 文件方式获取 1.修改server配置文件 vim server.xml < ...
- 取CPU序列号,获取网卡,取硬盘系列号,获取目录下的文件,强制删除目录
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- 获取CPU系列号,硬盘系
unit Secrity; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, For ...
- mycat - 全局序列
解决主键冲突问题:例如id自增的order表,如果分布式情况下不处理的话,当每个表的第一条数据id都是1. 怎么确保id唯一呢? 解决办法: 1.本地文件(不推荐) 2.数据库方式(推荐) 3.时间戳 ...
- MyCAT全局序列号
在实现分库分表的情况下,数据库自增主键已无法保证自增主键的全局唯一.为此,MyCat 提供了全局sequence,并且提供了包含本地配置和数据库配置等多种实现方式. 本地文件方式 原理:此方式MyCA ...
- MyCat全局表和ER--笔记(三)
全局表 全局表的作用 在分片的情况下,当业务表因为规模而进行分片以后,业务表与这些附属的字典表之间的关联,就成了比较棘手的问题,考虑到字典表具有以下几个特性: 变动不频繁 数据量总体变化不大 数据规模 ...
- MyCAT全局序列号-数据库方式
1.MyCat中的全局序列号介绍 在实现分库分表的情况下,数据库自增主键已无法保证自增主键的全局唯一.为此,MyCat 提供了全局 sequence,并且提供了包含本地配置和数据库配置等多种实现方式. ...
- MyCat配置简述以及mycat全局ID
Mycat可以直接下载解压,简单配置后可以使用,主要配置项如下: 1. log4j2.xml:配置MyCat日志,包括位置,格式,单个文件大小 2. rule.xml: 配置分片规则 3. schem ...
- mycat 全局表
全局表的作用 在分片的情况下,当业务表因为规模而进行分片以后,业务表与这些附属的字典表之间的关联,就成了比较棘手的问题,考虑到字典表具有以下几个特性: 变动不频繁 数据量总体变化不大 数据规模不大,很 ...
随机推荐
- UWP学习记录7-设计和UI之控件和模式4
UWP学习记录7-设计和UI之控件和模式4 1.翻转视图 使用翻转视图浏览集合中的图像或其他项目(例如相册中的照片或产品详细信息页中的项目),一次显示一个项目. 对于触摸设备,轻扫某个项将在整个集合中 ...
- UWP学习记录1-开端
UWP学习记录1-开端 1.背景 针对不同基础的人,学习的路线自然是不同的.这篇文章记录的是我个人的学习路线,或者说笔记.我对自己的技术状态的定义是: A.有很好的windows平台编程基础: B.有 ...
- LinkedList源码阅读笔记(基于JDK1.8)
LinkedList是List接口的一个有序链表实现,存储节点是内部类Node,Node中有两个属性prev和next,负责连接前后两个元素.由于不是使用数组进行存储,所以查询需要遍历链表一半的元素( ...
- linux中redis的php扩展安装
PHP中的扩展一般都是在安装环境的时候就已经装好了的.但是有的一些扩展在后期想要加上去的话也是可以的.php支持后期安装扩展. 想要安装扩展就需要先去下载安装扩展所需要的扩展源码包.autoconf. ...
- h5容易遗忘的内容
1.表单中 input类型 小补充: 2.常用的表单元素 3.表单属性 4.表单事件 5.多媒体:音频和视频 5.1音频 5.2视频 6.Dom拓展
- Python3的tkinter写一个简单的小程序
一.这个学期开始学习python,但是看了python2和python3,最后还是选择了python3 本着熟悉python的原因,并且也想做一些小程序来增加自己对python的熟练度.所以写了一个简 ...
- 解决svn uuid变更问题
简介: 今天在snv根目录下重新定位上传的url,更改后出现如下错误 .可以看到,原来Repository创建者的uuid是前者,而现在我操作的是后者的uuid.因此,目前的操作办法是 使用相关命令更 ...
- 从零开始山寨Caffe·拾:IO系统(三)
数据变形 IO(二)中,我们已经将原始数据缓冲至Datum,Datum又存入了生产者缓冲区,不过,这离消费,还早得很呢. 在消费(使用)之前,最重要的一步,就是数据变形. ImageNet Image ...
- 【ORACLE】IN 后跟&参数字符串的处理方法
今天写尼日利亚BOSS,数据修复脚本时遇到一个问题, 参数字符串无法再IN中使用,例如:想要完成下面的查询 select * From customeren c where c.customercod ...
- 【异常】INFO: TopologyManager: EndpointListener changed ...
5月份做云部署,在调试CSS系统时,出现启动系统时,卡死情况,后台日志如下: May 03, 2016 2:34:52 AM org.apache.cxf.dosgi.topologymanager. ...