发明内容
本发明要解决的技术问题是:针对上述存在的问题,提供一种基于消息队列的数据分片同步方法及系统,以解决在数据同步过程中,数据节点失效和数据节点作恶所带来的数据不一致的问题。
本发明所采用的技术方案是:一种基于消息队列的数据分片同步方法,其特征在于:
S1、管理节点获取各数据节点发送的当前数据节点已消费消息队列的消息序号M1i,i对应系统中各数据节点的身份编号;
S2、管理节点将各数据节点已消费消息队列的消息序号M1i中最大的消息序号作为选定的消息序号N;
S3、数据节点在N>M1i时,继续消费消息队列,直到本地消费的消息队列消息序号为N后停止消费;
S4、管理节点获取各数据节点发送的当前数据节点已消费消息队列的消息序号M2i和当前数据节点持有的每个数据分片的HASH值;
S5、管理节点判断各数据节点的已消费消息队列消息序号M2i与选定的消息序号N是否相等,若相等,则记录相应数据节点为正常数据节点;
S6、管理节点根据正常数据节点上报的数据分片HASH值,按简单多数原则确定每一个数据分片X的HASH值HASH_X;
S7、管理节点判断各数据节点持有的数据分片X的HASH值是否与HASH_X一致,若一致则判定相应数据节点具备作为数据分片X的同步源节点的资格,并在具备资格的数据节点中确定数据分片X的唯一的同步源节点;
S8、管理节点向数据节点发送的指令,指令中包含:数据分片同步源节点的节点名、数据分片同步源节点的数据分片HASH值和数据分片在数据节点中的新分布信息;
S9、数据节点根据指令中数据分片同步源节点的数据分片HASH值和数据分片在数据节点中的新分布信息确定需要同步的数据分片,根据指令中数据分片同步源节点的节点名向相应同步源节点请求并接收需要同步的数据分片。
S10、数据节点在接收同步源节点返回的数据分片之后,计算接收到的数据分片HASH值,如该HASH值与指令中相应数据分片同步源节点的数据分片HASH值一致,则同步成功;如不一致,则向其余数据节点请求该数据分片。
S11、管理节点获取各数据节点发送的当前数据节点持有的所有数据分片编号和当前数据节点持有的所有数据分片的HASH值,并将其与数据分片同步源节点的数据分片HASH值和数据分片在数据节点中的新分布信息比较,若不一致,则同步失败,向数据节点发送REVERT指令;反之,则同步成功,向数据节点发送START指令;
S12、数据节点如收到REVERT指令,则删除所有新同步的数据分片,重新回到数据分片同步之前的状态,重新开始消费消息队列;数据节点如收到START指令,则删除所有旧的多余的数据分片,重新开始消费消息队列。
所述在具备资格的数据节点中确定数据分片X的唯一的同步源节点,包括:
使用负载均衡算法,为每个数据分片X选择唯一的同步源节点,使得同步源节点在现有节点中尽可能平均分布,同时在保证同步源节点不移动的情况下,重新对集群中的数据分片进行重新分配。
所述数据节点根据指令中数据分片同步源节点的数据分片HASH值和数据分片在数据节点中的新分布信息确定需要同步的数据分片,包括:
数据节点查看指令中数据分片同步源节点的数据分片HASH值和数据分片在数据节点中的新分布信息,如根据指令,该数据节点不持有新分布之下的数据分片,或虽然持有该数据分片但持有的数据分片的HASH值与指令中的不一致,则需要从同步源节点同步数据分片。
所述数据分片的HASH值仅与该数据分片内存储的数据有关。
一种新数据节点加入时的数据分片同步方法,其特征在于:
管理节点获取新加入的数据节点发送的PING消息,验证PING消息的合法性,并在确认合法后进入等待状态,等待状态持续一定时间;
在等待状态下管理节点接收来自其他新加入的数据节点发送的PING消息;
管理节点的等待状态结束后,根据所述的同步方法进行同步。
一种数据节点退出时的数据分片同步方法,其特征在于:
管理节点如在一定时间内未收到集群中数据节点发送的PING消息,则视该数据节点退出集群;
管理节点进入等待状态,等待状态持续一定时间;
管理节点在等待状态下未收到该数据节点发送的PING消息,则根据所述的同步方法进行同步。
一种基于消息队列的数据分片同步系统,其特征在于:具有写入节点、消息队列、管理节点和若干数据节点,其中:
写入节点,用于把要存储的数据写入消息队列;
数据节点,用于监听消息队列中的数据写入消息,按照预先制订的数据分片规则,把数据写入到对应的数据分片之中;
管理节点,用于在集群需要进行数据分片同步时,通过消息队列发送指令消息,协调整个集群中的数据节点根据所述的同步方法进行数据分片的同步。
本发明的有益效果是:本发明在数据同步时采用消息队列来保证消息的有序性。本发明考虑了数据分片同步过程中可能出现的拜占庭将军问题,在出现失效节点或作恶节点的情况下也能保证数据同步后的数据分片的完整性和一致性。
具体实施方式
如图2所示,本实施例为一种基于消息队列的数据分片同步系统,具有写入节点、消息队列、管理节点和若干数据节点,其中写入节点把要存储的数据写入消息队列;数据节点监听消息队列中的数据写入消息,按照预先制订的数据分片规则,把数据写入到对应的数据分片之中;管理节点在集群需要进行数据分片同步时,通过消息队列发送指令消息,协调整个集群中的数据节点进行数据分片的同步。
本例中该同步系统在有新的数据节点加入集群时,数据分片同步方法如下:
S0-1、新加入的数据节点向管理节点发送PING消息。
S0-2、管理节点收到PING消息之后,确认PING消息的合法性,在确认PING消息合法之后,管理节点进入RUNNING_WAIT状态,此状态将持续RUNNING_WAIT_T时间。
在RUNNING_WAIT状态下,管理节点可以接收来自其他新加入的数据节点的PING消息,以确保管理节点能够收集到所有新加入数据节点的信息。
S0-3、RUNNING_WAIT_T时间之后,管理节点向所有的数据节点发送STOP指令,管理节点进入STOP状态,在进入STOP状态之后,管理节点不再接收新的数据节点的PING指令,转而准备接收数据节点发送的SHARD_HASH消息。
S0-4、旧的数据节点收到STOP指令之后,停止消费消息队列中的信息,并记录当前已消费的消息队列的消息序号M1i,i对应系统中各数据节点的唯一身份编号,随后每个数据节点向管理节点发送SHARD_HASH消息。
SHARD_HASH消息包含:1.当前数据节点已消费消息队列的消息序号M1i;2.当前数据节点持有的每个数据分片的HASH值。
本例中数据分片的HASH值仅与该数据分片内所存储的数据有关,与数据分片编号和所在数据节点无关;如果两个数据分片内的所存储的数据相同,则数据分片的HASH相同,如果两个数据分片内所存储的数据不同,则数据分片的HASH不同。
本实施例中新加入的数据节点不向管理节点发送SHARD_HASH消息。
S1、管理节点获取各个旧的数据节点发送的SHARD_HASH消息,并把接收到的所有SHARD_HASH消息放入一个消息池中;
S2、从收到的第一个SHARD_HASH消息开始,启动计时器,等待STOP_WAIT时间之后,或者接收到所有数据节点(新加入的数据节点除外)的SHARD_HASH消息之后,管理节点根据SHARD_HASH消息池中所有SHARD_HASH消息,选择合适的消息队列的消息序号N。
由于每个数据节点消费消息队列的速度不一致,会有消息队列的消息序号不一致的现象。管理节点选择各数据节点已消费消息队列的消息序号M1i中最大的消息序号作为选定的消息序号N。
管理节点向所有数据节点发送包含这一选定消息序号N的OFFSET指令。管理节点进入TO_RESHARD状态,清空SHARD_HASH消息池,转而准备接收数据节点发送的SHARD_HASH_CONFIRM消息。
S3、数据节点收到管理节点发送的OFFSET指令之后,判断消息序号N是否大于本地记录的当前已消费的消息队列的消息序号M1i。
如果N>M1i,则继续消费消息队列,直到本地消费的消息队列消息序号为N之后,停止消费消息队列。
停止消费消息队列后,数据节点向管理节点发送SHARD_HASH_CONFIRM消息,消息中包含:1.当前数据节点已消费消息队列的消息序号M2i,i对应系统中各数据节点的唯一身份编号;2.当前数据节点持有的每个数据分片的HASH值。
S4、管理节点获取各数据节点发送的SHARD_HASH_CONFIRM消息。
S5、管理节点把接收到的所有SHARD_HASH_CONFIRM消息放入一个消息池中。
从收到的第一个SHARD_HASH_CONFIRM消息开始,启动计时器,等待TO_RESHARD_WAIT时间之后,或者接收到所有数据节点(新加入的数据节点除外)的SHARD_HASH_CONFIRM消息之后,管理节点遍历SHARD_HASH_CONFIRM消息池中的所有SHARD_HASH_CONFIRM消息,判断SHARD_HASH_CONFIRM消息中的当前数据节点已消费消息队列的消息序号M2i与选定的消息序号N是否相等。
如果不相等,则舍弃这条SHARD_HASH_CONFIRM消息;如果相等,则记录这个数据节点为正常数据节点。
S6、从剩余的SHARD_HASH_CONFIRM消息,根据正常数据节点上报的数据分片HASH值,按照简单多数原则,确定每一个数据分片X的HASH值HASH_X。
S7、管理节点遍历每一个正常的数据节点上报的SHARD_HASH_CONFIRM消息,查看其中的数据分片HASH值。
如果该节点持有的数据分片X的HASH值与HASH_X一致,则判定该数据节点可以作为数据分片X的同步源节点。
使用通用的负载均衡算法,为每个数据分片X选择唯一的同步源节点,使得同步源节点在现有节点中尽可能平均分布,同时在保证同步源节点不移动的情况下,重新对集群中的数据分片进行重新分配。
S8、管理节点向所有数据节点发送RESHARD指令,RESHARD指令中包含:1.数据分片同步源节点的节点名;2.数据分片同步源节点的数据分片HASH值;3.数据分片在数据节点中的新分布信息。
发送RESHARD指令后,管理节点进入RESHARDING状态,等待接收SHARD_HASH_COMPLETE消息。
S9、数据节点查看收到的RESHARD指令中的数据分片在数据节点中的新分布信息和数据分片的HASH值,如果根据RESHARD指令,该数据节点不持有新分布之下的数据分片,或者虽然持有该数据分片但是持有的数据分片的HASH值与RESHARD指令中的不一致,则需要从同步源同步数据分片。
确定需要同步的数据分片之后,数据节点根据RESHARD指令,选择相应的数据分片同步源节点,向其发送同步请求并接收需要同步的数据分片。
S10、接收到同步源的所返回的数据分片之后,该数据节点需要再次计算收到的数据分片HASH值,如计算得到的HASH值与RESHARD指令中一致,则同步成功;如果HASH值不一致,则向其他的所有数据节点请求该数据分片。同步成功后,部署新的数据分片。
完成所有数据分片的同步之后,各数据节点向管理节点发送SHARD_HASH_COMPLETE消息。
SHARD_HASH_COMPLETE消息包含:1.该数据节点持有的所有数据分片编号;2.该数据节点持有的所有数据分片的HASH值。
S11、管理节点把接收到的所有SHARD_HASH_COMPLETE消息放入一个消息池中。
从收到的第一个SHARD_HASH_COMPLETE消息开始,启动计时器,等待RESHARDING_WAIT时间之后,或者接收到所有数据节点(新加入的数据节点除外)的SHARD_HASH_COMPLETE消息之后,管理节点遍历SHARD_HASH_COMPLETE消息池中的所有SHARD_HASH_COMPLETE消息,根据SHARD_HASH_COMPLETE中数据节点的数据分片同步情况,判断数据分片同步是否已经完成。
如果数据分片的分布情况或者HASH和RESHARD命令不符,则同步失败,管理节点记录出问题的数据节点,并向数据节点发送REVERT指令,回到数据分片同步之前的状态。如果数据分片的分布情况或者HASH和RESHARD命令中的描述一致,则同步成功,向数据节点发送START指令,管理节点重新回到RUNNING状态。
S12、数据节点如果收到REVERT指令,则表明同步失败,则删除所有新同步的数据分片,重新回到数据分片同步之前的状态,重新开始消费消息队列。数据节点如果收到START指令,则表明同步成功,则删除所有旧的多余的数据分片,重新开始消费消息队列。
本实施例中该同步系统在有新数据节点退出集群时,数据分片同步方法如下:
S0-1、在一定时间内,如果管理节点没有收到集群中数据节点的PING消息,管理节点视该节点退出集群。
S0-2、如果管理节点判定剩余的数据节点能够完整分配数据分配的所有副本,则开始进行数据分片同步,管理节点进入RUNNING_WAIT状态,此状态将持续RUNNING_WAIT_T时间。
S0-3、在RUNNING_WAIT状态下,管理节点可以接收来自该数据节点的PING指令,如果在RUNNING_WAIT_T时间时间内收到了该节点的PING消息,则管理节点回到RUNNING状态,不进行数据同步;反之,则继续以下数据同步步骤。
S0-4、RUNNING_WAIT_T时间之后,管理节点向所有的数据节点发送STOP指令,管理节点进入STOP状态,在进入STOP状态之后,管理节点不再接收新的数据节点的PING指令,转而准备接收数据节点发送的SHARD_HASH消息。
S0-5、数据节点收到STOP指令之后,停止消费消息队列中的信息,并记录当前已消费的消息队列的消息序号M1i,随后每个数据节点向管理节点发送SHARD_HASH消息。
SHARD_HASH消息包含:1.当前数据节点已消费消息队列的消息序号M1i;2.当前数据节点持有的每个数据分片的HASH值。
本例中数据分片的HASH值仅与该数据分片内所存储的数据有关,与数据分片编号和所在数据节点无关;如果两个数据分片内的所存储的数据相同,则数据分片的HASH相同,如果两个数据分片内所存储的数据不同,则数据分片的HASH不同。
S1、管理节点获取各个数据节点发送的SHARD_HASH消息,并把接收到的所有SHARD_HASH消息放入一个消息池中;
S2、从收到的第一个SHARD_HASH消息开始,启动计时器,等待STOP_WAIT时间之后,或者接收到所有数据节点的SHARD_HASH消息之后,管理节点根据SHARD_HASH消息池中所有SHARD_HASH消息,选择合适的消息队列的消息序号N。
由于每个数据节点消费消息队列的速度不一致,会有消息队列的消息序号不一致的现象。管理节点选择各数据节点已消费消息队列的消息序号M1i中最大的消息序号作为选定的消息序号N。
管理节点向所有数据节点发送包含这一选定消息序号N的OFFSET指令。管理节点进入TO_RESHARD状态,清空SHARD_HASH消息池,转而准备接收数据节点发送的SHARD_HASH_CONFIRM消息。
S3、数据节点收到管理节点发送的OFFSET指令之后,判断消息序号N是否大于本地记录的当前已消费的消息队列的消息序号M1i。
如果N>M1i,则继续消费消息队列,直到本地消费的消息队列消息序号为N之后,停止消费消息队列。
停止消费消息队列后,数据节点向管理节点发送SHARD_HASH_CONFIRM消息,消息中包含:1.当前数据节点已消费消息队列的消息序号M2i;2.当前数据节点持有的每个数据分片的HASH值。
S4、管理节点获取各数据节点发送的SHARD_HASH_CONFIRM消息。
S5、管理节点把接收到的所有SHARD_HASH_CONFIRM消息放入一个消息池中。
从收到的第一个SHARD_HASH_CONFIRM消息开始,启动计时器,等待TO_RESHARD_WAIT时间之后,或者接收到所有数据节点的SHARD_HASH_CONFIRM消息之后,管理节点遍历SHARD_HASH_CONFIRM消息池中的所有SHARD_HASH_CONFIRM消息,判断SHARD_HASH_CONFIRM消息中的当前数据节点已消费消息队列的消息序号M2i与选定的消息序号N是否相等。
如果不相等,则舍弃这条SHARD_HASH_CONFIRM消息;如果相等,则记录这个数据节点为正常数据节点。
S6、从剩余的SHARD_HASH_CONFIRM消息,根据正常数据节点上报的数据分片HASH值,按照简单多数原则,确定每一个数据分片X的HASH值HASH_X。
S7、管理节点遍历每一个正常数据节点上报的SHARD_HASH_CONFIRM消息,查看其中的数据分片HASH值。
如果该节点持有的数据分片X的HASH值与HASH_X一致,则判定该数据节点可以作为数据分片X的同步源节点。
使用通用的负载均衡算法,为每个数据分片X选择唯一的同步源节点,使得同步源节点在现有节点中尽可能平均分布,同时在保证同步源节点不移动的情况下,重新对集群中的数据分片进行重新分配。
S8、管理节点向所有数据节点发送RESHARD指令,RESHARD指令中包含:1.数据分片同步源节点的节点名;2.数据分片同步源节点的数据分片HASH值;3.数据分片在数据节点中的新分布信息。
发送RESHARD指令后,管理节点进入RESHARDING状态,等待接收SHARD_HASH_COMPLETE消息。
S9、数据节点查看收到的RESHARD指令中的数据分片在数据节点中的新分布信息和数据分片的HASH值,如果根据RESHARD指令,该数据节点不持有新分布之下的数据分片,或者虽然持有该数据分片但是持有的数据分片的HASH值与RESHARD指令中的不一致,则需要从同步源同步数据分片。
确定需要同步的数据分片之后,数据节点根据RESHARD指令中的数据分片同步源节点的节点名开始向相应同步源节点请求并接收需要同步的数据分片。
S10、接收到同步源的所返回的数据分片之后,该数据节点需要再次计算收到的数据分片HASH值,如计算得到的HASH值与RESHARD指令中一致,则同步成功;如果HASH值不一致,则向其他的所有数据节点请求该数据分片。同步成功后,部署新的数据分片。
完成所有数据分片的同步之后,各数据节点向管理节点发送SHARD_HASH_COMPLETE消息。
SHARD_HASH_COMPLETE消息包含:1.该数据节点持有的所有数据分片编号;2.该数据节点持有的所有数据分片的HASH值。
S11、管理节点把接收到的所有SHARD_HASH_COMPLETE消息放入一个消息池中。
从收到的第一个SHARD_HASH_COMPLETE消息开始,启动计时器,等待RESHARDING_WAIT时间之后,或者接收到所有数据节点(新加入的数据节点除外)的SHARD_HASH_COMPLETE消息之后,管理节点遍历SHARD_HASH_COMPLETE消息池中的所有SHARD_HASH_COMPLETE消息,根据SHARD_HASH_COMPLETE中数据节点的数据分片同步情况,判断数据分片同步是否已经完成。
如果数据分片的分布情况或者HASH和RESHARD命令不符,则同步失败,管理节点记录出问题的数据节点,并向数据节点发送REVERT指令,回到数据分片同步之前的状态。如果数据分片的分布情况或者HASH和RESHARD命令中的描述一致,则同步成功,向数据节点发送START指令,管理节点重新回到RUNNING状态。
S12、数据节点如果收到REVERT指令,则表明同步失败,则删除所有新同步的数据分片,重新回到数据分片同步之前的状态,重新开始消费消息队列。数据节点如果收到START指令,则表明同步成功,则删除所有旧的多余的数据分片,重新开始消费消息队列。
尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。