上了微服务之后,很多原本很简单的问题现在都变复杂了,例如全局 ID 这事!

松哥最近工作中刚好用到这块内容,于是调研了市面上几种常见的全局 ID 生成策略,稍微做了一下对比,供小伙伴们参考。

当数据库分库分表之后,原本的主键自增就不方便继续使用了,需要找到一个新的合适的方案,松哥的需求就是在这样的情况下提出的。

接下来我们一起来捋一捋。

1. 两种思路

整体上来说,这个问题有两种不同的思路:

  • 让数据库自己搞定
  • Java 代码来处理主键,然后直接插入数据库中即可。

这两种思路又对应了不同的方案,我们一个一个来看。

2. 数据库自己搞定

数据库自己搞定,就是说我在数据插入的时候,依然不考虑主键的问题,希望继续使用数据库的主键自增,但是很明显,原本默认的主键自增现在没法用了,我们必须有新的方案。

2.1 修改数据库配置

数据库分库分表之后的结构如下图(假设数据库中间件用的 MyCat):

图片图片

此时如果原本的 db1、db2、db3 继续各自主键自增,那么对于 MyCat 而言,主键就不是自增了,主键就会重复,用户从 MyCat 中查询到的数据主键就有问题。

找到问题的原因,那么剩下的就好解决了。

我们可以直接修改 MySQL 数据库主键自增的起始值和步长。

首先我们可以通过如下 SQL 查看与此相关的两个变量的取值:

SHOW VARIABLES LIKE 'auto_increment%'