分布式存储

分布式id

特点
全局唯一,递增,包含时间部分,高可用。

方案

  • UUID
    思想:结合机器物理特征(网卡、时间)生成
    优点:快,无需库,无单点故障
    缺点:无序,字符串查询效率低

  • 数据库自增ID
    思想:mysql的auto_increment,不同机器step不同
    优点:简单,有序
    缺点:有单机性能瓶颈(需分库分表),有单点问题(需主从)

  • 批量生成ID
    思想: 一次生成多个ID入库,在缓存中记录最大ID
    优点:避免查库提升性能
    缺点:易造成id不连续

  • Redis生成ID
    思想:由于redis执行命令是单线程的,容易保障原子性,所以能保证id全局唯一
    优点:性能高,
    缺点:引入中间件导致系统复杂度提升

  • Twitter的snowflake算法(重点)
    image-20211021213942181
    思想:利用zk强一致性实现
    1位符号位:
    由于 long 类型在 java 中带符号的,最高位为符号位,正数为 0,负数为 1,且实际系统中所使用
    的ID一般都是正数,所以最高位为 0。

41位时间戳(毫秒级):
需要注意的是此处的 41 位时间戳并非存储当前时间的时间戳,而是存储时间戳的差值(当前时间戳 – 起始时间戳),这里的起始时间戳一般是ID生成器开始使用的时间戳,由程序来指定,所以41位毫秒时间戳最多可以使用 (1 << 41) / (1000x60x60x24x365) = 69年 。

10位数据机器位:
包括5位数据标识位和5位机器标识位,这10位决定了分布式系统中最多可以部署 1 << 10 = 1024s个节点。超过这个数量,生成的ID就有可能会冲突。

12位毫秒内的序列:
这 12 位计数支持每个节点每毫秒(同一台机器,同一时刻)最多生成 1 << 12 = 4096个ID
加起来刚好64位,为一个Long型
优点:高性能,递增,有序
缺点:依赖于时钟,需独立开发部署

  • 百度UidGenerator
    思想:snowflake算法实现
    优点:
    缺点:

  • 美团Leaf
    思想:
    优点:
    缺点:

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注