实现方式
- 数据库表中分布式id的字段,加唯一索引。
- 分布式ID组成:时间 + UUID + 分库分表标识。例如
20221001-88affbadedba483db60814f8a3f49b06-010023
。
说明
- 加时间前缀是为了保证id在时间维度是有序的,可以到日,也可以到小时或者分。
- 表中字段加唯一索引,可以保证一个表内不会重复。
- 分库分表标识,每个表之间是不一样的,所以可以保证表之间不会重复。也就保证了全局唯一。
数据库拆库可能遇到的问题
比如原本是10个库,发现不够用了,准备拆成50个库。如果分库分表的路由仅仅是基于分布式ID,那么没问题,存量数据还放在现有的库中即可。增量的放在新加的库中。
但是如果还基于其他的业务字段进行路由,比如用户id,那么:
- 数据库拆分后,基于分布式ID路由和基于用户ID路由,只能保留一个路由方式,另外一个要废弃。
- 分布式 ID 考虑换成绝对不会重复的实现。此时如何保证新的ID和旧的不会冲突? 新的长的不一样就行了,比如加一个字母前缀,比如 Bxxxxxx 。