一种数据的迁移方法和系统技术领域
本发明涉及计算机技术领域,尤其涉及一种数据的迁移方法和系统。
背景技术
随着互联网网站的兴起,传统的关系数据库在应付超大规模和高并发的社会性网
络服务(Social Networking Serivces,SNS)类型的web2.0纯动态网站存在很多难以克服
的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展,NoSQL数据库可
以解决大规模数据集合带来的挑战,尤其是大数据应用难题。
MongoDB是一种分布式的NoSQL数据库,旨在为网络应用提供可扩展的高性能数据
存储解决方案。MongoDB介于关系数据库和非关系数据库之间,MongoDB支持的查询语言非
常强大,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立
索引。
MongoDB有三个组件:Mongos,ConfigSvr,Mongod,Mongos根据管理员设置的片键
将数据分摊到自己管理的Mongod集群,ConfigSvr保存配置信息。MongoDB在逻辑上将一张
数据库表拆分成8192个数据块(chunk),在MongoDB原生的迁移方案中,每个Mongos上设置
一个平衡(balancer)模块,chunk迁移由balancer模块执行,balancer模块并不是一个独立
的服务,而是Mongos的一个线程模块,Mongos在ConfigServer中通过注册分布式锁来保证
同一时间只有一个balancer模块在执行。Balancer模块对于每一个数据库表的chunk分布,
计算出这个数据库表需要进行迁移的chunk,以及每个chunk需要迁移到哪个数据库表上。
计算的过程在BalancerPolicy类中实现。对于每一个数据库表,尝试获得该数据库表的分
布式锁。MongoDB的数据迁移过程中,所有的数据库表共享同一个分布式锁,如果获得分布
式锁成功,则向源数据分片发起数据块迁移命令,如果获得分布式锁失败,表明该数据库表
已有正在执行迁移任务,因此对于同一张数据库表在同一时刻只能有一个迁移任务,即使
这张数据库表分布在不同的数据分片上,由于所有的数据库表共享同一个分布式锁,也只
能等待前一个数据库表使用完分布式锁后再进行分布式锁的分配。
通过前述对原生MongoDB的迁移方案可知,现有技术至少存在如下技术缺陷:1)、
现有的原生MongoDB迁移方案采用在线实时数据进行迁移,这就需要读取源数据分片上的
数据块,读取这部分数据块时会影响用户对Mongod的正常读写,导致用户读写数据块失败。
2)、原生MongoDB迁移方案中,数据的迁移受到分布式锁的限制是一个单线程的过程,数据
迁移的效率很低。
发明内容
本发明实施例提供了一种数据的迁移方法和系统,用于在不影响用户正常读写数
据块的情况下完成数据块的迁移,并且具有很高的数据迁移效率。
为解决上述技术问题,本发明实施例提供以下技术方案:
第一方面,本发明实施例提供一种数据的迁移方法,所述数据的迁移方法应用于
数据的迁移系统,所述数据的迁移系统包括:中控节点、第一分片存储单元、第二分片存储
单元、数据备份子系统,其中,
所述第一分片存储单元上配置有第一代理节点,所述第二分片存储单元上配置有
第二代理节点,所述第一代理节点分别和所述中控节点、所述数据备份子系统建立有通信
连接,所述第二代理节点分别和所述中控节点、所述数据备份子系统建立有通信连接,所述
第一分片存储单元上存储的数据块通过所述第一代理节点备份到所述数据备份子系统中,
所述第二分片存储单元上存储的数据块通过所述第二代理节点备份到所述数据备份子系
统中;
所述数据的迁移方法,包括:
所述中控节点向所述第一代理节点发送数据迁移命令,所述第一代理节点为数据
迁移的源节点;
所述第一代理节点接收到所述中控节点发送的数据迁移命令之后,所述第一代理
节点通过所述数据备份子系统获取到需要迁移的第一数据块;
所述第一代理节点将所述需要迁移的第一数据块发送给所述第二代理节点,所述
第二代理节点为数据迁移的目的节点;
所述第二代理节点将所述需要迁移的第一数据块导入到所述第二分片存储单元
中。
第二方面,本发明实施例还提供一种数据的迁移系统,包括:
所述数据的迁移系统包括:中控节点、第一分片存储单元、第二分片存储单元、数
据备份子系统,其中,
所述第一分片存储单元上配置有第一代理节点,所述第二分片存储单元上配置有
第二代理节点,所述第一代理节点分别和所述中控节点、所述数据备份子系统建立有通信
连接,所述第二代理节点分别和所述中控节点、所述数据备份子系统建立有通信连接,所述
第一分片存储单元上存储的数据块通过所述第一代理节点备份到所述数据备份子系统中,
所述第二分片存储单元上存储的数据块通过所述第二代理节点备份到所述数据备份子系
统中;
所述中控节点,用于向所述第一代理节点发送数据迁移命令,所述第一代理节点
为数据迁移的源节点;
所述第一代理节点,用于接收到所述中控节点发送的数据迁移命令之后,所述第
一代理节点通过所述数据备份子系统获取到需要迁移的第一数据块;
所述第一代理节点,还用于将所述需要迁移的第一数据块发送给所述第二代理节
点,所述第二代理节点为数据迁移的目的节点;
所述第二代理节点,用于将所述需要迁移的第一数据块导入到所述第二分片存储
单元中。
从以上技术方案可以看出,本发明实施例具有以下优点:
在本发明实施例中,数据的迁移系统中包括:中控节点、第一分片存储单元、第二
分片存储单元、数据备份子系统,该数据备份子系统内存储有第一分片存储单元的数据块
和第二分片存储单元的数据块。中控节点向第一代理节点发送数据迁移命令,第一代理节
点为数据迁移的源节点;第一代理节点接收到中控节点发送的数据迁移命令之后,第一代
理节点通过数据备份子系统获取到需要迁移的第一数据块;第一代理节点将需要迁移的第
一数据块发送给第二代理节点,第二代理节点为数据迁移的目的节点;第二代理节点将需
要迁移的第一数据块导入到第二分片存储单元中。由于数据的迁移系统中独立于所有的分
片存储单元设置有中控节点,第一数据块的迁移由中控节点来控制,不需要再受到分布式
锁的限制,因此当第一数据块有多个时每个第一数据块都可以独立完成迁移,因此数据迁
移的效率很高,另外本发明实施例中第一代理节点在迁移第一数据块时并不从第一分片存
储单元读取,而是从数据备份子系统中读取提前备份的第一数据块,用户仍可以正常从第
一分片存储单元完成读写操作。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使
用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于
本领域的技术人员来讲,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种数据的迁移系统的组成示意图;
图2为本发明实施例提供的一种数据的迁移方法的流程方框示意图;
图3-a为本发明实施例中基于MongoD实现的数据的迁移系统的系统架构示意图;
图3-b为本发明实施例提供的数据增量备份的示意图;
图4为本发明实施例提供的基于MongoD实现的路由广播流程示意图;
图5为本发明实施例提供的基于MongoD实现的数据快照恢复流程示意图;
图6为本发明实施例提供的数据快照使用多线程的示意图;
图7为本发明实施例提供的基于MongoD实现的增量备份日志恢复流程示意图;
图8为本发明实施例提供的多个增量备份日志使用多个发送线程的示意图;
图9为本发明实施例提供的基于MongoD实现的路由切换流程示意图;
图10-a为本发明实施例提供的另一种数据的迁移系统的组成示意图;
图10-b为本发明实施例提供的另一种数据的迁移系统的组成示意图;
图11为本发明实施例提供的分片存储单元应用于服务器的组成结构示意图。
具体实施方式
本发明实施例提供了一种数据的迁移方法和系统,用于在不影响用户正常读写数
据块的情况下完成数据块的迁移,并且具有很高的数据迁移效率。
为使得本发明的发明目的、特征、优点能够更加的明显和易懂,下面将结合本发明
实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,下面所描述
的实施例仅仅是本发明一部分实施例,而非全部实施例。基于本发明中的实施例,本领域的
技术人员所获得的所有其他实施例,都属于本发明保护的范围。
本发明的说明书和权利要求书及上述附图中的术语“包括”和“具有”以及他们的
任何变形,意图在于覆盖不排他的包含,以便包含一系列单元的过程、方法、系统、产品或设
备不必限于那些单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固
有的其它单元。
本发明实施例提供的数据的迁移方法具体可以应用于数据块在分片存储单元之
间的迁移场景,用于解决现有技术中数据块迁移的低效率以及影响用户正常读写操作的问
题。在本发明实施例提供的数据的迁移方法中,涉及到中控节点、多个分片存储单元、数据
备份子系统等系统网元。本发明实施例中在数据的迁移系统中设置一中控节点,该中控节
点是调度数据块迁移的管理设备,各个分片存储单元之间的数据块迁移都在中控节点的管
理下完成。分片存储单元是存储数据分配的存储设备,例如分片存储单元可以是Mongod集
群,也可以是其它的分布式存储集群,例如实现Web服务的共享存储集群等,在每个分片存
储单元上设置有一个代理节点(Agent),该代理节点和中控节点进行通信,用户通过代理节
点做数据监控与模块部署,代理节点可以完成任务分发。本发明实施例中除了使用分片存
储单元来存储数据块,在数据的迁移系统中还设置有数据备份子系统,每个分片存储单元
中存储的数据块都在数据备份子系统中有备份,并且代理节点可以和数据备份子系统进行
交互,完成数据块的读写操作请求。例如,该数据备份子系统可以是分布于存储系统,例如
分布式文件系统(Hadoop Distributed File System,HDFS)。
在本发明实施例提供的数据的迁移系统中,请参阅图1所示,数据的迁移方法应用
于数据的迁移系统100,数据的迁移系统100包括:中控节点101、第一分片存储单元102、第
二分片存储单元103、数据备份子系统104,其中,
第一分片存储单元102上配置有第一代理节点1021,第二分片存储单元103上配置
有第二代理节点1031,第一代理节点1021分别和中控节点101、数据备份子系统104建立有
通信连接,第二代理节点1031分别和中控节点101、数据备份子系统104建立有通信连接,第
一分片存储单元102上存储的数据块通过第一代理节点1021备份到数据备份子系统104中,
第二分片存储单元103上存储的数据块通过第二代理节点1031备份到数据备份子系统104
中。
请参阅图2所示,本发明实施例提供的数据的迁移方法,可以包括如下步骤:
201、中控节点向第一代理节点发送数据迁移命令,第一代理节点为数据迁移的源
节点。
在本发明实施例中,中控节点是调度数据块迁移的管理设备,各个分片存储单元
之间的数据块迁移都在中控节点的管理下完成。当第一分片存储单元需要迁移数据时,第
一分片存储单元中配置的第一代理节点为数据迁移的源节点,中控节点向第一代理节点发
送数据迁移命令。该数据迁移命令中可以携带需要迁移的数据块标识。举例说明如下,分布
式存储集群中包括有多个分片存储单元,当分布式存储集群需要扩容时,新上架一个分片
存储单元,此时就需要将已有的分片存储单元上保存的部分数据块搬迁到新的分片存储单
元上,从而实现数据均衡。又如某个分片存储单元的负载过低,为了节约成本,分布式存储
集群进行缩容,将需要下架的分片存储单元上的数据块均衡的搬迁到其他分片存储单元
上。
在本发明实施例中,中控节点可以作为数据块迁移的控制端,各个代理节点和中
控节点建立有通信连接,各个代理节点在中控节点的控制下完成数据块迁移,数据块迁移
由中控节点来控制,不需要再受到分布式锁的限制,有数据块需要迁移时每个数据块都可
以独立完成迁移,因此数据迁移的效率很高。举例说明如下,在数据迁移的系统中有两个分
片存储单元都需要数据块迁移,则中控节点可以按照步骤201的方式向两个分片存储单元
上的代理节点分别发送数据迁移命令。
202、第一代理节点接收到中控节点发送的数据迁移命令之后,第一代理节点通过
数据备份子系统获取到需要迁移的第一数据块。
在本发明实施例中,第一代理节点分别和中控节点、数据备份子系统建立有通信
连接,若该第一代理节点接收到中控节点的数据迁移命令,由于数据备份子系统内存储有
第一分片存储单元的数据块,则第一代理节点可以通过数据备份子系统获取到在数据备份
子系统备份存储的第一数据块,此时第一分片存储单元中虽然正在执行对第一数据块的迁
移指令,但是第一代理节点并不影响第一分片存储单元对用户正常操作的响应。
203、第一代理节点将需要迁移的第一数据块发送给第二代理节点,第二代理节点
为数据迁移的目的节点。
在本发明实施例中,第一代理节点确定需要迁移的第一数据块之后,若该第一数
据块需要迁移到第二分片存储单元,第二分片存储单元上配置有第二代理节点,该第二代
理节点为数据迁移的目的节点。第一代理节点可以将需要迁移的第一数据块发送给第二代
理节点。例如第一代理节点在中控节点的调度下完成第一代理节点和第二代理节点的通
信。又如,第一代理节点和第二代理节点通过内部通信协议完成第一数据块的通信。
204、第二代理节点将需要迁移的第一数据块导入到第二分片存储单元中。
在本发明实施例中,第二代理节点从第一代理节点接收到需要迁移的第一数据
块,然后第二代理节点再将需要迁移的第一数据块导入到第二分片存储单元中,从而完成
第一数据块的迁移过程。
需要说明的是,本发明实施例中,步骤201至步骤204描述了对需要迁移的第一数
据块的迁移过程,可以理解的是,在数据的迁移系统,若还有其它的数据块,例如第二数据
块和第三数据块需要迁移,则都可以按照步骤2011至步骤204对第一数据块的迁移过程来
实现第二数据块以及第三数据块的迁移,从而本发明实施例中可以实现多个数据块的并发
迁移。
在本发明的一些实施例中,除了执行前述步骤之外,本发明实施例提供的数据的
迁移方法中,还包括如下步骤:
A1、中控节点将数据库表中的所有数据拆分为多个数据块;
A2、中控节点将多个数据块中的一些数据块发送给第一代理节点,并将多个数据
块中的其余数据块发送给第二代理节点;
A3、第一代理节点将接收到的一些数据块导入到第一分片存储单元中;
A4、第二代理节点将接收到的另一些数据块导入到第二分片存储单元中。
在本发明的前述实施例中,对于每张数据库表的所有数据,中控节点在逻辑上将
所有数据拆分成多个数据块,具体拆分的块数与数据库表的大小以及拆分方式有关,例如
可以将一张数据表拆分为8192个数据块(chunk)。在数据的迁移系统中包括:第一分片存储
单元和第二分片存储单元,中控节点将多个数据块分配到第一分片存储单元和第二分片存
储单元,若在数据的迁移系统中还第三分片存储单元,则中控节点也可以向第三分片存储
单元分配数据块,此处不做限定。
进一步的,在本发明的一些实施例中,该数据的迁移系统还包括:键值存储设备,
键值存储设备和中控节点之间建立有通信连接。步骤A1中控节点将数据库表中的所有数据
拆分为多个数据块之后,本发明实施例提供的数据的迁移方法中,还包括如下步骤:
B1、中控节点根据多个数据块创建路由表,路由表包括:多个数据块中每个数据块
与对应的分片存储单元的分片标识、工作状态之间的映射关系,每个数据块与对应的分片
存储单元的工作状态包括:正常状态和禁止写入状态;
B2、中控节点将路由表存储到键值存储设备中。
其中,键值存储设备用于存储路由表,中控节点和键值存储设备相连接,该键值存
储设备也可以称为一致性存储设备,键值存储设备可以使用一致性算法保证数据的强一致
性,例如键值存储设备可以是Etcd,Etcd是一个高可用的键值存储系统,主要用于共享配置
和服务发现。中控节点创建的路由表保存在键值存储设备中,每个路由表的更改都需要修
改键值存储设备。在本发明实施例中,路由表包括:多个数据块中每个数据块与对应的分片
存储单元的分片标识、工作状态之间的映射关系,每个数据块与对应的分片存储单元的工
作状态包括:正常状态和禁止写入状态。例如在路由表中记录有chunk_id->(shard_id,
state)的映射关系,chunk_id表示数据块的标识,shard_id是分片存储单元的分片标识,
state表示分片存储单元的工作状态,每个数据块与对应的分片存储单元的工作状态包括:
正常状态(NORMAL)和禁止写入状态(FORBID_WRITE),正常状态指的是分片存储单元可以为
正常提供数据块的读写操作请求,禁止写入状态指的是分片存储单元被禁用,无法提请读
写操作请求。
进一步的,在前述中控节点在键值存储设备中存储路由表的场景下,在本发明的
一些实施例中,步骤204第二代理节点将需要迁移的第一数据块导入到第二分片存储单元
中之后,本发明实施例提供的数据的迁移方法中,还包括如下步骤:
C1、第二代理节点向中控节点上报迁移成功消息;
C2、中控节点根据迁移成功消息将路由表中记录的第一数据块的映射关系从第一
分片存储单元更改为第二分片存储单元。
其中,第一数据块在路由表中记录的映射关系是第一数据块存储在第一分片存储
单元,若第一数据块迁移到第二分片存储单元,则路由表需要更改,中控节点可以修改键值
存储设备。
进一步的,在前述中控节点在键值存储设备中存储路由表的场景下,在本发明的
一些实施例中,数据的迁移系统还包括:网关(Proxy)模块,第一代理节点和第二代理节点
都通过网关模块和中控节点之间建立有通信连接。步骤C1中控节点根据迁移成功消息将路
由表中记录的第一数据块的映射关系从第一分片存储单元更改为第二分片存储单元之后,
本发明实施例提供的数据的迁移方法中,还包括如下步骤:
D1、中控节点通过网关模块向第一代理节点和第二代理节点广播路由表的存储单
元更改消息。
具体的,在第一代理节点和中控节点之间、第二代理节点和中控节点之间都部署
有网关模块,则中控节点与第一代理节点之间的通信可以通过网关模块来完成。例如步骤
C1中控节点修改键值存储设备之后,中控节点向网关模块发送路由表的存储单元更改消
息,网关模块可以向所有的代理节点广播路由表的存储单元更改消息。
进一步的,在前述中控节点在键值存储设备中存储路由表的场景下,步骤202第一
代理节点通过数据备份子系统获取到需要迁移的第一数据块之前,本发明实施例提供的数
据的迁移方法中,还包括如下步骤:
E1、第一代理节点向中控节点发送封禁路由请求;
E2、中控节点根据封禁路由请求将路由表中记录的第一分片存储单元的工作状态
从正常状态更改为禁止写入状态;
E3、中控节点向网关模块广播路由表的工作状态更改消息;
E4、网关模块根据路由表的工作状态更改消息封禁对第一分片存储单元的操作处
理请求。
其中,在数据迁移过程中,用户在源源不断的将数据写入到第一分片存储单元中,
在第一分片存储单元进行数据块迁移之前,中控节点可以修改第一分片存储单元的工作状
态,从正常状态更改为禁止写入状态,网关模块根据路由表的工作状态更改消息封禁对第
一分片存储单元的操作处理请求,此时用户无法再对第一分片存储单元进行操作处理请
求,以避免用户将数据写入到第一分片存储单元,但是无法迁移到第二分片存储单元中造
成用户数据丢失的问题。
在本发明的一些实施例中,除了执行前述步骤之外,本发明实施例提供的数据的
迁移方法中,还包括如下步骤:
F1、中控节点定期的向第一代理节点和第二代理节点发起备份任务;
F2、第一代理节点根据备份任务定期的将第一分片存储单元上存储的数据块备份
到数据备份子系统中;
F3、第二代理节点根据备份任务定期的将第二分片存储单元上存储的数据块备份
到数据备份子系统中。
其中,数据备份子系统作为所有分片存储单元的数据备份实体,中控节点可以控
制各个代理节点的数据备份,例如中控节点定期的触发备份任务,则每个代理节点都可以
定期的将其所在的分片存储单元上存储的数据块备份到数据备份子系统中,从而数据备份
子系统可以在数据迁移过程中向代理节点提供数据块备份,因此代理节点不需要再通过分
片存储单元进行数据块迁移,从而不影响分片存储单元对用户正常读写操作请求的响应。
进一步的,在本发明的一些实施例中,步骤F2第一代理节点根据备份任务定期的
将第一分片存储单元上存储的数据块备份到数据备份子系统中,具体包括:
F21、若第一代理节点在启动运行后第一次接收到备份任务,第一代理节点对第一
分片存储单元上存储的当前所有数据块进行备份从而生成数据快照,将数据快照备份到数
据备份子系统中;
F22、若第一代理节点不是第一次接收到备份任务,第一代理节点从第一分片存储
单元上获取用于记录第一分片存储单元被修改的增量备份日志,将增量备份日志备份到数
据备份子系统中。
其中,本发明实施例中,数据的迁移系统中的所有代理节点都可以使用增量备份
的方式,例如步骤F21至F22中对第一代理节点的增量备份过程进行了说明,则第二代理节
点也可以按照该方式完成增量备份过程。具体的,若第一代理节点在启动运行后第一次接
收到备份任务,第一代理节点对第一分片存储单元上存储的当前所有数据块进行备份从而
生成数据快照,将数据快照备份到数据备份子系统中。若第一代理节点不是第一次接收到
备份任务,第一代理节点每次从第一分片存储单元上获取从上一次备份到本次备份期间产
生的增量备份日志,将增量备份日志备份到数据备份子系统中。例如分片存储单元具体为
MongoD存储集群,在第一次备份时需要对MongoD存储集群中的所有数据块生成数据快照
Snapshot,之后每次备份只需要做增量备份,第一代理节点扫描第一分片存储单元的存储
日志就可以获取到增量备份日志OplogDump,不需要每次都对第一分片存储单元进行全局
备份,提高数据块的备份效率。
在现有技术提供的原生MongoDB迁移方案中,一张数据库表在同一时刻只有一个
迁移任务,即使该数据库表分在多个不同的数据分片上,也无法实现并发的数据块迁移,并
且原生MongoDB迁移方案中,数据的迁移受到分布式锁的限制是一个单线程的过程,因此数
据迁移的效率很低。进一步的,本发明实施例中为了解决该问题,还可以同时使用多个线程
来并发的完成数据块的迁移。在前述执行步骤F21至步骤F22的实现场景下,具体的,步骤
202第一代理节点通过数据备份子系统获取到需要迁移的第一数据块,包括:
G1、第一代理节点从数据备份子系统获取到需要迁移的第一数据快照;
G2、第一代理节点将第一数据快照划分为多个快照分块;
G3、第一代理节点调用线程池中的多个线程从多个快照分块中过滤出需要迁移的
快照分块,需要迁移的快照分块属于第一数据块。
具体的,本发明实施例中,第一代理节点确定需要迁移第一数据快照时,可以将第
一数据快照划分为多个快照分块,第一代理节点调用线程池中的多个线程从多个快照分块
中过滤出需要迁移的快照分块,需要迁移的快照分块属于第一数据块。例如,第一数据快照
对应的多个快照分块之间具有无关的特性,可以使用多个分块过滤器同时对多个快照分块
进行过滤,则可以确定出需要迁移的快照分块,大幅提高了数据块迁移的效率。
在前述执行步骤G1至步骤G3的实现场景下,具体的,若数据备份子系统中还保存
有第一分片存储单元中的增量备份日志,如前述步骤F21至步骤F22所示的应用场景,则步
骤202第一代理节点通过数据备份子系统获取到需要迁移的第一数据块,还包括:
G4、第一代理节点调用线程池中的多个线程从多个快照分块中过滤出需要迁移的
快照分块之后,第一代理节点从数据备份子系统获取到需要迁移的第一增量备份日志;
G5、第一代理节点将需要迁移的第一增量备份日志按照日志标识进行分组得到不
同组的第一增量备份日志,不同组的第一增量备份日志属于第一数据块。
其中,第一代理节点可以根据数据迁移指令从数据备份子系统获取到需要迁移的
第一增量备份日志,多个第一增量备份日志分别是对数据库表中单个行的数据,数据库表
内行与行之间具有无关的特性,因此可以按照日志标识对需要迁移的第一增量备份日志进
行分组,得到不同组的第一增量备份日志,不同组的第一增量备份日志属于第一数据块。
在前述执行步骤G1至步骤G3、步骤G4和步骤G5的实现场景下,具体的,除了数据备
份子系统中保存的第一分片存储单元的数据快照和增量备份日志。在数据迁移过程中,用
户在源源不断的将数据写入到第一分片存储单元中,在第一分片存储单元进行数据块迁移
之前,中控节点可以修改第一分片存储单元的工作状态,从正常状态更改为禁止写入状态,
在第一分片存储单元状态更改为禁止写入状态之前,仍会有数据写入到第一分片存储单元
中,在这种实现场景下,步骤202第一代理节点通过数据备份子系统获取到需要迁移的第一
数据块,还包括:
G6、第一代理节点从数据备份子系统获取到需要迁移的第一增量备份日志之后,
第一代理节点根据第一增量备份日志对应的备份时间戳从第一分片存储单元上获取从备
份时间戳到当前时间已存储的残余增量日志,残余增量日志属于第一数据块。
其中,第一代理节点从数据备份子系统获取到需要迁移的第一增量备份日志之
后,第一代理节点从数据备份子系统获取到第一增量备份日志对应的备份时间戳,第一代
理节点还需要从第一分片存储单元上获取从备份时间戳到当前时间已存储的残余增量日
志。举例说明,在导入第一增量备份日志的过程中,用户还是有数据源源不断的写入第一分
片存储单元,用户的写入会被记录到第一分片存储单元的日志数据中,这部分用户的写入
数据叫做残余增量日志。
在前述执行步骤G1至步骤G3、步骤G4和步骤G5、步骤G6的实现场景下,具体的,步
骤203第一代理节点将需要迁移的第一数据块发送给第二代理节点,包括:
H1、第一代理节点将需要迁移的快照分块发送给第二代理节点;
H2、第一代理节点对不同组的第一增量备份日志使用不同的发送线程同时向第二
代理节点发送;
H3、第一代理节点将残余增量日志发送给第二代理节点。
其中,由前述的具体应用场景说明可知,
其中,需要迁移的快照分块属于第一数据块,不同组的第一增量备份日志属于第
一数据块,残余增量日志属于第一数据块,因此第一代理节点可以分别向第二代理节点发
送需要迁移的快照分块、不同组的第一增量备份日志、残余增量日志,由于第一代理节点对
不同组的第一增量备份日志使用不同的发送线程同时向第二代理节点发送,因此可以充分
利用数据库表中不同行之间的无关特性,通过多个发送线程的并用可以提高数据块的迁移
效率。
通过以上实施例对本发明实施例的描述可知,数据的迁移系统中包括:中控节点、
第一分片存储单元、第二分片存储单元、数据备份子系统,该数据备份子系统内存储有第一
分片存储单元的数据块和第二分片存储单元的数据块。中控节点向第一代理节点发送数据
迁移命令,第一代理节点为数据迁移的源节点;第一代理节点接收到中控节点发送的数据
迁移命令之后,第一代理节点通过数据备份子系统获取到需要迁移的第一数据块;第一代
理节点将需要迁移的第一数据块发送给第二代理节点,第二代理节点为数据迁移的目的节
点;第二代理节点将需要迁移的第一数据块导入到第二分片存储单元中。由于数据的迁移
系统中独立于所有的分片存储单元设置有中控节点,第一数据块的迁移由中控节点来控
制,不需要再受到分布式锁的限制,因此当第一数据块有多个时每个第一数据块都可以独
立完成迁移,因此数据迁移的效率很高,另外本发明实施例中第一代理节点在迁移第一数
据块时并不从第一分片存储单元读取,而是从数据备份子系统中读取提前备份的第一数据
块,用户仍可以正常从第一分片存储单元完成读写操作。
为便于更好的理解和实施本发明实施例的上述方案,下面举例相应的应用场景来
进行具体说明。
接下来以本发明实施例中分片存储单元具体为MongoD集群为例,请参阅图3-a所
示,在本发明实施例基于MongoD实现的数据的迁移系统中,该数据的迁移系统中对于每张
数据库表的数据,在逻辑上将数据拆分成8192个chunk,这些chunk放在一致性存储设备
Etcd中,并且通过中控节点下发的方式在适当的时间推送给接入层,当一个MongoD上的数
据即将超过承载时,利用数据快照SnapShot和增量备份日志OplogDump文件,从源MongoD中
提取出需要迁移到其他MongoD上的chunk并导入。在此过程中源MongoD产生的写操作被
Mongod记录在增量日志Oplog中,提取出这部分Oplog导入目标MongoD后,封禁源MongoD对
应chunk的写请求,等Oplog完全同步完后,修改Etcd中关于chunk与MongoD的映射关系。
本发明实施例提供的基于MongoD实现的数据的迁移系统,可以应用在CMongo存储
集群中,当集群需要扩容时,新上架一个数据分片,并将存量集群上的部分chunk迁移到新
集群上,从而实现数据均衡。某个CMongo集群负载过低为了节约成本,集群进行缩容,将需
要下架的机器上的chunk均衡的迁移到其他数据分片上。
请参阅图3-a和图3-b所示,中控节点可以定期的将备份任务下发给每个MongoD分
片中的代理节点Agent,若每个MongoD分片又可以分为主备双分片,则中控节点可以将备份
任务下发给备MongoD分片中的Agent。Agent从MongoD中提取Snapshot或者OplogDump并存
放到HDFS上。
例如CMongo的迁移系统依赖于CMongo的增量备份子系统与路由子系统。其中,增
量备份子系统包括:中控节点,每台MongoD机器上的Agent节点,以及用于存放备份数据的
HDFS组成。如图3-b所示,任务由中控节点下发给对应机器的Agent,Agent连接本机的
MongoD获得Snapshot与OplogDump,第一次备份需要获得Snapshot,之后每次只需要增量备
份,增量备份通过扫描Oplog获得上一次增量备份至今的OplogDump,MongoD中的数据库DB
中存储有数据块1、2、3、4、5、6,则每次备份将数据块1和2、数据块3和4、数据块5和6分别备
份到HDFS中,数据拷贝相当于数据快照+数据块1、2、3、4、5、6。其中,SnapShot是数据库在某
个时间点的数据快照,幂等性是指如果一个操作作用于数据库表中的一行任意多次,结果
都不发生改变的特性,Oplog是记录数据库数据修改的具有幂等性的日志(log)记录,按照
操作时间顺序插入,用于增量数据恢复。OplogDum(t)是对MongoD的Oplog从某个时间戳t时
刻开始做的一个拷贝,该拷贝存放于HDFS上。
请参阅图4所示,为本发明实施例提供的基于MongoD实现的路由广播流程示意图。
在路由子系统中,一张数据库表被分为8192个chunk,路由表为chunk_id->(shard_id,
state)的映射关系,其中state分为NORMAL,FORBID_WRITE两种状态,路由表存放在Etcd集
群中,路由表的更改由中控节点统一处理,并广播给前端的网关(proxy)模块,路由表只有
在执行数据迁移的最后阶段才变为FORBID_WRITE状态。
请参阅图5所示,为本发明实施例提供的基于MongoD实现的数据快照恢复流程示
意图。接下来对本发明实施例中的数据迁移过程进行说明,每台MongoD机器的Agent都可以
执行如下的数据迁移过程,Agent接受中控节点的数据迁移任务,通过存储在HDFS上的备份
文件与本机上的源Mongod上的Oplog来迁移数据,Agent执行迁移任务主要包含以下几个步
骤
Step1:接受中控节点的命令,从HDFS上拉取相应的Snapshot文件。如图6所示,为
本发明实施例提供的数据快照使用多线程的示意图,创建线程池,将Snapshot划分为若干
小块放到线程池(ThreadPool)中,每个线程池过滤需要迁移的chunk并迁移到目标Mongod
中。对于一个数据迁移任务,会指定需要将某个分片的哪些chunk搬迁到哪个新分片上。搬
迁的线程池了解搬迁任务的chunk信息,对于每一条需要过滤的数据,使用分片过滤器
(ChunkFilter)计算出该数据是否数据需要搬迁的任务,从而得到过滤,过滤后得到快照分
块插入到目标MongoD中。
Step2:从HDFS上拉取OplogDump列表,由于Oplog是一系列操作例如:新建
(Create)、修改(Update)、删除(Delete)操作,不像Snapshot一样全部是插入操作,因此不
能像Snapshot一样对数据随意分组。但是由于Oplog中的一条是对单行数据的操作,而行与
行之间无关联,因此遍历OplogDump文件,按照每一条Oplog的分片标识ObjectId(简称
ObjId)进行哈希分组,每一组数据放入单个线程中顺序处理。对于每一行数据,都有一个唯
一的全局Id,这个Id叫做ObjId,每一条Oplog是对某一行的更改,所以每一条Oplog都会记
录对应行的ObjId。
如图7和图8所示,图7为本发明实施例提供的基于MongoD实现的增量备份日志恢
复流程示意图,图8为本发明实施例提供的多个增量备份日志使用多个发送线程的示意图。
增量备份日志OplogDump[1]到OplogDump[n]共n个分组,每个分组的OplogDump分别恢复到
目标MongoD中。如图8所示,OplogDump[1]到OplogDump[n]共n个分组使用提取线程
(Extract_Thread)送入分片过滤器(Chunk Filter)然后进行哈希分组,分别使用发送线程
池(Send ThreadPool)中的多个发送线程(Send)向目标MongoD发送OplogDump[1]到
OplogDump[n]。其中解析Oplog也称为:applyOps,每一条Oplog都完整的记录了用户的某次
数据修改,将该条Oplog中的信息解析出来,并应用到某一个分片上的过程,叫做applyOps。
Step3:从OplogDump中得到备份Oplog的最后一条时间戳T,Agent从本机的源
Mongod中拉取从T时刻到结束的Oplog,从而得到残余增量日志,并同步该残余增量日志至
目标Mongod中。该步骤的线程模型与Step2的线程模型一致。在导入OplogDump的过程中,用
户还是有数据源源不断的写入的,用户的写入会被记录到源MongoD的Oplog中,这部分用户
的写入的数据叫做残余增量日志。
Step4:执行路由切换流程。请参阅图9所示,为本发明实施例提供的基于MongoD实
现的路由切换流程示意图。主要包括如下过程:
Step4.1:封禁路由,用户短暂不可写,将源Mongod中残余的Oplog同步至目标
Mongod。封禁路由由Agent向中控节点发起,中控节点更改Etcd中的路由信息后,向所有
Proxy广播路由更改。
Step4.2:proxy封禁用户对应chunk的写请求,路由封禁成功后,将源Mongod的残
余Oplog同步至目标Mongod中。
Step4.3:再次通过中控节点广播路由,更改迁移chunk对应的分片。中控节点修改
Etcd,然后中控节点向Proxy广播路由修改,Proxy更新路由状态,中控节点确定路由更新成
功。
Step4.4:Agent删除源MonoD分片上已经迁移走的chunk。
由前述的举例说明可知,本发明实施例中完美的将数据备份与数据迁移结合在一
起,大大的提高了备份文件的存在价值,数据备份主要是用来做数据回档的。在导入
SnapShot时,采用多线程并发插入,大幅提高了基准数据的导入速度,在导入OplogDump列
表以及从MongoDb的Oplog中导入残余数据时,利用了行与行之间的数据无关性,按照oplog
的ObjId对Oplog进行哈希分组,不同组之间并发导入,大幅提升了增量数据的导入速度。对
于同一张表不同分片之间的输入输出隔离性,不同分片之间的数据迁移可以并发进行,由
中心节点灵活控制迁移的并发度。下面对本发明实施例中数据迁移效率与现有技术中原生
MongoDB的数据迁移效率对比,相同大小的数据集,利用MongoDB原生的迁移方案进行迁移
速度远不如本发明实施例中CMongo的迁移方案,从下表1可以看出,速度差距在10倍以上。
现有技术中MongoDB原生的数据迁移的并发度不够,导致数据迁移的效率很慢,本
发明实施例充分利用了数据之间的无关性,采用多线程并发搬迁的技术,充分提高了数据
搬迁的效率。本发明实施例使用数据备份文件进行数据搬迁,不同于原生MongoDB采用在线
实时数据进行搬迁,MongoDB实时数据搬迁会影响源数据库的读写性能。
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列
的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为
依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知
悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明
所必须的。
为便于更好的实施本发明实施例的上述方案,下面还提供用于实施上述方案的相
关装置。
如图1所示的一种数据的迁移系统,所述数据的迁移系统100包括:中控节点101、
第一分片存储单元102、第二分片存储单元103、数据备份子系统104,其中,
所述第一分片存储单元102上配置有第一代理节点1021,所述第二分片存储单元
103上配置有第二代理节点1031,所述第一代理节点1021分别和所述中控节点101、所述数
据备份子系统104建立有通信连接,所述第二代理节点1031分别和所述中控节点101、所述
数据备份子系统104建立有通信连接,所述第一分片存储单元102上存储的数据块通过所述
第一代理节点1021备份到所述数据备份子系统104中,所述第二分片存储单元103上存储的
数据块通过所述第二代理节点1031备份到所述数据备份子系统104中;
所述中控节点101,用于向所述第一代理节点1021发送数据迁移命令,所述第一代
理节点1021为数据迁移的源节点;
所述第一代理节点1021,用于接收到所述中控节点101发送的数据迁移命令之后,
所述第一代理节点1021通过所述数据备份子系统104获取到需要迁移的第一数据块;
所述第一代理节点1021,还用于将所述需要迁移的第一数据块发送给所述第二代
理节点1031,所述第二代理节点1031为数据迁移的目的节点;
所述第二代理节点1031,用于将所述需要迁移的第一数据块导入到所述第二分片
存储单元103中。
在本发明的一些实施例中,所述中控节点101,还用于将数据库表中的所有数据拆
分为多个数据块;将所述多个数据块中的一些数据块发送给所述第一代理节点1021,并将
所述多个数据块中的其余数据块发送给所述第二代理节点1031;
所述第一代理节点1021,还用于将接收到的所述一些数据块导入到所述第一分片
存储单元102中;
所述第二代理节点1031,还用于将接收到的所述另一些数据块导入到所述第二分
片存储单元103中。
在本发明的一些实施例中,请参阅图10-a所示,所述数据的迁移系统100还包括:
键值存储设备105,所述键值存储设备和所述中控节点101之间建立有通信连接;
所述中控节点101,还用于将数据库表中的所有数据拆分为多个数据块之后,根据
所述多个数据块创建路由表,所述路由表包括:所述多个数据块中每个数据块与对应的分
片存储单元的分片标识、工作状态之间的映射关系,所述每个数据块与对应的分片存储单
元的工作状态包括:正常状态和禁止写入状态;将所述路由表存储到所述键值存储设备105
中。
在本发明的一些实施例中,所述第二代理节点1031,还用于将所述需要迁移的第
一数据块导入到所述第二分片存储单元103中之后,向所述中控节点101上报迁移成功消
息;
所述中控节点101,还用于根据所述迁移成功消息将所述路由表中记录的所述第
一数据块的映射关系从所述第一分片存储单元102更改为所述第二分片存储单元103。
在本发明的一些实施例中,请参阅图10-b所示,所述数据的迁移系统100还包括:
网关模块106,所述第一代理节点1021和所述第二代理节点1031都通过所述网关模块106和
所述中控节点101之间建立有通信连接;
所述中控节点101,还用于根据所述迁移成功消息将所述路由表中记录的所述第
一数据块的映射关系从所述第一分片存储单元102更改为所述第二分片存储单元103之后,
通过所述网关模块106向所述第一代理节点和所述第二代理节点广播所述路由表的存储单
元更改消息。
在本发明的一些实施例中,所述第一代理节点1021,还用于通过所述数据备份子
系统104获取到需要迁移的第一数据块之前,向所述中控节点101发送封禁路由请求;
所述中控节点101,还用于根据所述封禁路由请求将所述路由表中记录的所述第
一分片存储单元102的工作状态从正常状态更改为禁止写入状态;
所述中控节点101,还用于向所述网关模块广播所述路由表的工作状态更改消息;
所述网关模块106,还用于根据所述路由表的工作状态更改消息封禁对所述第一
分片存储单元102的操作处理请求。
在本发明的一些实施例中,所述中控节点101,还用于定期的向所述第一代理节点
1021和所述第二代理节点1031发起备份任务;
所述第一代理节点1021,还用于根据所述备份任务定期的将所述第一分片存储单
元102上存储的数据块备份到所述数据备份子系统104中;
所述第二代理节点1031,还用于根据所述备份任务定期的将所述第二分片存储单
元103上存储的数据块备份到所述数据备份子系统104中。
在本发明的一些实施例中,所述第一代理节点1021,具体用于若所述第一代理节
点1021在启动运行后第一次接收到所述备份任务,对所述第一分片存储单元102上存储的
当前所有数据块进行备份从而生成数据快照,将所述数据快照备份到所述数据备份子系统
104中;若所述第一代理节点1021不是第一次接收到所述备份任务,从所述第一分片存储单
元102上获取用于记录所述第一分片存储单元102被修改的增量备份日志,将所述增量备份
日志备份到所述数据备份子系统104中。
在本发明的一些实施例中,所述第一代理节点1021,具体用于从所述数据备份子
系统104获取到需要迁移的第一数据快照;将所述第一数据快照划分为多个快照分块;调用
线程池中的多个线程从所述多个快照分块中过滤出需要迁移的快照分块,所述需要迁移的
快照分块属于所述第一数据块。
在本发明的一些实施例中,所述第一代理节点1021,具体用于调用线程池中的多
个线程从所述多个快照分块中过滤出需要迁移的快照分块之后,所述第一代理节点1021从
所述数据备份子系统104获取到需要迁移的第一增量备份日志;将所述需要迁移的第一增
量备份日志按照日志标识进行分组得到不同组的第一增量备份日志,所述不同组的第一增
量备份日志属于所述第一数据块。
在本发明的一些实施例中,所述第一代理节点1021,具体用于从所述数据备份子
系统104获取到需要迁移的第一增量备份日志之后,所述第一代理节点1021根据所述第一
增量备份日志对应的备份时间戳从所述第一分片存储单元102上获取从所述备份时间戳到
当前时间已存储的残余增量日志,所述残余增量日志属于所述第一数据块。
在本发明的一些实施例中,所述第一代理节点1021,具体用于将所述需要迁移的
快照分块发送给所述第二代理节点1031;对所述不同组的第一增量备份日志使用不同的发
送线程同时向所述第二代理节点1031发送;将所述残余增量日志发送给所述第二代理节点
1031。
通过以上对本发明实施例的描述可知,数据的迁移系统中包括:中控节点、第一分
片存储单元、第二分片存储单元、数据备份子系统,该数据备份子系统内存储有第一分片存
储单元的数据块和第二分片存储单元的数据块。中控节点向第一代理节点发送数据迁移命
令,第一代理节点为数据迁移的源节点;第一代理节点接收到中控节点发送的数据迁移命
令之后,第一代理节点通过数据备份子系统获取到需要迁移的第一数据块;第一代理节点
将需要迁移的第一数据块发送给第二代理节点,第二代理节点为数据迁移的目的节点;第
二代理节点将需要迁移的第一数据块导入到第二分片存储单元中。由于数据的迁移系统中
独立于所有的分片存储单元设置有中控节点,第一数据块的迁移由中控节点来控制,不需
要再受到分布式锁的限制,因此当第一数据块有多个时每个第一数据块都可以独立完成迁
移,因此数据迁移的效率很高,另外本发明实施例中第一代理节点在迁移第一数据块时并
不从第一分片存储单元读取,而是从数据备份子系统中读取提前备份的第一数据块,用户
仍可以正常从第一分片存储单元完成读写操作。
图11是本发明实施例提供的一种服务器结构示意图,该服务器1100上设置有代理
节点1123,该服务器具体为前述的分片存储单元,可因配置或性能不同而产生比较大的差
异,可以包括一个或一个以上中央处理器(central processing units,CPU)1122(例如,一
个或一个以上处理器)和存储器1132,一个或一个以上存储应用程序1142或数据1144的存
储介质1130(例如一个或一个以上海量存储设备)。其中,存储器1132和存储介质1130可以
是短暂存储或持久存储。存储在存储介质1130的程序可以包括一个或一个以上模块(图示
没标出),每个模块可以包括对服务器中的一系列指令操作。更进一步地,中央处理器1122
可以设置为与存储介质1130通信,在服务器1100上执行存储介质1130中的一系列指令操
作。
服务器1100还可以包括一个或一个以上电源1126,一个或一个以上有线或无线网
络接口1150,一个或一个以上输入输出接口1158,和/或,一个或一个以上操作系统1141,例
如Windows ServerTM,Mac OS XTM,UnixTM,LinuxTM,FreeBSDTM等等。
上述实施例中由分片存储单元所执行的步骤可以基于该图11所示的服务器结构。
另外需说明的是,以上所描述的装置实施例仅仅是示意性的,其中所述作为分离
部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也
可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实
际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。另外,本发明提供的
装置实施例附图中,模块之间的连接关系表示它们之间具有通信连接,具体可以实现为一
条或多条通信总线或信号线。本领域普通技术人员在不付出创造性劳动的情况下,即可以
理解并实施。
通过以上的实施方式的描述,所属领域的技术人员可以清楚地了解到本发明可借
助软件加必需的通用硬件的方式来实现,当然也可以通过专用硬件包括专用集成电路、专
用CPU、专用存储器、专用元器件等来实现。一般情况下,凡由计算机程序完成的功能都可以
很容易地用相应的硬件来实现,而且,用来实现同一功能的具体硬件结构也可以是多种多
样的,例如模拟电路、数字电路或专用电路等。但是,对本发明而言更多情况下软件程序实
现是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出
贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在可读取的存储介质
中,如计算机的软盘、U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储
器(RAM,Random Access Memory)、磁碟或者光盘等,包括若干指令用以使得一台计算机设
备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
综上所述,以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照上
述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对上
述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些
修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。