背景
分库分表后,原本一个数据库上的自增id的结果,在分库分表下并不是全局唯一的. 所以,分库分表后需要有一种技术可以生成全局的唯一id.
一些常见方案
- 数据库自增 id , 单库维护id 对并发不太友好
- uuid, uuid太长了
- 基于时间 支持并发不靠谱
- snowflake 算法 snowflake 算法是 twitter 开源的分布式 id 生成算法,就是把一个 64 位的 long 型的 id,1 个bit是不用的,用其中的 41 bit 作为毫秒数,用 10 bit 作为工作机器 id,12 bit 作为序列号。
- oracle sequence : 基于第三方oracle的SEQ.NEXTVAL来获取一个ID, 需要依赖oracle, 现在在中国用oracle的互联网公司几乎木有了。
- mysql id区间隔离 : 不同分库设置不同的起始值和步长,比如2台mysql,就可以设置一台只生成奇数,另一台生成偶数. 或者1台用010亿,另一台用1020亿. 优势:利用mysql自增id 缺点:运维成本比较高,数据扩容时需要重新设置步长.
- 基于数据库+内存分配: 在数据库中ID值,获取下一个ID时,会对数据库进行ID=ID+XX WHERE ID=YY,拿到XX个ID后,在内存中进行分配 优势:简单高效 缺点:无法保证自增顺序 可以用基于多个库来分配 以进行容灾
参考文章