- 1 -
中国科技论文在线
一种基于数据切分的分布式数据库架构的
设计
周国钢,徐雅静,蔺志青**
作者简介:周国钢(1989-) 男 硕士研究生 智能信息处理
通信联系人:徐雅静(1977-) 女 副教授 智能信息处理 文本检索. E-
(北京邮电大学信息与通信工程学院 北京 100876) 5
摘要:针对传统的集中式数据库架构在数据量大幅度增加的情况下会出现性能瓶颈的问题,
本文提出了一种基于数据切分的分布式数据库架构,有效地缓解了集中式数据库的访问压
力,提高了数据库的性能。本文主要从多数据源配置,数据切分策略以及路由寻址等方面,
结合实际的信息发布管理系统,详细描述了该分布式架构的实现机制。最后,通过实验验证10
了该分布式数据库架构的有效性。
关键词:分布式;数据切分;一致性哈希算法
中图分类号:TP392
Design of Distributed Database architecture based on data 15
segmentation
ZHOU Guogang, XU Yajing, LIN Zhiqing
(School of Information and Communication Engineering, Beijing University of Posts and
Telecommunications, Beijing 100876)
Abstract: In this paper, a new systematic architecture for the distributed database based on data 20
segmentation is put forward, which brings great breakthrough in capability and expansibility
compared with the centralized database. Combined with the information dissemination and
management system, a detailed description is made to introduce the implementation process in the
data segmentation strategy, routing rules and data migration. Experimental results show the
effectiveness of the method. 25
Key words: Distributed Database; data segmentation; consistent hashing
0 引言
大数据是最近互联网的一大热点,随着大数据时代的到来,信息呈爆炸式增长,传统的
集中式数据库架构已经难以支撑日益庞大的数据量,因此,对数据库进行分布式改造成为解30
决该问题的一个有效的方法。传统的数据库设计通常的集中式的,将独立的业务实体抽象成
单张数据表,但是当单表的数据量达到千万级别的情况下,它的查询与插入性能都会有一定
程序的下降,而且维护起来非常困难。所以在访问量大,负载高的 Web 系统中,对数据库
进行物理上的拆分,将一个数据库中的数据按照一定的规则分布到多个不同的数据库当中,
并将以前对单个数据库的请求分摊到多个不同的数据库中,很好地缓解了数据库的访问压35
力,而且数据切分同时还可以提高系统的总体可用性,因为单个数据库出现问题的时候,只
有那一个数据库中的数据无法访问,而分布在其它数据库中的数据不会受到影响,可以正常
访问。常见的数据切分方式有水平切分和垂直切分[1]。
本文设计了一种基于数据水平切分的分布式数据库架构,采用一致性哈希算法将数据拆
分到不同的数据库中,在每一个分库中将数据量特别大的业务表按照主键进行切分,分布到40
n 张小表中,提高单张表的查询效率。并通过建立一个全局库来保证各业务表主键的全局唯
- 2 -
中国科技论文在线
一性。
1 系统架构
与传统的集中式数据库架构[2]对比如图 1 所示,本文设计的基于数据切分的分布式数据
库架构按照分层设计依然分为 Action 层,Service 层和 Data 层,其中 Data 层是分布式数据45
库的核心。
Action 层:负责处理用户的输入,增加了数据源的设置用来存储不同用户对应的分库位
置信息;
Service 层:业务逻辑层,负责调用 Data 层封装的数据操作接口来处理所有的业务逻辑;
Data 层:该层又分为数据访问对象(Data Access Objects, DAO)和数据库两部分,其中50
DAO 子层中增加了路由寻址功能来定位用户请求数据在分库中的位置,增加了数据源更改
功能来实现全局库与分库的数据源切换功能,增加了全局库用来存储经常访问的、不需要被
切分的数据表以及确保切分后数据 ID 的全局唯一性。
封装数据库操作
业务逻辑
处理用户输入
Service层
Data层
Action层
数据库
全局库
封装数据库操作
一致性哈希
分库 1 分库 2 分库 n
业务逻辑
请求拦截 数据源设置
路由寻址 数据源更改
……
DAO层
a 集中式架构 b 分布式架构 55
图 1 系统架构对比图
2 系统详细设计
多数据源配置
由于用户所访问的数据分布在不同的数据库中,因此需要在 Action 层的进行数据源配
置,方便数据源的动态切换。本系统中使用 Spring 的数据源路由抽象类和 Java 线程的本地60
变量 ThreadLocal[3]来进行多数据源的配置。调用路由抽象类 AbstractRoutingDataSource 类中
的 determineCurrentLookupKey 方法返回需要使用的数据源的 Key 值,根据此 Key 值去查找
已经配置好的数据源列表,若找到相应的数据源则返回该信息;否则,返回预定义的默认数
据源。其中数据源列表的配置参数如表 1 所示:
表 1 数据源配置参数 65
配置项 说明
TargetDataSource 数据源列表
Key 数据源标识
Value 数据源具体信息
DefaultTargetDataSource 默认数据源
- 3 -
中国科技论文在线
由于返回的数据源信息并不是线程安全的,因此在多线程环境下需要利用 ThreadLocal
来解决线程安全问题。ThreadLocal 在每个线程中都保留一份本地变量的副本用于线程的访
问,由于每个线程的变量副本是独立的,因此很好地避免了线程冲突。系统通过设置一个静
态的 ThreadLocal 变量持有数据源信息来实现该功能。通过 Spring 动态配置多数据源,能够70
方便地对多个数据库实例进行管理,有效地提高了系统的水平伸缩性。
数据切分策略
常见的数据切分(Sharding)策略有两种:水平切分和垂直切分。
(1) 垂直切分
垂直切分是将业务联系紧密,表之间有密切关联的表划分在一起。它的最大特点是切分75
策略简单,操作也比较方便,当系统中各种业务之间是低耦合的情况下,这种切分策略非常
有效。在这种 Web 应用系统中,由于系统的耦合性低,业务结构清晰,所以可以将一类逻
辑结合比较紧密的模块进行抽离,组合在一起划分到一个数据库中,这样对业务来说影响也
很小,拆分策略也会比较简单清晰。但缺点是:由于表数据库被分拆到不同的数据库,所以
所有的表关联都必须在应用程序中完成,无法在数据库层面上进行;无法解决单表数据量过80
大或者访问过于频繁对系统性能造成的影响。分布式事务处理是一个相对来说很复杂的问
题;切分达到一定程序之后,扩展性会遇到限制;而且过度的切分对应用程序的维护来说也
变得更加困难。
(2) 水平切分
水平切分针对的是表数量不多,但是每张表中的数据量特别大的情况下采取的切分方85
式,这种拆分方式会将同一个表中的不同数据拆分到多张数据表中,一般会通过某种规则(比
如将 ID 进行散列)进行切分。水平切分的优点是:所有的表物理上位于相同的数据库上,
可以进行数据库层面的表关联操作;由于是水平切分,单表数据量会大大减少,不会存在数
据量特别大的表,所以不会有访问方面的系统瓶颈;应用程序端只需要进行少量的改动即可;
事务处理相对简单;好的切分规则可以保证系统良好的可扩展性。但是水平切分也有它的不90
足:首先切分规则相对更为复杂,很难有一个满足所有要求的切分策略;因为是将一张表中
的数据进行了拆分,所以对于数据的人工定位就变得更加困难,而且不利于后期的系统维护,
后期分库数据量增大后的数据迁移也是一个困难。
本系统的数据逻辑比较简单,功能模块也比较清晰,但是随着用户量的增加,每个业务
实体对应的数据表中的数据大量增加,导致单张数据表的查询效率降低,所以本系统采用的95
是水平的数据切分方式,将一张表的数据通过散列分布到 n 张小表当中,提高单张表的查询
效率,为了保证切分后数据的全局 ID 唯一性,以备将来的数据迁移,在系统中引入了全局
库的概念。
全局库的引入是为了保证所有水平切分后的小表中数据的主键是全局唯一的,当做数据
迁移的时候,不致出现主键重复的问题。通过 Spring 的切面编程,在所有业务实体保存操100
作之前加入一个切面,在这个切面里先将请求线程 ThreadLocal 中的数据源置为全局库的数
据源,在全局库的相应表中插入一条记录来获取全局唯一的 ID 值。然后再将 ThreadLocal
中的数据源还原为之前的数据源,并将这个具有全局唯一 ID 的业务实体插入到相应的分库
的表中。全局库的另一个作用是对一些需要频繁访问的数据表,比如在信息发布管理系统中
的设备表,放置在全局库中,这样可以省去路由寻址的步骤,提高访问效率。 105
- 4 -
中国科技论文在线
路由寻址
路由寻址模块处于系统 Data 层的 DAO 子层。从一个系统的程序架构层面来看,路由查
找逻辑可以在 DAO 层、JDBC API 层、介于 DAO 与 JDBC 之间的 Spring 数据访问封装层(各
种 spring 的 template)以及介于应用服务器与数据库之间的代理服务器四个层面上实现[4]。各
种实现方式的优缺点如表 2 所示: 110
表 2 在各层实现路由寻址的优缺点
实现层面 优缺点
数据访问层(DAO) 适合在该层进行自主开发,开发工作量大
ORM 框架层 可以在框架进行开发,现阶段支持不好
JDBC API 层 切分对整个应用程序透明,开发要求高
Spring 数据访问封装层 对上层透明
代理层 需要对 SQL 进行解析
本系统在 DAO 层通过一致性哈希算法实现路由寻址。一致性哈希算法[5](Consistent
Hashing Algorithm)是一种重要的分布式算法,负载均衡中常常使用到这种算法来解决一般
哈希算法中存在的热点问题。它优于传统取模算法的地方在于,它可以解决取模算法无法应115
对的增删服务器的问题。一致性哈希算法的示意图如图 2 所示:
232-1 0
DB2
DB3
DB1
A
D
B
C
DB4
E
F
数据库节点
用户节点
图 2 一致性哈希算法示意图
新用户注册时获得一个全局唯一的用户 ID,通过哈希函数 H 将该 ID 哈希到一个圆环
空间中(比如值空间为 0-232-1 的环空间),然后将各个数据库也映射到该环空间中,即所120
有的用户 ID 和数据库服务器都映射成为这个圆环空间上的一些节点,如果用户节点没有对
应到具体的某一个数据库节点,那么顺时针查找,直到第一次找到有映射的节点,该节点就
是用户所处的数据库节点,如果超过了 232 仍然找不到节点,则命中第一个数据库节点,路
由寻址时,根据得到的数据源的信息找到相应的分库,然后将所要查找业务实体的 ID 按 n
取余来获取所要访问分表的位置信息,最后找到所要访问数据的具体位置。 125
3 实验与结果分析
本系统有 10 台数据库服务器,分别为 dbBasic,db01~db09。其中 dbBasic 为全局库,
db01~db09 都为分库,每台数据库服务器的配置都为 Intel® Core™ 2 Duo CPU
E4500@,内存为4GB,操作系统为 Windows Server 2003;
对系统采用 JMeter[6]进行压力测试,分析集中式架构和分布式架构数据库的性能情况。130
- 5 -
中国科技论文在线
JMeter 配置如表 3 所示:
表 3 JMeter 配置参数
配置项 含义 本实验中的值
线程数 并发的用户数 1000 个
启动延迟时间 在多长时间内启动所有的测试用户 10 秒
循环次数 进行多少次这样的测试 10 次
取样器错误后要执行的操作 出错后可以选择停止测试或者继续测试 继续
用 JMeter 对两种数据库架构的系统进行压力测试后,输出的聚合报告如表 4 所示:
表 4 测试结果 135
Sample(个) Average(毫秒) Min(毫秒) Max(毫秒)
集中式架构 17000 565 91 1071
分布式架构 17000 427 22 1529
从表 4 的测试结果可以看出,运用分布式架构后平均数据访问时间缩短了约 24%,说
明分布式架构能够提高系统性能。针对最小数据访问时间,分布式架构远小于集中式架构,
原因是因为分布式架构在全局库中存放了一些访问频繁的表,加快了访问速度,针对最大数
据访问时间,因为分布式架构增加了路由寻址到分库的操作,最坏情况下会比集中式架构慢。 140
4 结论
本文设计并提出了一种基于数据切分的分布式系统架构,不仅提高了系统的访问效率,
而且增加了系统的可靠性。而且在系统中运用一致性哈希进行数据库拆分,有效地提高系统
的水平伸缩性。通过在信息发布管理系统中的实际运用,达到了提升系统性能的目的。
尽管通过本系统的分布式架构可以提升一部分系统性能,但是全局库中在数据大量增加145
的情况下也会成为整个系统的性能瓶颈,因此在全局库的前端增加缓存系统是本系统下一步
的优化方向。
[参考文献] (References)
[1] 姚梅.分布式数据库中数据复制及数据分片的应用[J].电脑知识与技术,2011,07(36):9328-9329.
[2] 岳立营.浅谈分布式数据库的数据存储[J].科技创新导报,2011,(6):112-112. 150
[3] 孔浩 ,全晓松 ,姜娜等 .ThreadLocal 在分层体系架构的业务系统中的设计分析 [J].绵阳师范学院学
报,2012,31(2):85-87.
[4] 柳清瑞.中间件的负载均衡技术研究[J].小型微型计算机系统,2002,23(3):374-376.
[5] 杨或剑,林波.分布式存储系统中一致性哈希算法的研究[J].电脑知识与技术,2011,07(22):5295-5296.
[6] 佘青.利用 Apache Jmeter 进行 Web 性能测试的研究[J].智能计算机与应用,2012,02(2):55-57. 155