网络容灾系统的数据传输方法_3

文档序号:9330384阅读:来源:国知局
制,则主节点在DBM区找到备节点的bitmap,然后基于该bitmap进行增量同步即可。
[0065]另外,因为bitmap更新比较频繁,所以可以在内存和磁盘中各保存一份,进行增量同步时,读取内存中的bitmap即可,内存中的bitmap定时写到磁盘即可。
[0066]全盘复制:
[0067]全盘复制有两种实现方式:
[0068]第一种方式是,首先将备节点的bitmap的所有的bit位全部置为1,然后基于该bitmap执行所述增量复制中提到的增量同步即可,当bitmap的所有bit位全部为O时,增量同步结束,代表主节点与该备节点之间的全盘复制结束;
[0069]第二种方式是,首先将备节点的bitmap的所有的bit位全部置为1,然后将各个数据块的hash值发送至备节点进行比较,如果hash值相同,贝Ij备节点返回确认信息将对应的bit位清零,如果hash值不同,则备节点通知主节点传输对应的数据块的数据,并在接收到数据时返回确认信息将对应的bit位清零;当bitmap的所有bit位全部为O时,代表主节点与该备节点之间的全盘复制结束。
[0070]冲突合并:
[0071]当主节点出现故障而数据没有完全同步到备节点,备节点接管应用时,备节点数据相对于主节点发生了变化,这时候主备节点各自保存了对方没有的数据,我们称之为裂脑(split-brain),这时候可以进行冲突合并。冲突合并相对于全盘复制而言,能够减少非常多的数据传输量。
[0072]在冲突合并中,首先用户需要选择丢弃哪边的数据,将哪台服务器作为主节点,然后主节点和备节点分别根据各自的DATA区的数据生成bitmap,主节点将双方的bitmap进行异或运算产生新的bitmap,然后基于新的bitmap执行所述增量复制中的增量同步即可。
[0073]可见,冲突合并和全盘复制实质上最终都转化为了增量复制。
[0074]从上分析可见,增量复制以及全盘复制是要占用大量资源的,如果每次掉线重新握手都采用全盘复制,则无疑增加了主节点的业务持续时间,增加了主备节点之间的数据传输量,大大延长了应用恢复所需要的时间。而在这些复制模式里,只有顺序复制才能保证数据的完整性,只有完整的数据才是可以被应用访问和使用的。所以应该尽可能多的进行顺序复制,减少其他几种复制的出现概率,以降低容灾数据不可用的概率。
[0075]为此,本发明在双方握手时,交换元数据信息(Primary Info,以下简称PI),PI包括以下字段:
[0076]uuid,为一个整数,由当前时间参数+随机数生成,它可以唯一标识一个节点的一次变成主节点的过程。
[0077]id,用于唯一标识当前的主节点的ID (每个节点都有一个绑定的唯一的ID)。
[0078]seq,用于记录当前写入数据的序列号,且在写入的数据为增量复制中的增量数据时,seq为零。
[0079]每个节点上保存两个PI, —个是本地主节点信息(Local Primary Info,以下简称LocalPI)、另一个是前次主节点信息(Last Primary Info,以下简称LastPI)。
[0080]LocalP1:当一个节点角色从备节点变成主节点时,他会产生一个LocalPI信息,保存生成的uuid,id为该节点的ID,seq为I。当有新的数据写入时,更新当前的seq(每写入一个数据,seq加I)。当一个节点从主节点变成备节点并开始接收其他主节点传输的数据时,将LocalPI清空。
[0081]LastP1:当一个节点作为备节点并接收其他主节点传输的数据时,保存对应的主节点的LocalPI中的uuid、ID和、seq到自身的LastPI的相应字段中,并在接收到新的数据时更新LastPI的seq。
[0082]步骤S2中,主节点通过对比备节点的LocalPI和LastPI,即可选择四种复制模式中的一种,参考图2:
[0083]当一个备节点A和一个主节点B进行连接握手后,备节点A与主节点B交互各自的PI信息(各自的LocalPI和LastPI),主节点B对比自身的两个PI信息(B.LocalPI, B.LastPI)与备节点A的两个PI信息(A.LocalPI, A.LastPI),判断将和备节点A采用何种复制模式,具体包括:
[0084]S21、判断备节点的本地主节点信息(A.LocalPI)是否非空,如果不是,则进入步骤S22,如果是,则进入步骤S23 ;
[0085]S22、即A.LocalPI非空,A.LocalPI非空表明节点A在上次关机时作为主节点存在,那么有以下几种情况:
[0086]第一种情况:A.localP1.(uuid, id, seq) = B.LastP1.(uuid, id, seq),即备节点的本地主节点信息与主节点的前次主节点信息的所有字段均相等,这种情况表明,节点A在角色变换前是节点B的主节点,且两节点数据一致。这时候节点A、B之间可以进行顺序复制。
[0087]第二种情况:A.LocalP1.(uuid, id) = B.LastP1.(uuid, id)或者 A.LastP1.(uuid, id) = B.LocalP1.(uuid, id)或者 A.1astP1.(uuid, id, seq) = B.1astP1.(uuid, id, seq),即备节点的本地主节点信息与主节点的前次主节点信息的UUID和id两个字段相等、或者备节点的前次主节点信息与主节点的本地主节点信息的UUID和id两个字段相等、或者备节点的前次主节点信息与主节点的前次主节点信息的所有字段均相等。这种情况表明,节点B在变成主节点以节点A作为主节点,或者节点A在变成主节点之前以节点B作为主节点,或者节点A、B拥有共同的主节点且在角色转变时的数据一致。这时,节点
A、B应该是发生了裂脑,从而两节点可以进行冲突合并。
[0088]除去上述两种情况以外的其他情况采用全盘复制。
[0089]S23、即A.LocalPI为空,此时存在以下情况:
[0090]A.1astP1.(uuid, id) = B.localP1.(uuid, id)或 A.1astP1.(uuid, id, seq)=
B.1astPI (uuid, id, seq),即备节点的前次主节点信息与主节点的本地主节点信息的uuid和id两个字段相等、或者备节点的前次主节点信息与主节点的前次主节点信息的所有字段均相等。这种情况表明,节点A—直以节点B为主节点或者节点A、B曾经拥有共同的主节点,且在节点B角色转变时的数据一致,这时候节点A、B之间可以进行正常的顺序复制或者增量复制,取决于A的seq值(或者也可以通过判断节点B上对于节点A的bitmap是否非O实现),如果备节点A的seq值为零或者节点B上对于节点A的bitmap非零(A.1astP1.seq为O或者B.bitmap非O),则主节点与备节点之间采用增量复制,如果备节点A的seq值非零或者节点B上对于节点A的bitmap为零(A.1astP1.seq为O或者B.bitmap为O),贝IJ主节点与备节点之间采用顺序复制。
[0091]除去上述情况以外的其他情况采用全盘复制。
[0092]通过上面的握手判定方式,能够在集群内节点计划内或计划外角色转变时自动进行判别采用何种数据复制模式。例如下列场景:
[0093]I)、A、B两节点计划内切换主备,A从主节点变成备节点,B从备节点变成主节点,这时候A、B的PI信息满足步骤S22中的第一种情况,两者可以进行正常的顺序复制。
[0094]2)、A、B、C三节点,A为主异常关机,这时候B如果作为主节点接管应用,那么可以比较C.1astPI (uuid, id, seq)是否等于B.1astPI (uuid, id, seq),如果相等,那么他们可以顺序同步,如果不等,则只能进行全盘复制。
[0095]优选的,在顺序复制的过程中,如果尾指标指向最小的头指标所指向的数据块的上一个数据块,则停止对该最小的头指标所对应的备节点的顺序复制,根据该最小的头指标与尾指标之间的数据生成该最小的头指标所对应的备节点的数据增量位图保存在DBM中,并将该最小的头指标前移至尾指标的位置,在合适的时候(用户干预或者上层集群管理软件自动判断)对该备节点进行增量同步。最小的头指标的移动,相当于为BWR腾出了空间,这样主机数据就可以继续写入。
[0096]另外,针对现有技术中在进行增量复制的时候有新的数据写入时都会重新产生一个bitmap带来的备机数据一直处于不完整的状态的问题。本发明做了如下改进:
[0097]如果主节点在增量复制结束前写入新的数据,并不将BWR数据立马转换成bitmap,而是依然保存在BWR中,在写入数据的同时进行增量同步,等待本轮增量复
当前第3页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1