乐趣区

分布式ID系列3数据库自增ID机制适合做分布式ID吗

数据库自增 ID 机制原理介绍

在分布式里面,数据库的自增 ID 机制的主要原理是:数据库自增 ID 和 mysql 数据库的 replace_into()函数实现的。这里的 replace 数据库自增 ID 和 mysql 数据库的 replace_into()函数实现的。这里的 replace into 跟 insert 功能类似,不同点在于:replace into 首先尝试插入数据列表中,如果发现表中已经有此行数据(根据主键或唯一索引判断)则先删除,再插入。否则直接插入新数据。

单机 mysql 数据库的自增 id 实现如下所示:

首先表结构如下所示

create table t_test(id bigint(20) unsigned not null auto_increment PRIMARY KEY,
    stub char(1) not null default '',
    unique key stub (stub)
)

然后我们插入的 sql 语句和查询的语句如下所示

replace into t_test (stub) values('b');
select last_insert_id();

此时可以看到看到我们刚刚插入的 id 值是 1

以上就是单机版 mysql 的自增 id 的实现过程,但是这里讲的是分布式 id,所以我们要分析一下数据库的自增 ID 机制在分布式里面是怎么实现的。

分布式 id 在数据库里面的实现过程:

既然是分布式 id,那么最少要使用两个数据库,这里我们使用 3 台来讲解,为了保证每一台数据库里面的 id 自增的时候不会重复,那么我们就要给每一台数据库设置 auto-increment-increment 和 auto-increment-offset 这两个属性值(auto-increment-increment 表示每一台数据库的起始 id 值,然后 auto-increment-offset 表示每一台数据库每一次的增加数字),设置值如下所示

Server1:auto-increment-increment = 1
auto-increment-offset = 3

Server2:auto-increment-increment = 2
auto-increment-offset = 3

Server2:auto-increment-increment = 3
auto-increment-offset = 3

那么如果我们有 n 台数据库的话,那么上面的 auto-increment-increment 和 auto-increment-offset 这两个属性值应该怎么设计呢,我们给每一台数据库设置初始值分别为 1,2,3…N,然后每一台数据库自增步长为机器的台数 N,如下图所示

数据库自增 ID 是否适合做分布式 ID:

那数据库自增 ID 机制适合作分布式 ID 吗?答案是不太适合,为什么呢,我总结了下面两个原因:

1:系统水平扩展比较困难,比如定义好了步长和机器台数之后,如果要添加机器该怎么做?假设现在只有一台机器发号是 1,2,3,4,5(步长是 1),这个时候需要扩容机器一台。可以这样做:把第二台机器的初始值设置得比第一台超过很多,比如 14(注意这里设置 14 的前提是:在扩容期间第一台机器的 ID 不可能增加到 14),同时设置步长为 2,那么这台机器下发的号码都是 14 以后的偶数。然后把第一台机器的 ID 值保留为奇数,比如 7,然后修改第一台的步长为 2。让它符合我们定义的号段标准。扩容方案看起来复杂吗?貌似还好,现在想象一下如果我们线上有 100 台机器,这个时候要扩容该怎么做?简直是噩梦。所以系统水平扩展方案复杂难以实现。
2:数据库压力还是很大,每次获取 ID 都得读写一次数据库,非常影响性能,不符合分布式 ID 里面的延迟低和要高 QPS 的规则(在高并发下,如果都去数据库里面获取 id,那是非常影响性能的)

原文链接

其他分布式 ID 系列快捷键:
分布式 ID 系列(1)——为什么需要分布式 ID 以及分布式 ID 的业务需求
分布式 ID 系列(2)——UUID 适合做分布式 ID 吗
分布式 ID 系列(3)——数据库自增 ID 机制适合做分布式 ID 吗
分布式 ID 系列(4)——Redis 集群实现的分布式 ID 适合做分布式 ID 吗
分布式 ID 系列(5)——Twitter 的雪法算法 Snowflake 适合做分布式 ID 吗

大佬网址
https://www.itqiankun.com/art…
https://blog.csdn.net/hengyun…
https://tech.meituan.com/2017…
https://segmentfault.com/a/11…
https://www.jianshu.com/p/9d7…

退出移动版