传统数据库软件开发中,主键自动生成技术是基本需求。而各个数据库对于该需求也提供了相应的支持,比如 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 为选配项
类型:NANOID
可配置属性: 无
类型:UUID
可配置属性:无
类型: COSID
可配置属性:
属性名称 | 数据类型 | 说明 | 默认值 |
---|---|---|---|
id-name | String | ID 生成器名称 | __share__ |
as-string | bool | 是否生成字符串类型ID: 将 long 类型 ID 转换成 62 进制 String 类型(Long.MAX_VALUE 最大字符串长度11位),并保证字符串 ID 有序性 |
false |
类型: COSID_SNOWFLAKE
可配置属性:
属性名称 | 数据类型 | 说明 | 默认值 |
---|---|---|---|
epoch | String | 雪花 ID 算法的 EPOCH | 1477929600000 |
as-string | bool | 是否生成字符串类型ID: 将 long 类型 ID 转换成 62 进制 String 类型(Long.MAX_VALUE 最大字符串长度11位),并保证字符串 ID 有序性 |
false |
keyGenerators:
snowflake:
type: SNOWFLAKE
keyGenerators:
nanoid:
type: NANOID
keyGenerators:
nanoid:
type: UUID