分布式唯一ID

在分布式开发过程中,常常为数据唯一标识苦恼,虽然数据库提供了字段自增长,使用起来也简单,但是在数据库改造过程中要分库分表的时候,不能保证这些数据标识的唯一;UUID出现,保证了数据标识的全球唯一,但是其生成为字符串,索引查询和存储效率低,并且生成标识不具有顺序性,导致后期的数据排序产生新的问题, 下面介绍了三种分布式环境下生成唯一ID的解决方案:UUID,Redis,SnowFlake,比较了一下它们三个的优缺点

1. UUID

生成方式: UUID 可以在程序中或者在数据库中生成; 其目的是让分布式系统中数据可以有唯一的存在标识;  生成算法的核心思想是结合机器的网卡(若无网卡,找寻其它机器硬件唯一标识码代替)、当地时间、一个随即数来生成UUID,可以实现全球唯一

优点:  (1)生成简单,性能好;

           (2)生成规则和网卡号等等机器硬件唯一编号有关系,所以可以实现全球唯一;

           (3)可以应对系统合并和数据迁移的问题;

缺点:  (1) 无序的,不能保证生成ID的递增关系,当数据分库存储时,不利于数据的排序;  

           (2)字符串存储,当字符串比较大的时候,查询的性能比较低,并且在海量数据下占用的存储空间比较大,系统之间传输的开销比较大;

           (3)生成的字符串不可读,不友好;

2. Redis实现

    生成方式:  利用redis的lua脚本执行功能,在每个节点上通过lua脚本生成唯一ID

        实现比较灵活,生成的ID格式可以自定义, 举例实现方式:

        使用41 bit来存放时间,精确到毫秒,可以使用41年; 使用12 bit来存放逻辑分片ID,      最大分片ID是4095; 使用10 bit来存放自增长ID,意味着每个节点,每毫秒最多可以生成1024个ID; 因此, 生成唯一标识为64位;

优点:  (1) 生成ID灵活,可以自定义生成唯一标识的格式;

            (2) 单线程,不存在线程安全的问题;

缺点:  (1) 开发成本高,相对于其它解决方案开发过程复杂

            (2)Redis的单线程虽然保证了线程的安全,但是在高负载的系统中成为系统的瓶颈

            (3)时间倒流的时候,不能保证系统生成的唯一性

3. twitter家自用的Snowflake

(1) 41位的时间序列(精确到毫秒,41位的长度可以使用69年)

(2) 10位的机器标识(10位的长度最多支持部署1024个节点)

(3) 12位的计数顺序号(12位的计数顺序号支持每个节点每毫秒产生4096个ID序号) 最高位是符号位,始终为0。

优点:高性能,低延迟;独立的应用;可以按照按时间有序,适合分布式环境数据排序

缺点:需要独立的开发和部署; 存在时间倒退的风险问题;



如果是在复杂分布式系统中,上面三个倾力推荐Snowflake, 开发使用相对UUID来说比较复杂,但是比Redis来做要简单;

未完待续...

发现好的解决方案,继续添加!!!

你可能感兴趣的:(分布式唯一ID)