分库分表后数据库全局一致性Id如何生成
自增主键
拆分了多少张表就使自增主键的自增跨度是多少,这样就是每台机器的Id都是固定的唯一的一套等差数列
缺点就是不能随意扩容,扩容起来很麻烦
UUID
UUID使用Java自己生成的64位的序列码。数字字母混合,无顺序。很难重复
无序的id做为主键给索引重建带来了性能浪费
snowFlake 算法
根据时间戳 + 服务器号 + 自增***生成全局一致性id
优点:
- 毫秒数在高位,符合递增规则
- 不依赖三方数据库
- 配置方便
缺点:
每台服务器的时间强一致性
leaf
有一个单独的服务器对应一张表,表字段包含了当前的号码号段以及每次号段增长的增幅,以及当前的号码使用情况
程序使用加锁 synchronized 保证每次只能有一个请求去拿号,拿到号之后会对比当前的号码还在不在号码段内,还在号码段内就直接返回,不在号码段内的话就在生成一个号码段,将号码使用情况在填充上
弱依赖zk