分布式唯一ID生成器

384 阅读2分钟

问题背景

分布式ID生成器一般使用在分库分表的场景,比如订单表数据量很大,对其进行分库分表,假如分成了3张表,每张表的id都是从1开始递增的,那么问题来了,因为订单id在业务上必须要保证唯一性,你每张表都是从1开始递增,就会有重复id的出现,这时就有问题了。

UUID

靠谱,绝对没有重复的id生成,但是作为数据库主键不适合,因为会产生频繁的页分裂问题,影响数据库性能,适合非数据库主键的场景。

数据库单表

专门搞一张表,每次生成唯一id时,就使用insert into插入一条记录,然后使用插入语句返回的主键id作为唯一id。很方便很实用,但是单表扛不住高并发,如果我们生成唯一id的场景并发很高,就JJ了。

Redis自增

使用redis的incrby命令,每次递增1,在这里为了保证高可用和抗住高并发,我们肯定要使用redis集群+主备的部署方式,假如我们集群部署3台机器,每台机器的步长为3,那么第一台:1,4,7,10......,第二台:2,5,8,11......,第三台:3,6,9,12......,每次随机挑选一台机器生成唯一id,这周方式看似很完美,仔细想想其实缺点也很明显,比如:如何扩容,假如现在要扩容到5台机器,以前生成的唯一id怎么办?还有redis主从同步还是有可能产生重复id的,比如,master此时id=3,准备同步给slave但是还没有同步,不巧的是,此时master宕机,id=3还没来得及同步,此时slave切换为master,此时slave里id=2,接着用incrby操作id=3,产生重复的id了。

Snowflake算法

64位bit位,第一位是0代表符号位,41位放时间(最多使用69年),10位放机器位(最多可以有1024台机器),12位放序号(每毫秒最多生成4096个id),基于内存高性能,1024台机器可以扩展可扩展,每毫秒可以生成4096个id高并发,可以看出Snowflake算法很完美,很适合分布式环境下id生成器,但是它有也有缺点,比如时钟回拨问题。

美团开源的Leaf

Leaf简介