上了微服务之后,很多原本很简单的问题现在都变复杂了,例如全局 ID 这事!
松哥最近工作中刚好用到这块内容,于是调研了市面上几种常见的全局 ID 生成策略,稍微做了一下对比,供小伙伴们参考。
当数据库分库分表之后,原本的主键自增就不方便继续使用了,需要找到一个新的合适的方案,松哥的需求就是在这样的情况下提出的。
接下来我们一起来捋一捋。
1. 两种思路
整体上来说,这个问题有两种不同的思路:
- 让数据库自己搞定
- Java 代码来处理主键,然后直接插入数据库中即可。
这两种思路又对应了不同的方案,我们一个一个来看。
2. 数据库自己搞定
数据库自己搞定,就是说我在数据插入的时候,依然不考虑主键的问题,希望继续使用数据库的主键自增,但是很明显,原本默认的主键自增现在没法用了,我们必须有新的方案。
2.1 修改数据库配置
数据库分库分表之后的结构如下图(假设数据库中间件用的 MyCat):
图片
此时如果原本的 db1、db2、db3 继续各自主键自增,那么对于 MyCat 而言,主键就不是自增了,主键就会重复,用户从 MyCat 中查询到的数据主键就有问题。
找到问题的原因,那么剩下的就好解决了。
我们可以直接修改 MySQL 数据库主键自增的起始值和步长。
首先我们可以通过如下 SQL 查看与此相关的两个变量的取值:
SHOW VARIABLES LIKE 'auto_increment%'