分布式系统唯一id

数据库分表分库的必要性

  随着数据库数据量和访问量的增加,无论是读写分离还是主从分离都无法摆脱数据库自身的IO瓶颈,到后期分表分库将成为必然,那么在分表分库后如何保证主键的唯一性。

主键唯一性算法

UUID

  想要得到一个具有唯一性的ID,我们会想到UUID,毕竟生成的UUID全球唯一,优点是直接本地生成,足够简单,但是缺点也很明显,长度过长无论是查询还是存储对性能消耗都比较大,并且UUID是无序的在innodb由于主键是聚类索引,所以每一次新增和删除都浪费性能。

基于数据库自增ID

  利用一个MYSQL实例来生成自增ID,然后分配给分布式数据库,优点是简单,缺点还是在高并发请求时MYSQL实例的性能瓶颈,并且强依赖于该MYSQL.

基于数据库集群模式

  多个数据库都采取自增手段,但是起始值不一样,自增步长一样如
两台:
起始值1,步长2: 1,3,5,7...
起始值2,步长2:2,4,6,8,10...
保证唯一,优点简单方便,缺点:拓展性差,当有更多数据库咋办,原有基础上难以拓展。

snowflake雪花算法

  如图所示


image.png

优点简单,有顺序,缺点:长度过长

基于数据库的号段模式

  号段模式可以理解为从数据库批量的获取自增ID,每次从数据库取出一个号段范围,例如 (1,1000] 代表1000个ID,具体的业务服务将本号段,生成1~1000的自增ID并加载到内存。等这批号段ID用完,再次向数据库申请新号段,对max_id字段做一次update操作,update max_id= max_id + step,update成功则说明新号段获取成功,新的号段范围是(max_id ,max_id +step]。

你可能感兴趣的:(分布式系统唯一id)