分布式ID 学习笔记

分布式系统下为不同的数据节点生成全局唯一主键

要求

基本要求

  • 全局唯一
  • 高性能:生成要快
  • 高可用:生成分布式ID的服务要保证可用性
  • 方便易用

额外

  • 安全:不含敏感信息
  • 有序递增
  • 有具体的业务含义
  • 独立部署:单独有一个发号器服务

常见解决方案

数据库号段

CREATE TABLE `sequence_id_generator` (
  `id` int(10) NOT NULL,
  `current_max_id` bigint(20) NOT NULL COMMENT '当前最大id',
  `step` int(10) NOT NULL COMMENT '号段的长度',
  `version` int(20) NOT NULL COMMENT '版本号',
  `biz_type`    int(20) NOT NULL COMMENT '业务类型',
   PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

version 字段主要用于乐观锁

  • 创建一个数据库表 squence_id_generator ,存储当前最大长度、号段的长度
  • 每一次申请一块的ID,放入内存,需要用的时候从内存中拿
  • 更新数据库表

NoSQL

  • 使用Redis Cluster
  • MongoDB

算法

UUID
//cb4a9ede-fa5e-4585-b9bb-d60bce986eaa
UUID.randomUUID()

不同版本的UUID的生成规则不同

可以保证全局唯一性,但是过长、无顺序

Snowflake
  • sign(1 bit):符号位,始终为0,代表ID为正数
  • timestamp(41 bit):毫秒为单位的时间戳,可以支撑 毫秒
  • datacenter id + worker id(10 bits):机房ID+机器ID
  • sequence(12 bits):单台机器每毫秒所能生成的最大ID数( ),自增的序列号
img_show