查看原文
其他

分布式数据库如何实现主键全局自增?

江南一点雨 江南一点雨 2020-10-08

前面和大家介绍了 MyCat 中数据库不同的分片规则,从留言中看出大家对分布式数据库中间件还挺感兴趣,因此今天就再来一篇,聊一聊主键全局自增要如何实现。

关于数据库分库分表的问题,我们前面还有几篇铺垫的文章,阅读前面的文章有助于更好的理解本文:


  1. 提高性能,MySQL 读写分离环境搭建(一)

  2. 提高性能,MySQL 读写分离环境搭建(二)

  3. MySQL 只能做小项目?松哥要说几句公道话!

  4. 北冥有 Data,其名为鲲,鲲之大,一个 MySQL 放不下!

  5. What?Tomcat 竟然也算中间件?

  6. 分布式数据库中间件 MyCat 搞起来!

  7. 数据库分库分表,分片配置轻松入门!


问题

主键自增这应该算是一个非常常见的需求,在单机数据库中,这个需求一个 auto_increment 就能实现,但是在数据库集群中,这个需求却变复杂了,因为存在多个数据库实例 ,各自都是主键自增,合在一起就不是主键自增了。

最简单的思路

最简单的办法莫过于通过设置主键自增的步长和起始偏移量来处理这个问题。默认情况下,主键自增步长为 1 ,如果我们有三个数据库实例,我们可以将主键自增步长设置为 3 ,这样对于第一个数据库实例而言,主键自增就是 1、4、7、10...,对于第二个数据库实例而言,主键自增就是 2、5、8、11...,对于第三个数据库实例而言,主键自增就是 3、6、9、12....。

MSSQL 可以直接在 SQL 中指定主键的自增步长和起始偏移量,但是 MySQL 则需要修改数据库配置才能实现,因此这里不推荐使用这种方式。

MyCat 的办法

MyCat 作为一个分布式数据库中间,屏蔽了数据库集群的操作,让我们操作数据库集群就像操作单机版数据库一样,对于主键自增,它有自己的方案:

  1. 通过本地文件实现

  2. 通过数据库实现

  3. 通过本地时间戳实现

  4. 通过分布式 ZK ID 生成器实现

  5. 通过 ZK 递增方式实现

今天我们就先来看看看如何通过 ZK 递增的方式实现主键全局自增。

配置步骤如下:

  • 首先修改主键自增方式为 4 ,4 表示使用 zookeeper 实现主键自增。

server.xml

  • 配置表自增,并且设置主键

schema.xml

设置主键自增,并且设置主键为 id 。

  • 配置 zookeeper 的信息

在 myid.properties 中配置 zookeeper 信息:

  • 配置要自增的表

sequence_conf.properties

注意,这里表名字要大写。

  1. TABLE.MINID 某线程当前区间内最小值

  2. TABLE.MAXID 某线程当前区间内最大值

  3. TABLE.CURID 某线程当前区间内当前值

  4. 文件配置的MAXID以及MINID决定每次取得区间,这个对于每个线程或者进程都有效

  5. 文件中的这三个属性配置只对第一个进程的第一个线程有效,其他线程和进程会动态读取 ZK

  • 重启 MyCat 测试

最后重启 MyCat ,删掉之前创建的表,然后创建新表进行测试即可。

好了,本文主要向大家介绍了 MyCat 实现主键全局自增的方案。不知道大家有没有 GET 到呢?有问题欢迎留言讨论。


IntelliJ IDEA 调试指北

Spring Boot 整合 Freemarker,50 多行配置是怎么省略掉的?

@ResponseBody 总是乱码?这个问题得好好捋一捋!

数据库分库分表,分片配置轻松入门!

前后端分离时代,Java 程序员的变与不变!

分布式数据库中间件 MyCat 搞起来!

What?Tomcat 竟然也算中间件?

我的第一本书,被选作大学教材了!

北冥有 Data,其名为鲲,鲲之大,一个 MySQL 放不下!

MySQL 只能做小项目?松哥要说几句公道话!


你点的每个在看,我都认真当成了喜欢

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存