分布式数据库如何实现主键全局自增?
前面和大家介绍了 MyCat 中数据库不同的分片规则,从留言中看出大家对分布式数据库中间件还挺感兴趣,因此今天就再来一篇,聊一聊主键全局自增要如何实现。
关于数据库分库分表的问题,我们前面还有几篇铺垫的文章,阅读前面的文章有助于更好的理解本文:
提高性能,MySQL 读写分离环境搭建(一)
提高性能,MySQL 读写分离环境搭建(二)
MySQL 只能做小项目?松哥要说几句公道话!
北冥有 Data,其名为鲲,鲲之大,一个 MySQL 放不下!
What?Tomcat 竟然也算中间件?
分布式数据库中间件 MyCat 搞起来!
数据库分库分表,分片配置轻松入门!
问题
主键自增这应该算是一个非常常见的需求,在单机数据库中,这个需求一个 auto_increment
就能实现,但是在数据库集群中,这个需求却变复杂了,因为存在多个数据库实例 ,各自都是主键自增,合在一起就不是主键自增了。
最简单的思路
最简单的办法莫过于通过设置主键自增的步长和起始偏移量来处理这个问题。默认情况下,主键自增步长为 1 ,如果我们有三个数据库实例,我们可以将主键自增步长设置为 3 ,这样对于第一个数据库实例而言,主键自增就是 1、4、7、10...,对于第二个数据库实例而言,主键自增就是 2、5、8、11...,对于第三个数据库实例而言,主键自增就是 3、6、9、12....。
MSSQL 可以直接在 SQL 中指定主键的自增步长和起始偏移量,但是 MySQL 则需要修改数据库配置才能实现,因此这里不推荐使用这种方式。
MyCat 的办法
MyCat 作为一个分布式数据库中间,屏蔽了数据库集群的操作,让我们操作数据库集群就像操作单机版数据库一样,对于主键自增,它有自己的方案:
通过本地文件实现
通过数据库实现
通过本地时间戳实现
通过分布式 ZK ID 生成器实现
通过 ZK 递增方式实现
今天我们就先来看看看如何通过 ZK 递增的方式实现主键全局自增。
配置步骤如下:
首先修改主键自增方式为 4 ,4 表示使用 zookeeper 实现主键自增。
server.xml
配置表自增,并且设置主键
schema.xml
设置主键自增,并且设置主键为 id 。
配置 zookeeper 的信息
在 myid.properties 中配置 zookeeper 信息:
配置要自增的表
sequence_conf.properties
注意,这里表名字要大写。
TABLE.MINID 某线程当前区间内最小值
TABLE.MAXID 某线程当前区间内最大值
TABLE.CURID 某线程当前区间内当前值
文件配置的MAXID以及MINID决定每次取得区间,这个对于每个线程或者进程都有效
文件中的这三个属性配置只对第一个进程的第一个线程有效,其他线程和进程会动态读取 ZK
重启 MyCat 测试
最后重启 MyCat ,删掉之前创建的表,然后创建新表进行测试即可。
好了,本文主要向大家介绍了 MyCat 实现主键全局自增的方案。不知道大家有没有 GET 到呢?有问题欢迎留言讨论。
●IntelliJ IDEA 调试指北
●Spring Boot 整合 Freemarker,50 多行配置是怎么省略掉的?
●@ResponseBody 总是乱码?这个问题得好好捋一捋!
●数据库分库分表,分片配置轻松入门!
●前后端分离时代,Java 程序员的变与不变!
●分布式数据库中间件 MyCat 搞起来!
●What?Tomcat 竟然也算中间件?
●我的第一本书,被选作大学教材了!
●北冥有 Data,其名为鲲,鲲之大,一个 MySQL 放不下!
●MySQL 只能做小项目?松哥要说几句公道话!
你点的每个在看,我都认真当成了喜欢
分布式数据库如何实现主键全局自增?相关推荐
- 分布式学习笔记-唯一主键生成方式
分布式如何生成唯一主键 描述 优点 缺点 UUID UUID 通用唯一标识码缩写,其目是让分布式系统中所有元素都有唯一的辨识信息,而且不需要通过中央控制器来指定唯一标识 java.util.UUID. ...
- mybatis中useGeneratedKeys用法--插入数据库后获取主键值
前言:今天无意在mapper文件中看到useGeneratedKeys这个词,好奇就查了下,发现能解决我之前插入有外键表数据时,这个外键获取繁琐的问题,于是学习敲DEMO记录 在项目中经常需要获 ...
- 在数据库什么是主键与外键
在数据库什么是主键与外键 2008-03-05 15:03 这需要理清几个概念: 1)候选键: 关系中的一个属性组,其值能唯一标识一个元组,若从该属性组中去掉任何一个属性,它就不具有这一性质了,这样的 ...
- mybatis mysql usegeneratedkeys_mybatis中useGeneratedKeys用法--插入数据库后获取主键值
前言:今天无意在mapper文件中看到useGeneratedKeys这个词,好奇就查了下,发现能解决我之前插入有外键表数据时,这个外键获取繁琐的问题,于是学习敲DEMO记录 在项目中经常需要获取到插 ...
- mysql基础14(关于mysql数据库在没有主键情况下去除重复数据办法)
关于mysql数据库在没有主键情况下去除重复数据办法 约定 表名:mat 根据 cat 字段去重 新增加主键为 id 步骤 1.为mat新增一列自增主键 alter table mat add col ...
- 数据库中复合主键与联合主键
复合主键(单表多个主键) 复合主键:数据库表的主键由两个及以上的字段组成. 例如: CREATE TABLE `asm_device_config_info` ( `asmModel` varchar ...
- 数据库表的主键、唯一约束和索引
目录 1.MySQL的主键. 2.MySQL的唯一约束. 3.MySQL的索引. 4.主键.唯一约束和唯一索引的区别. 1.MySQL 的 主键. "主键" 的完整称呼是 &quo ...
- mysql getgeneratedkeys,JDBC获得数据库生成的主键(JDBC、Primary Key)
JDBC获得数据库生成的主键 佟强 http://blog.csdn.net/microtong 在实际开发中,数据库中表的主键经常会由数据库负责生成,INSERT语句插入数据时插入除了主键以外的字段 ...
- 数据库中复合主键与联合主键的区别?
复合主键 复合主键:数据库表的主键由两个及以上的字段组成. 例如: CREATE TABLE `asm_device_config_info` (`asmModel` varchar(32) NOT ...
最新文章
- Linux 高可用(HA)集群之keepalived+lvs
- MVC 使用自定义HtmlHelper截断文本内容
- php中生成标准uuid(guid)的方法
- 你不是不擅长数学,你只是打开方式不对
- C语言课后习题(5)
- 转化率模型之转化数据延迟
- MySQL5.7 踩坑实录
- android实现qq登录功能实现原理,Android实现QQ登录功能
- JS等比例缩小图片尺寸
- c++ 网络编程课设入门超详细教程 ---目录
- python分析视频文件_FLV视频文件格式分析
- mac下制作windows启动U盘
- ffmpeg水印制作
- vue v-for遍历动态展示元素数量
- php 实现我的足迹,Wordpress 实现“您的足迹”功能
- python绘制笛卡尔直角坐标系
- win10无法登录Microsoft账号(登录页面无法加载)
- js中的数据驱动(基础)
- android2.3.5中阿拉伯文字符显示顺序不是从右至左显示
- SAP中输出质检Q状态库存清单处理实例