复古 护眼 海天 深邃 暗黑 默认

分布式序列算法

背景信息

传统数据库软件开发中,主键自动生成技术是基本需求。而各个数据库对于该需求也提供了相应的支持,比如 MySQL 的自增键,Oracle 的自增序列等。 数据分片后,不同数据节点生成全局唯一主键是非常棘手的问题。同一个逻辑表内的不同实际表之间的自增键由于无法互相感知而产生重复主键。 虽然可通过约束自增主键初始值和步长的方式避免碰撞,但需引入额外的运维规则,使解决方案缺乏完整性和可扩展性。

目前有许多第三方解决方案可以完美解决这个问题,如 UUID 等依靠特定算法自生成不重复键,或者通过引入主键生成服务等。为了方便用户使用、满足不同用户不同使用场景的需求, Apache ShardingSphere 不仅提供了内置的分布式主键生成器,例如 UUID、SNOWFLAKE,还抽离出分布式主键生成器的接口,方便用户自行实现自定义的自增主键生成器。

参数解释

雪花算法

类型:SNOWFLAKE

可配置属性:

属性名称 数据类型 说明 默认值
worker-id (?) long 工作机器唯一标识 0
max-vibration-offset (?) int 最大抖动上限值,范围[0, 4096)。注:若使用此算法生成值作分片值,建议配置此属性。此算法在不同毫秒内所生成的 key 取模 2^n (2^n一般为分库或分表数) 之后结果总为 0 或 1。为防止上述分片问题,建议将此属性值配置为 (2^n)-1 1
max-tolerate-time-difference-milliseconds (?) long 最大容忍时钟回退时间,单位:毫秒 10 毫秒

注意:worker-id 为选配项

  1. 在单机模式下支持用户自定义配置,如果用户不配置使用默认值为0。
  2. 在集群模式下会由系统自动生成,相同的命名空间下不会生成重复的值。

NanoID

类型:NANOID

可配置属性: 无

UUID

类型:UUID

可配置属性:无

CosId

类型: COSID

可配置属性:

属性名称 数据类型 说明 默认值
id-name String ID 生成器名称 __share__
as-string bool 是否生成字符串类型ID: 将 long 类型 ID 转换成 62 进制 String 类型(Long.MAX_VALUE 最大字符串长度11位),并保证字符串 ID 有序性 false

CosId-Snowflake

类型: COSID_SNOWFLAKE

可配置属性:

属性名称 数据类型 说明 默认值
epoch String 雪花 ID 算法的 EPOCH 1477929600000
as-string bool 是否生成字符串类型ID: 将 long 类型 ID 转换成 62 进制 String 类型(Long.MAX_VALUE 最大字符串长度11位),并保证字符串 ID 有序性 false

操作步骤

  1. 配置数据分片规则时为列配置分布式主键生成策略

配置示例

  • 雪花算法
keyGenerators:
  snowflake:
    type: SNOWFLAKE
  • NanoID
keyGenerators:
  nanoid:
    type: NANOID
  • UUID
keyGenerators:
  nanoid:
    type: UUID