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

分布式序列算法

背景信息

传统数据库软件开发中,主键自动生成技术是基本需求。而各个数据库对于该需求也提供了相应的支持,比如 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. 在集群模式下会由系统自动生成,相同的命名空间下不会生成重复的值。

UUID

类型:UUID

可配置属性:无

操作步骤

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

配置示例

  • 雪花算法
keyGenerators:
  snowflake:
    type: SNOWFLAKE
  • UUID
keyGenerators:
  uuid:
    type: UUID