实现动机传统数据库软件开发中主键自动生成技术是基本需求。而各个数据库对于该需求也提供了相应的支持比如 MySQL 的自增键Oracle 的自增序列等。数据分片后不同数据节点生成全局唯一主键是非常棘手的问题。同一个逻辑表内的不同实际表之间的自增键由于无法互相感知而产生重复主键。 虽然可通过约束自增主键初始值和步长的方式避免碰撞但需引入额外的运维规则使解决方案缺乏完整性和可扩展性。目前有许多第三方解决方案可以完美解决这个问题如 UUID 等依靠特定算法自生成不重复键或者通过引入主键生成服务等。为了方便用户使用、满足不同用户不同使用场景的需求 Apache ShardingSphere 不仅提供了内置的分布式主键生成器例如 UUID、SNOWFLAKE还抽离出分布式主键生成器的接口方便用户自行实现自定义的自增主键生成器。内置的主键生成器UUID采用 UUID.randomUUID() 的方式产生分布式主键。SNOWFLAKE在分片规则配置模块可配置每个表的主键生成策略默认使用雪花算法snowflake生成 64bit 的长整型数据。雪花算法是由 Twitter 公布的分布式主键生成算法它能够保证不同进程主键的不重复性以及相同进程主键的有序性。实现原理在同一个进程中它首先是通过时间位保证不重复如果时间相同则是通过序列位保证。 同时由于时间位是单调递增的且各个服务器如果大体做了时间同步那么生成的主键在分布式环境可以认为是总体有序的这就保证了对索引字段的插入的高效性。 例如 MySQL 的 Innodb 存储引擎的主键。使用雪花算法生成的主键二进制表示形式包含 4 部分从高位到低位分表为1bit 符号位、41bit 时间戳位、10bit 工作进程位以及 12bit 序列号位。链接官网说明
分库分表之分布式序列算法
实现动机传统数据库软件开发中主键自动生成技术是基本需求。而各个数据库对于该需求也提供了相应的支持比如 MySQL 的自增键Oracle 的自增序列等。数据分片后不同数据节点生成全局唯一主键是非常棘手的问题。同一个逻辑表内的不同实际表之间的自增键由于无法互相感知而产生重复主键。 虽然可通过约束自增主键初始值和步长的方式避免碰撞但需引入额外的运维规则使解决方案缺乏完整性和可扩展性。目前有许多第三方解决方案可以完美解决这个问题如 UUID 等依靠特定算法自生成不重复键或者通过引入主键生成服务等。为了方便用户使用、满足不同用户不同使用场景的需求 Apache ShardingSphere 不仅提供了内置的分布式主键生成器例如 UUID、SNOWFLAKE还抽离出分布式主键生成器的接口方便用户自行实现自定义的自增主键生成器。内置的主键生成器UUID采用 UUID.randomUUID() 的方式产生分布式主键。SNOWFLAKE在分片规则配置模块可配置每个表的主键生成策略默认使用雪花算法snowflake生成 64bit 的长整型数据。雪花算法是由 Twitter 公布的分布式主键生成算法它能够保证不同进程主键的不重复性以及相同进程主键的有序性。实现原理在同一个进程中它首先是通过时间位保证不重复如果时间相同则是通过序列位保证。 同时由于时间位是单调递增的且各个服务器如果大体做了时间同步那么生成的主键在分布式环境可以认为是总体有序的这就保证了对索引字段的插入的高效性。 例如 MySQL 的 Innodb 存储引擎的主键。使用雪花算法生成的主键二进制表示形式包含 4 部分从高位到低位分表为1bit 符号位、41bit 时间戳位、10bit 工作进程位以及 12bit 序列号位。链接官网说明