- 1 -
中国科技论文在线
分布式数据库中全局唯一主键生成策略的
设计与实现#
胡云亭,王晶**
基金项目:国家 973计划项目(No. 2013CB329102);国家自然科学基金资助项目(No. 61372120,61271019,
61101119, 61121001, 61072057, 60902051)
作者简介:胡云亭(1990-),男,工学硕士,主要研究方向:业务网络智能化
通信联系人:王晶(1974-),女,副教授,主要研究方向:业务网络智能化
(北京邮电大学网络技术研究院,北京,100876) 5
摘要:随着互联网的发展以及数据的爆炸式增长,集中式数据库已经无法满足海量数据快速
存储和查询的要求了,这时分布式数据库应运而生。分布式数据库是用计算机网络物理上分
散的多个数据库单元连接起来组成的一个逻辑上统一的数据库。分布式数据库使用全局唯一
主键从逻辑上保证其数据全局的唯一性。本文提出了一种新的生成全局唯一主键的策略,通
过建立主键生成服务器集群、使用 MYSQL 相关设置属性和一致性哈希来实现全局唯一主键生10
成系统的可用性、容灾性和扩展性。此外,本文还通过实验数据来证明此策略的可用性、容
灾性和扩展性。
关键词:分布式数据库;MYSQL;一致性哈希;负载均衡
中图分类号:请查阅《中国图书馆分类法》
15
Design and Implementation of Global Unique Primary Key
Generation Strategy In Distributed Database System
HU Yunting, WANG Jing
(Beijing University of Posts and Telecommunications Institute of Technology Network, Beijing
100876) 20
Abstract: With the development of Internet and the explosive growth of the data, centralized database
has been unable to meet the requirements of massive data storage and query quickly, and then
distributed database came into being. Distributed database is a logically unified database consist of
multiple databases dispersed units in physicals. In distributed database, the global unique primary key
guarantees the uniqueness of the data on the logic. This paper proposed a new generation strategy of 25
global unique primary key. Build generation server cluster and use MYSQL settings properties and
consistent hash to achieve availability, disaster recovery and scalability. Besides, confirm the
availability, disaster recovery and scalability of this strategy according to the experiment data.
Key words: Distributed Database;MYSQL;Consistent Hash;Load Balance
30
0 引言
数据库技术在过去的几十年里为推动企业数据管理的发展做出了巨大贡献。不断发展和
完善的各种数据模型理论及其应用发挥了巨大的推动作用,使得数据的存储和管理变得更加
高效和便捷,尤其是关系数据模型理论、关系数据库以及后来的面向对象数据库的出现,更
是计算机科学发展史上的一个里程碑,已经成为互联网数据组织与管理的基础[1]。 35
随着互联网应用的广泛普及和飞速发展,现代数据的三个典型特点使得传统的集中式数
据库在应用上显得捉襟见肘、疲于应付。第一个特点是海量,全球的数据量正以指数趋势迅
猛增长,据保守估计,目前全球每年至少产生 15 亿 TB 的新数据;第二个特点是共享,互
联网和通讯设备的普及,使得人们能够享受他人提供数据所带来的好处,因此在数据库之间
- 2 -
中国科技论文在线
也建立起越来越密切的联系;第三个特点是多样化,现在数据已不再是关系模型下纯粹的结40
构化文本数据,图片、音频、视频乃至非结构化的文档都涌入到应用中。
集中式数据库没有灵活的体系结构,更容易出现单点问题,并且在出现问题后无法快速
恢复,可靠性和可用性不高。在信息和带宽不断增长的情况下,集中式数据库只能靠堆存储
和加带宽以满足要求,在性价比上不太能接受,并且带来的性能提升实在是有限。局部应用
的响应速度不够快,并且扩展性不高,不易于集成已有的系统。所以在面对海量的信息存储45
及查询时,集中式数据库显得力不从心,而分布式数据库逐渐崭露头角[2]。
分布式数据库是用计算机网络将物理上分散的多个数据库单元连接起来组成的一个逻
辑上统一的数据库。在分布式数据库中,对于从逻辑上要求保证其记录全局的唯一性的数据,
在分布式数据库系统中进行垂直划分存储到各局部节点中时候,必须保证其每条记录在整个
分布式数据库中的唯一性。在数据库中能唯一标识一条数据的最有效的属性就是主键,那么50
保证记录的全局唯一性,其实就是要保证局部节点中每条记录的主键是全局唯一的,不能重
复使用,即使删除记录,也不应该将此记录主键用于其它记录。如果多个节点上使用同一个
主键,会产生主键冲突。由此可知,在存储全局唯一性的数据时,生成具有全局唯一性的主
键的方法对于分布式数据库显得至关重要。
本文通过对现有数据库,数据中心以及对其他技术的研究和理解的基础上,针对分布式55
数据库集群,实现适应该分布式数据库集群所有数据库的唯一主键生成方法。结合现有的研
究成果以及实际情况,实现具有主键唯一性,高可用性,容灾性以及高效性特性的主键生成
方法。本文在第二章介绍几种常用的唯一主键生成方法并分别分析其优点和不足之处,在第
三章在现有方法的基础上提出一种新的唯一主键生成方法,并与其它的方法进行对比,第四
章就此提出的方法进行仿真实验论证其高可用性、容灾性以及高效性,第五章对本文进行总60
结并阐述不足之处和未来的工作重点。
1 相关工作
目前存在多种方法可以保证分布式数据库中生成的主键的唯一性。第一种常用的方法是
通过中心数据库服务器利用数据库自身的自增类型或者自增对象等生成一个唯一 ID作为主
键,这种方法虽然能保证主键唯一性,但整体的可用性维系在中心数据库服务器上,一旦在65
多线程情况下发起大量数据库存储请求,中心数据库服务器无法及时响应,系统性能迅速下
降,而且一旦崩溃,所有的集群都将无法存储数据,系统容灾性差[3]。
第二种方法是通过应用程序根据时间或其他随机属性生成一个 GUID(Globally unique
identifier, 全局唯一标识符)作为主键,这种方法比较常用,虽然实现和维护都比较简单,
但应用的计算成本较大,且 GUID的长度比较长,占用数据库的存储空间较大。一种改进的70
方法是对 GUID进行有条件的压缩,虽然减少了数据库的存储空间,但增加了 GUID的计算
成本[4]。
第三种方法是通过集群内机器编号加集群内机器的自增 ID 两个字段共同组成唯一主
键。这种方法虽然实现和维护简单并且对应用透明,但应用关联操作相对比较复杂,同时需
要两个字段来标识主键,所占空间较大,在使用 MYSQL的 INNODB引擎时副作用尤其明75
显[3]。
第四种方法是通过设置集群中每台机器自增 ID 起始点,将集群内每台机器的 ID进行
绝对的分段来实现全局主键的唯一,比如集群中有两台机器,ID 分段分别为[1,10000]和
[10001,20000],自增 ID的起始点分别为 1和 10001,之后每次 ID自增作为唯一主键。当遇
- 3 -
中国科技论文在线
到某个集群数据增长过快后,通过命令调整下一个 ID 起始位置跳过可能存在的冲突。这种80
方法的优点是实现简单,且比较容易根据 ID 大小直接判断出数据处在哪个集群,对应用透
明。缺点是维护相对较复杂,需要高度关注各个集群 ID 增长状况[5]。
第五种方法是通过在应用程序的缓存多个连续 ID 区间段,在需要新 ID 时,随机到一
个 ID 区间段中取出未分配过得 ID 作为唯一主键,如果当前 ID 区间段已经无 ID可分配,
通过计算新的 ID 区间段来替换旧的区间段。由于存在多个 ID 区间段这种方法的在性能上85
有所提高,同时后期维护比较简单,但由于所有 ID区间段的生成都依赖应用程序,实现起
来比较复杂而且容灾性很差[2]。
2 生成全局唯一主键方法
概述
尽管在分布式数据库系统中已经有多种方法能生成全局唯一主键,但这些方法都有一定90
的不足和局限性。在下面的内容里将介绍一种非常可靠并且高效的全局主键生成方案。
这个方案的整体思想是建立两台以上的数据库 ID生成服务器群,每个服务器都有一张
记录当前各表当前 ID的 Sequence表,但是 Sequence中 ID增长的步长是服务器的数量,起
始值依次错开,这样相当于把 ID的生成散列到了每个服务器节点上。例如:如果我们设置
N台数据库 ID生成服务器,那么就让第一台的 Sequence表的 ID起始值为 1,每次增长步长95
为 N,生成的 ID依次为 1,N+1,2N+1…,第二台的 Sequence表的 ID起始值为 2,每次增长
步长也为 N,生成的 ID依次为 2,N+2,2N+2…,第 N台的 Sequence表的 ID起始值为 N,
每次增长步长也为 N生成的 ID 依次为 N,2N,3N…。 通过将每台 ID 生成服务器产生的
ID错开用来保证全局主键的唯一性。通过应用程序的配合,将生成 ID的请求均匀的分散到
N 台服务器上,减小每台服务器的压力,提高服务器响应速度保证系统的高效性。 当一个100
服务器失效后,系统能够及时的知晓并自动切换到另一个服务器上获取 ID,很好的解决了
单点问题,从而保证了系统具有较强的容错性。生成方案的总体架构图如图 1。
- 4 -
中国科技论文在线
图 1 生成方案总体架构图 105
当在 MYSQL 中插入新纪录时,只要我们将主键设为自增(AUTO_INCREMENT),
MYSQL在插入记录的同时会自动生成主键字段的值,默认的 AUTO_INCREMENT的起点
值是 1,每次插入新纪录递增 1。 MYSQL 中 AUTO_INCRMENT_OFFSET 和
AUTO_INCREMENT_INCREMENT 这两个参数变量,就是用来控制 AUTO_INCREMENT110
列的列的起点值和插入新纪录时的增量值。通过对集群中的机器设置不同的
AUTO_INCREMENT_OFFSET和AUTO_INCREMENT_INCREMENT就能将保证每台 ID服
务器生成的 ID全局唯一。设置的方法见设置图 2。由于这两个变量都是数据库级别的变量,
一旦设定,整个数据库都受变量限制,因此数据库 ID生成服务器都是专用服务器,不能作
为数据存储服务器,并且服务器上只有一个数据库,数据库中 Sequence表都是用于生成 ID115
的。Sequence表中只有两个字段,ID和 OTHER字段,一张 Sequence表中只保存一条记录,
只为分布式集群中一张表生成 ID,如果需要为多张表生成 ID,则是使用多张 Sequence表。
每当有 ID请求时,在 ID生成服务器中使用 REPLACE INTO 向 sequence中插入数据,记
录 ID字段由数据库自身的机制更新,然后使用 SELECT LAST_INSERT_ID()取得新生成的
ID,整个 ID生成过程结束。ID生成服务器集群MYSQL相关设置如图 2。 120
- 5 -
中国科技论文在线
图 2 ID生成服务器集群MYSQL相关设置
负载均衡
由于有多台数据库 ID 生成服务器,在面对大量的生成 ID 请求时,需要通过负载均衡
将请求均匀的分配到多台 ID生成服务器上,减小单台服务器的压力,提高服务器响应速度125
保证系统的高效性。在本方法中,负载均衡采用一致性哈希算法来实现。
一致性哈希算法将键映射到一个 32位的数值上,取值范围为[0, 2^32-1],通过在一个圆
环上用 2^32个点进行均匀切割来表示。首先按照 hash(key)函数计算出所有 ID 生成服务器
节点的哈希值,并将其分布到 0~2^32的圆上,这里的 key用服务器所在的 IP+机器 mac地
址。每当有 ID请求时,通过相同的 hash函数计算 hash(key)求出哈希值,并映射到圆环上,130
然后从数据映射的位置开始顺时针查找直至遇到第一个生成服务器节点,即请求应该被分配
到此服务器上。例如如图 3有两台 ID生成服务器三个请求,经过哈希函数计算出的值确定
在环上的位置,然后顺时针行走,最后 Req1请求被分配到 ID Server1上,Req2和 Req3都
被分配到 ID Server2上[6]。
135
图 3 一致性哈希示例图
一致性哈希算法在 ID生成器数目过少时,可能会由于映射节点不均匀,不能将请求尽
可能的分配到所有的机器上,无法合理有效的利用所有的服务器。为了解决这种情况,引入
虚拟节点。虚拟节点是实际节点在 hash 空间的复制品,一个实际节点对应着若干个虚拟节
点,虚拟节点在 hash空间中以 hash值排列。引入虚拟节点后,映射关系从对象->节点转换140
到了对象->虚拟节点。通过构造出大量的虚拟节点,能够使 ID 请求尽量的均匀的分配到每
台 ID生成服务器上,有效的利用每台服务器。如图 3为每台服务器计算三个虚拟节点,于
- 6 -
中国科技论文在线
是可以分别计算“ID Server 1#1”、“ID Server 1#2”、“ID Server 1#3”、“ID Server 2#1”、
“ID Server 2#2”、“ID Server 2#3”的哈希值,于是形成六个虚拟节点。
扩展和容灾 145
当现有的 ID 生成服务器集群无法满足日益增长的 ID 请求时,系统应该能简单通过增
加机器而无需对系统做其它调整就能满足当前高增长的请求,所以在实际部署的时候,每台
ID生成服务器每台机器上部署了M个逻辑数据库,每个逻辑数据库承担一个物理机器的功
能。一旦当前集群无法满足高并发请求时,增加机器并且将逻辑数据库迁移到新机器上,每
次添加一倍的机器, 然后将每台机器的 1/2 逻辑数据迁移到一台新服务器上,这样能很好150
的平衡负载。
当 ID生成服务器集群中某台机器发生故障时,应用程序通过一致性哈希算法选择服务
器来处理 ID 请求的过程中,如果检测到 ID 服务器节点故障,会跳过此节点,继续顺时针
查找直至找到一个正常服务的节点,然后将 ID请求交由此节点处理。系统中就算一台或多
台机器发生故障,系统也能正常并高效提供服务,保证了系统的高容灾性。 155
3 实验
为了验证生成策略的高可用性,我们使用了 EBUPT公司提供的软硬件环境进行测试,
测试使用的服务器的 CPU为:Intel(R) Xeon(R) CPU E31240 @ ,内存为:16G,磁
盘大小为:500G。测试的步骤如下:首先测试本文采用唯一主键策略和 GUID 主键策略消
耗磁盘空间的情况,然后测试在使用集群机器时本文提出的策略和其它策略在主键 ID请求160
处理分布上的情况,最后测试下本文提出的策略的容灾性和可扩展性。
磁盘空间对比
使用本文提出的生成策略和使用 GUID主键策略对生成 200W(万),400W,600W,
800W,1000W条记录时所占的磁盘空间进行统计,统计结果如图 4,图 4横坐标单位为W,
纵坐标单位为MB。 165
从图 4可以看出,使用本文提出的生成策略所需磁盘空间远远小于 GUID主键生成策略
需要的磁盘空间,而且随着记录数的增加,二者的差距越来越大,这是因为每个 GUID所需
要的空间比本文提出策略采取的自增主键要大的多,而且差距和记录数是成线性关系的。
图 4 磁盘空间对比图 170
唯一主键 ID生成请求分布
在使用 3台服务器组成集群处理主键 ID生成过程的环境中,分别采用本文提出的生成
- 7 -
中国科技论文在线
策略和采用随机策略将 ID 生成请求路由到集群中进行处理然后将 ID 返回给应用程序。分
别统计在 200W,400W,600W,800W,1000W 请求数的情况下集群中每台机器处理请求
数的百分比。统计情况见表 1。 175
表 1 请求分布情况统计图
一致性哈希方法 普通随机方法 记录数量
Server1 Server2 Server3 Server1 Server2 Server3
200W % % % % % 19%
400W % % % % % %
600W % % % % % %
800W % % % % % %
1000W % % % % % %
从表 1中可以看出,采用本文提出的一致性哈希方法对大量的 ID生成请求进行路由,
其分布情况要比一般普通随机的分布情况要均匀很多。通过平均压力,减小单台服务器的压
力,提高服务器响应速度和保证系统的高效性。 180
容灾和扩展
在使用 3台服务器组成集群处理主键 ID生成过程的环境中,采用本文提出的生成策略,
分别人为的使集群中任意两台或一台服务器发生故障,测试此时系统是否可用;之后再恢复
发生故障的机器,测试此时恢复的机器是否能继续提供服务;最后添加一台服务器到集群,
测试此时新增加的机器是否能提供服务,即测试系统是否具有良好的扩展性。测试的结果见185
表 2。
表 2 容灾和扩展测试结果
服务器服务情况 集群情况
Server1 Svever2 Server3 Server4
系统可用性
Server1 故障 不能服务 正常服务 正常服务 正常可用
Server1 Sever2 故障 不能服务 不能服务 正常服务 正常可用
Server1 Server2 恢复正常 正常服务 正常服务 正常服务 正常可用
增加机器 Server4 正常服务 正常服务 正常服务 正常服务 正常可用
从表 2可以看出,只要集群中有任意一台机器未发生故障,整个系统就能正常运行,这
说明系统具有很好的容灾性。同时,向集群中添加机器时,系统能够快速识别出添加的机器190
并让其分担其它机器的压力,这说明系统有很好的扩展性。
4 结论
本文旨在解决在分布式数据库集群中全局唯一主键生成问题, 通过构建主键生成服务
器集群,并且利用MYSQL相关设置属性保证集群中每台机器产生的主键 ID都唯一,最后
通过一致性哈希的方法,将全局唯一主键生成请求负载均衡到集群中每台机器上来实现。通195
过实验,我们看到通过本文提出的策略能够保证分布式系统具有很好的可用性,系统有很好
的负载均衡,同时还具有很好的容灾性和扩展性。由于采用负载均衡,所以每次请求都将随
机路由到集群中某一台机器中处理,这就无法保证生成的主键 ID是时间上有序的主键 ID,
这将是本文后续需要研究的问题。
- 8 -
中国科技论文在线
[参考文献] (References)200
[1] 王作春. 分布式资源空间模型中分片技术的研究与应用[D]. 湖南:湖南科技大学, 2008.
[2] 潘昱成. 一种分布式数据库中主键唯一性生成方法[D]. 四川:四川大学, 2011.
[3] Wikipedia. Universally unique identifier[OL]. [2013-11-17].
identifier
[4] MSDN. 为 分 布 式 环 境 选 择 适 宜 的 主 键 [OL]. [2011-12-03]. 205
[5] ITEYE. 分布式主键生成策略[OL]. [2012-11-30].
[6] 姚墨涵, 谢红薇. 一致性哈希算法在分布式系统中的应用[J]. 电脑开发与应用,2012, 25(7):509-510.