库自增ID
基于数据库的ID 生成
sequence 单表方案
在单数据源情况下,基于原理
这种情况下一个序列只存储于一张
-- ----------------------------
-- Table structure for `sequence`
-- ----------------------------
DROP TABLE IF EXISTS `sequence`;
CREATE TABLE `sequence` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'Id',
`name` varchar(64) NOT NULL COMMENT 'sequence name',
`value` bigint(20) NOT NULL COMMENT 'sequence current value',
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='sequence'
;
即为每个数据源分配一个序号,数据源根据自己的序号在序列空间中独占一组序列号,原理如下图:

水平扩展
单台机器自然存在可用性问题,最简单的方式就是考虑将其扩展到多台机器,在前文的
begin;
REPLACE INTO Tickets64 (stub) VALUES ('a');
SELECT LAST_INSERT_ID();
commit;

在分布式系统中我们可以多部署几台机器,每台机器设置不同的初始值,且步长和机器数相等。比如有两台机器。设置步长
TicketServer1:
auto-increment-increment = 2
auto-increment-offset = 1
TicketServer2:
auto-increment-increment = 2
auto-increment-offset = 2
假设我们要部署

不过这种方式也存在问题,系统水平扩展比较困难,比如定义好了步长和机器台数之后,很难进行增删。