概述

本篇文章介绍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重复的现象

缺点:数据类型太长

总结

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

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

Mycat 全局系列号(转载)的更多相关文章

  1. Mycat 全局系列号

    标签:utf8 概述 本篇文章介绍mycat怎样在分库分表的情况下保证主键的全局唯一方法,接下来就来分析三种方法各自的优缺点. 配置 文件方式获取 1.修改server配置文件 vim server. ...

  2. 取CPU序列号,获取网卡,取硬盘系列号,获取目录下的文件,强制删除目录

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  3. 获取CPU系列号,硬盘系

    unit Secrity; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, For ...

  4. mycat - 全局序列

    解决主键冲突问题:例如id自增的order表,如果分布式情况下不处理的话,当每个表的第一条数据id都是1. 怎么确保id唯一呢? 解决办法: 1.本地文件(不推荐) 2.数据库方式(推荐) 3.时间戳 ...

  5. Flask入门系列(转载)

    一.入门系列: Flask入门系列(一)–Hello World 项目开发中,经常要写一些小系统来辅助,比如监控系统,配置系统等等.用传统的Java写,太笨重了,连PHP都嫌麻烦.一直在寻找一个轻量级 ...

  6. MyCAT全局序列号

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

  7. MyCat全局表和ER--笔记(三)

    全局表 全局表的作用 在分片的情况下,当业务表因为规模而进行分片以后,业务表与这些附属的字典表之间的关联,就成了比较棘手的问题,考虑到字典表具有以下几个特性: 变动不频繁 数据量总体变化不大 数据规模 ...

  8. MyCAT全局序列号-数据库方式

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

  9. 【公众号转载】超详细 Nginx 极简教程,傻瓜一看也会!

    什么是Nginx? Nginx (engine x) 是一款轻量级的Web 服务器 .反向代理服务器及电子邮件(IMAP/POP3)代理服务器. 什么是反向代理? 反向代理(Reverse Proxy ...

随机推荐

  1. C_局部变量&全局变量

    2018-5-9   Writen By Stephen.Yu  一.定义 1. 局部变量:在函数中定义的变量 2. 全局变量:在所有函数体之外定义 定义(Definition):声明并分配内存;未分 ...

  2. redis源码分析(一)-sds实现

    redis支持多种数据类型,sds(simple dynamic string)是最基本的一种,redis中的字符串类型大多使用sds保存,它支持动态的扩展与压缩,并提供许多工具函数.这篇文章将分析s ...

  3. @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本

    今天遇到了很奇葩的问题,我本机的是以test环境启动的,调用另一个服务接口的时候返回参数却不同,调用接口是没错,怎么会这样,排查了很久,发现在eureka上注册的另一个服务是testone环境,而这个 ...

  4. Mysql向新建表中插入数据, Incorrect string value: '\xE5\xBC\xA0\xE4\xB8\x89' for column 'UserName' at row 1

    在本地通过MYSQL创建测试表 CREATE Table User ( UserId int not NULL PRIMARY KEY auto_increment, //主键自增 UserName ...

  5. C# 利用MS的 EntLib的Database类编写的DbHelper

    C# 利用MS的 EntLib的Database类编写的DbHelper,由于MS的EntLib对Oracle.SQL Server和MySql已经封装,所以可以该DbHelper可以适用这三种数据库 ...

  6. 网页调用文件另存为js

    查看引用是否正常,页面添加html代码. <a id="downLoad" onclick="oDownLoad('downLoad')">下载&l ...

  7. Softmax学习笔记

    softmax用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类! 他把一些输入映射为0-1之间的实数,并且归一化保证和为1,因此多分类的概率之和也刚 ...

  8. CSS疑难杂症

    1.text-align: center + letter-spacing: 2em 字体不居中 办法:添加text-indent: 2em 2.first-child伪类选择不到元素 办法:确保备选 ...

  9. 单词eschaunge交易所eschaunge交换

    Exchange of one person or thing for another; reciprocal giving and receiving: (a) of prisoners of wa ...

  10. (二)分布式数据库tidb-事务

    tidb既然是分布式数据库,所以它的事务应该可其它数据库事务有着不同的区别.我们来了解下tidb的数据库事务. (一)事物 1.几种数据库的默认隔离级别: tidb是乐观锁 (二)事务语句 TiDB ...