一种防止DRBD裂脑的处理方法及相关组件转让专利

申请号 : CN202210115475.X

文献号 : CN114138208B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 方浩

申请人 : 苏州浪潮智能科技有限公司

摘要 :

本申请公开了一种防止DRBD裂脑的处理方法及相关组件,该方案中,在第一节点上电后获取开机时间;从心跳盘中的第一心跳数据区域中获取最新的第一GI值和最新的第一GI值的产生时间;在判定开机时间与最新的第一GI值的产生时间的时间差大于预设时间时,判断第二心跳数据区域中是否包含最新的第一GI值和基于最新的第一GI值产生的GI值;若是,则不开启DRBD服务。本方案在第一节点开启DRBD服务前,首先通过时间差大于预设时间且第二心跳数据区域中包含最新的第一GI值和基于最新的第一GI值产生的GI值来判定心跳盘中存储的第一节点的第一GI值为旧数据,此时停止开启DRBD服务,防止旧数据导致的DRBD裂脑。

权利要求 :

1.一种防止DRBD裂脑的处理方法,其特征在于,应用于第一节点,包括:在所述第一节点上电后获取开机时间;

从心跳盘中的第一心跳数据区域中获取最新的第一GI值和所述最新的第一GI值的产生时间,所述心跳盘的数据格式包括第一心跳数据区域和第二心跳数据区域,所述第一心跳数据区域中存储有所述第一节点的第一GI值和所述第一GI值的产生时间,所述第二心跳数据区域中存储有第二节点的第二GI值和所述第二GI值的产生时间;

在判定所述开机时间与所述最新的第一GI值的产生时间的时间差大于预设时间时,判断所述第二心跳数据区域中是否包含所述最新的第一GI值和基于所述最新的第一GI值产生的GI值;

若是,则不开启DRBD服务;

从心跳盘中的第一心跳数据区域中获取最新的第一GI值和所述最新的第一GI值的产生时间之后,还包括:

在判定所述开机时间与所述最新的第一GI值的产生时间的时间差小于预设时间时,判断所述第二心跳数据区域中是否包含所述最新的第一GI值和基于所述最新的第一GI值产生的GI值;

若是,则开启DRBD服务;

若否,则从所述第二心跳数据区域中获取最新的第二GI值并在判定所述第一心跳数据区域中包含所述最新的第二GI值和基于所述最新的第二GI值产生的GI值时,开启DRBD服务。

2.如权利要求1所述的防止DRBD裂脑的处理方法,其特征在于,所述第一心跳数据区域包括第一头部区域和N个第一数据区域,N为正整数,所述第一数据区域用于存储所述第一数据区域的编号、一个所述第一节点的第一GI值和所述第一GI值的产生时间,所述第一数据区域与所述编号一一对应;所述第一头部区域用于存储最新的所述编号;

从心跳盘中的第一心跳数据区域中获取最新的第一GI值和所述最新的第一GI值的产生时间,包括:

从心跳盘中的第一心跳数据区域中的第一头部区域中获取最新的所述编号;

获取与最新的所述编号对应的第一数据区域中的第一GI值和所述第一GI值的产生时间。

3.如权利要求2所述的防止DRBD裂脑的处理方法,其特征在于,所述第一头部区域还用于存储所述第一节点的标识,从心跳盘中的第一心跳数据区域中获取最新的第一GI值和所述最新的第一GI值的产生时间,包括:根据所述第一节点的标识确定从心跳盘中的第一心跳数据区域中获取最新的第一GI值和所述最新的第一GI值的产生时间。

4.如权利要求1所述的防止DRBD裂脑的处理方法,其特征在于,所述心跳盘的数据格式还包括元数据区域,用于存储所述心跳盘的magic、version和label。

5.如权利要求1所述的防止DRBD裂脑的处理方法,其特征在于,判断所述第二心跳数据区域中是否包含所述最新的第一GI值和基于所述最新的第一GI值产生的GI值之后,还包括:

若否,则从所述第二心跳数据区域中获取最新的第二GI值并在判定所述第一心跳数据区域中包含所述最新的第二GI值和基于所述最新的第二GI值产生的GI值时,开启DRBD服务。

6.如权利要求1至5任一项所述的防止DRBD裂脑的处理方法,其特征在于,所述第一心跳数据区域包括第一头部区域和N个第一数据区域,N为正整数,所述第一数据区域用于存储所述第一数据区域的编号、一个所述第一节点的第一GI值和所述第一GI值的产生时间,所述第一数据区域与所述编号一一对应;所述第一头部区域用于存储最新的所述编号,还包括:

从存储区域中获取所述第一节点的实时的第一GI值和所述实时的第一GI值的产生时间;

获取所述心跳盘中的第一头部区域中最新的所述编号;

获取与最新的所述编号对应的第一数据区域中的已有的第一GI值和所述已有的第一GI值的产生时间;

若所述实时的第一GI值与所述已有的第一GI值相同,则将所述已有的第一GI值的产生时间更新为所述实时的第一GI值的产生时间;

若所述实时的第一GI值与所述已有的第一GI值不同,则将所述心跳盘中的第一头部区域中存储的最新的所述编号进行加一得到更新后的编号;

将所述更新后的编号、所述实时的第一GI值和所述实时的第一GI值的产生时间存储至一个空白的第一数据区域中。

7.如权利要求6所述的防止DRBD裂脑的处理方法,其特征在于,从存储区域中获取所述第一节点的实时的第一GI值和所述实时的第一GI值的产生时间,包括:每隔预设周期从存储区域中获取所述第一节点的实时的第一GI值和所述实时的第一GI值的产生时间。

8.一种服务器,其特征在于,包括:存储器,用于存储计算机程序;

处理器,用于执行所述计算机程序以实现如权利要求1至7任一项所述防止DRBD裂脑的处理方法的步骤。

9.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如权利要求1至7任一项所述防止DRBD裂脑的处理方法的步骤。

说明书 :

一种防止DRBD裂脑的处理方法及相关组件

技术领域

[0001] 本发明涉及防止DRBD裂脑的技术领域,特别是涉及一种防止DRBD裂脑的处理方法及相关组件。

背景技术

[0002] DRBD(Distributed Replicated Block Device,分布式块设备复制)是一个开源的纯软件设计的基于网络的块复制存储解决方案,用于在服务器之间,对块设备(硬盘,分
区,逻辑卷等)进行镜像。当某一个应用程序完成写操作后,DRBD不仅会将写入的数据保存
在一个节点(例如本地服务器)的块设备上,也会将该数据进行复制并通过网络传输到另一
个节点(例如远端服务器)的块设备上,因此两个节点的块设备上的数据将会保存一致,也
就是镜像功能。
[0003] DRBD在写入数据时会通过元数据中的GI(Generation Identifier,生成标识符)值来记录写入数据的信息,在节点掉电后其GI值不再更新。当一个节点先掉电较长时间后
另一个节点也掉电,如果重启先掉电的节点,其GI值相较于后掉电的节点的GI值可能为旧
数据,则此时开启DRBD服务就可能导致DRBD裂脑,使数据损坏。

发明内容

[0004] 本申请的目的是提供一种防止DRBD裂脑的处理方法及相关组件,该方案在第一节点开启DRBD服务前,首先通过时间差大于预设时间且第二心跳数据区域中包含最新的第一
GI值和基于最新的第一GI值产生的GI值来判定心跳盘中存储的第一节点的第一GI值为旧
数据,此时停止开启DRBD服务,防止旧数据导致的DRBD裂脑。
[0005] 为解决上述技术问题,本申请提供了一种防止DRBD裂脑的处理方法,应用于第一节点,包括:
[0006] 在所述第一节点上电后获取开机时间;
[0007] 从心跳盘中的第一心跳数据区域中获取最新的第一GI值和所述最新的第一GI值的产生时间,所述心跳盘的数据格式包括第一心跳数据区域和第二心跳数据区域,所述第
一心跳数据区域中存储有所述第一节点的第一GI值和所述第一GI值的产生时间,所述第二
心跳数据区域中存储有第二节点的第二GI值和所述第二GI值的产生时间;
[0008] 在判定所述开机时间与所述最新的第一GI值的产生时间的时间差大于预设时间时,判断所述第二心跳数据区域中是否包含所述最新的第一GI值和基于所述最新的第一GI
值产生的GI值;
[0009] 若是,则不开启DRBD服务。
[0010] 优选的,所述第一心跳数据区域包括第一头部区域和N个第一数据区域,N为正整数,所述第一数据区域用于存储所述第一数据区域的编号、一个所述第一节点的第一GI值
和所述第一GI值的产生时间,所述第一数据区域与所述编号一一对应;所述第一头部区域
用于存储最新的所述编号;
[0011] 从心跳盘中的第一心跳数据区域中获取最新的第一GI值和所述最新的第一GI值的产生时间,包括:
[0012] 从心跳盘中的第一心跳数据区域中的第一头部区域中获取最新的所述编号;
[0013] 获取与最新的所述编号对应的第一数据区域中的第一GI值和所述第一GI值的产生时间。
[0014] 优选的,所述第一头部区域还用于存储所述第一节点的标识,从心跳盘中的第一心跳数据区域中获取最新的第一GI值和所述最新的第一GI值的产生时间,包括:
[0015] 根据所述第一节点的标识确定从心跳盘中的第一心跳数据区域中获取最新的第一GI值和所述最新的第一GI值的产生时间。
[0016] 优选的,所述心跳盘的数据格式还包括元数据区域,用于存储所述心跳盘的magic、version和label。
[0017] 优选的,从心跳盘中的第一心跳数据区域中获取最新的第一GI值和所述最新的第一GI值的产生时间之后,还包括:
[0018] 在判定所述开机时间与所述最新的第一GI值的产生时间的时间差小于预设时间时,判断所述第二心跳数据区域中是否包含所述最新的第一GI值和基于所述最新的第一GI
值产生的GI值;
[0019] 若是,则开启DRBD服务;
[0020] 若否,则从所述第二心跳数据区域中获取最新的第二GI值并在判定所述第一心跳数据区域中包含所述最新的第二GI值和基于所述最新的第二GI值产生的GI值时,开启DRBD
服务。
[0021] 优选的,判断所述第二心跳数据区域中是否包含所述最新的第一GI值和基于所述最新的第一GI值产生的GI值之后,还包括:
[0022] 若否,则从所述第二心跳数据区域中获取最新的第二GI值并在判定所述第一心跳数据区域中包含所述最新的第二GI值和基于所述最新的第二GI值产生的GI值时,开启DRBD
服务。
[0023] 优选的,所述第一心跳数据区域包括第一头部区域和N个第一数据区域,N为正整数,所述第一数据区域用于存储所述第一数据区域的编号、一个所述第一节点的第一GI值
和所述第一GI值的产生时间,所述第一数据区域与所述编号一一对应;所述第一头部区域
用于存储最新的所述编号,还包括:
[0024] 从存储区域中获取所述第一节点的实时的第一GI值和所述实时的第一GI值的产生时间;
[0025] 获取所述心跳盘中的第一头部区域中最新的所述编号;
[0026] 获取与最新的所述编号对应的第一数据区域中的已有的第一GI值和所述已有的第一GI值的产生时间;
[0027] 若所述实时的第一GI值与所述已有的第一GI值相同,则将所述已有的第一GI值的产生时间更新为所述实时的第一GI值的产生时间;
[0028] 若所述实时的第一GI值与所述已有的第一GI值不同,则将所述心跳盘中的第一头部区域中存储的最新的所述编号进行加一得到更新后的编号;
[0029] 将所述更新后的编号、所述实时的第一GI值和所述实时的第一GI值的产生时间存储至一个空白的第一数据区域中。
[0030] 优选的,从存储区域中获取所述第一节点的实时的第一GI值和所述实时的第一GI值的产生时间,包括:
[0031] 每隔预设周期从存储区域中获取所述第一节点的实时的第一GI值和所述实时的第一GI值的产生时间。
[0032] 为解决上述技术问题,本申请还提供了一种节点,包括:
[0033] 存储器,用于存储计算机程序;
[0034] 处理器,用于执行所述计算机程序以实现所述防止DRBD裂脑的处理方法的步骤。
[0035] 为解决上述技术问题,本申请还提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现所述防止DRBD裂脑
的处理方法的步骤。
[0036] 本申请提供了一种防止DRBD裂脑的处理方法及相关组件,该方案中,在第一节点上电后获取开机时间;从心跳盘中的第一心跳数据区域中获取最新的第一GI值和最新的第
一GI值的产生时间;在判定开机时间与最新的第一GI值的产生时间的时间差大于预设时间
时,判断第二心跳数据区域中是否包含最新的第一GI值和基于最新的第一GI值产生的GI
值;若是,则不开启DRBD服务。本方案在第一节点开启DRBD服务前,首先通过时间差大于预
设时间且第二心跳数据区域中包含最新的第一GI值和基于最新的第一GI值产生的GI值来
判定心跳盘中存储的第一节点的第一GI值为旧数据,此时停止开启DRBD服务,防止旧数据
导致的DRBD裂脑。

附图说明

[0037] 为了更清楚地说明本申请实施例中的技术方案,下面将对现有技术和实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施
例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获
得其他的附图。
[0038] 图1为本申请提供的一种防止DRBD裂脑的处理方法的流程图;
[0039] 图2为本申请提供的一种心跳盘的数据格式的示意图;
[0040] 图3为本申请提供的一种第一心跳数据区域和第二心跳数据区域的示意图;
[0041] 图4为本申请提供的一种更新心跳盘的流程图;
[0042] 图5为本申请提供的一种节点的结构示意图。

具体实施方式

[0043] 本申请的核心是提供一种防止DRBD裂脑的处理方法及相关组件,该方案在第一节点开启DRBD服务前,首先通过时间差大于预设时间且第二心跳数据区域中包含最新的第一
GI值和基于最新的第一GI值产生的GI值来判定心跳盘中存储的第一节点的第一GI值为旧
数据,此时停止开启DRBD服务,防止旧数据导致的DRBD裂脑。
[0044] 为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是
本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员
在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
[0045] 图1为本申请提供的一种防止DRBD裂脑的处理方法的流程图,应用于第一节点,包括:
[0046] S11:在第一节点上电后获取开机时间;
[0047] S12:从心跳盘中的第一心跳数据区域中获取最新的第一GI值和最新的第一GI值的产生时间,心跳盘的数据格式包括第一心跳数据区域和第二心跳数据区域,第一心跳数
据区域中存储有第一节点的第一GI值和第一GI值的产生时间,第二心跳数据区域中存储有
第二节点的第二GI值和第二GI值的产生时间;
[0048] S13:在判定开机时间与最新的第一GI值的产生时间的时间差大于预设时间时,判断第二心跳数据区域中是否包含最新的第一GI值和基于最新的第一GI值产生的GI值,若
是,则进入S14;
[0049] S14:不开启DRBD服务。
[0050] DRBD 是一个开源的纯软件设计的基于网络的块复制存储解决方案,它主要用于节点(例如服务器)之间的块设备(例如磁盘或分区等)中数据的镜像。通过网络将一个节点
的数据实时传送到另一个节点保证数据的一致性,类似RAID 1(Redundant Array of 
Inexpensive Disks,独立冗余磁盘阵列);DRBD一般采用强一致性的协议保证数据一致,即
两个节点的数据写入完成才确定一个写操作完成。
[0051] DRBD在写入数据时会生成元数据,元数据主要包括DRBD的设备大小、GI值,Activity Log(活动日志)、bitmap(位图)等组成。而DRBD采用GI值来确认两个节点如何同
步数据。GI值是由4个UUID(Universally Unique Identifier,通用唯一识别码)值组成,分
别是Current UUID,Bitmap UUID,History(1)和History(2)组成。当数据达到同步状态会
更新Current UUID ,或者有节点断开或连接时生成新的Current UUID,同时将上一次的
Current UUID写到History(1),将History(1)写到History(2)。因此,两个节点反复的连接
和断开会导致GI值仅保留最近的3次变化信息。
[0052] 在节点掉电后其GI值不再更新,现有技术中,当一个节点先掉电较长时间后另一个节点也掉电,如果重启先掉电的节点,其GI值相较于后掉电的节点的GI值可能为旧数据,
则此时开启DRBD服务就可能导致DRBD裂脑,使数据损坏。
[0053] 本申请中,提出了一种心跳盘作为两个节点的共享存储,同时记录两个节点GI值和GI值的产生时间,通过存储的GI值和GI值的产生时间判定节点的数据为旧数据时,不开
启DRBD服务,防止DRBD裂脑。
[0054] 具体的,在第一节点掉电后再重启时,当其掉电时长超过预设时间并且是两个节点中先掉电的节点时,判定第一节点中的第一GI值为旧数据,不可容忍,此时不开启DRBD服
务。其中,第一节点掉电前最后产生的第一GI值,即第一节点的最新的第一GI值,其产生时
间即为第一节点的掉电时间,第一节点上电后的开机时间即为当前时间,掉电时间与当前
时间的时间差即为第一节点到当前为止的掉电时长;在两个节点未掉电时,第一GI值与第
二GI值是相同的(例如第一GI值和第二GI值均为a、b和c),当第一节点先掉电后,第二节点
会生成一个新的第二GI值(例如d),新的第二GI值是基于第二节点中与第一GI值相同的最
后一个第二GI值生成的(例如d是基于c生成的,此时第一GI值为a、b和c,第二GI值为a、b、c
和d),新的第二GI值可以是与第一GI值相同的最后一个第二GI值中Current UUID进行更新
后得到的,之后第二节点在掉电前,其可能还会接收大量的数据,在新的第二GI值后继续生
成新的第二GI值(例如此时第一GI值为a、b和c,第二GI值为a、b、c、d、e、f和g)。因此当第二
心跳数据区域中存储的第二GI值中包含最新的第一GI值和基于最新的第一GI值产生的GI
值(例如第二GI值a、b、c、d、e、f和g中包含第一GI值a、b和c中最新的第一GI值c和基于c产生
的d)时,第一节点为先掉电的节点。此外,可以将第二心跳数据区域中存储的第二GI值按照
产生时间从新到旧依次与最新的第一GI值相比较,便于确定第二心跳数据区域中存储的第
二GI值中是否包含最新的第一GI值和基于最新的第一GI值产生的GI值。
[0055] 还需要说明的是,心跳盘中的第一心跳数据区域中存储有第一节点的第一GI值和第一GI值的产生时间,心跳盘中的第二心跳数据区域中存储有第二节点的第二GI值和第二
GI值的产生时间,本申请需要从心跳盘中调取存储信息进行判断。以图2为例,心跳盘也就
是图2中上面的Drbd(Sentinel disk),其数据格式可以分为3个区域分别为元数据区域,第
一节点的第一心跳数据区域和第二节点的第二心跳数据区域。元数据区域在心跳盘的前
4K,包括magic,version和label,用以记录心跳盘的基础数据,校验版本信息;第一心跳数
据区域和第二心跳数据区域都是由一个header区域和32个data区域组成,每个区域都默认
占用4K的大小;header区域用于记录节点的唯一标识HOST_UUID,支持最大的data的个数
Total_num(默认最大32个),及当前已经记录的data的个数Current_num。data区域主要用
于记录其编号Num,当前的GI值数据A _GI,及当前GI值的产生时间Time。
[0056] 同时,心跳盘在使用时,为确保第一节点和第二节点都能对自身进行访问,在使用前使用DRBD心跳盘格式化工具按照上述格式格式化元数据区域,同时将第一心跳数据区域
和第二心跳数据区域中的数据清零,避免心跳盘重复使用时的数据残留。
[0057] 综上,通过获取共享的心跳盘中存储的信息来判定是否能够开启DRBD服务,避免了DRBD裂脑,提高DRBD的可靠性。
[0058] 本申请提供了一种防止DRBD裂脑的处理方法,该方案中,在第一节点上电后获取开机时间;从心跳盘中的第一心跳数据区域中获取最新的第一GI值和最新的第一GI值的产
生时间;在判定开机时间与最新的第一GI值的产生时间的时间差大于预设时间时,判断第
二心跳数据区域中是否包含最新的第一GI值和基于最新的第一GI值产生的GI值;若是,则
不开启DRBD服务。本方案在第一节点开启DRBD服务前,首先通过时间差大于预设时间且第
二心跳数据区域中包含最新的第一GI值和基于最新的第一GI值产生的GI值来判定心跳盘
中存储的第一节点的第一GI值为旧数据,此时停止开启DRBD服务,防止旧数据导致的DRBD
裂脑。
[0059] 在上述实施例的基础上:
[0060] 作为一种优选的实施例,第一心跳数据区域包括第一头部区域和N个第一数据区域,N为正整数,第一数据区域用于存储第一数据区域的编号、一个第一节点的第一GI值和
第一GI值的产生时间,第一数据区域与编号一一对应;第一头部区域用于存储最新的编号;
[0061] 从心跳盘中的第一心跳数据区域中获取最新的第一GI值和最新的第一GI值的产生时间,包括:
[0062] 从心跳盘中的第一心跳数据区域中的第一头部区域中获取最新的编号;
[0063] 获取与最新的编号对应的第一数据区域中的第一GI值和第一GI值的产生时间。
[0064] 图3为本申请提供的一种第一心跳数据区域和第二心跳数据区域的示意图,本实施例中,第一心跳数据区域包括第一头部区域Header和N个第一数据区域data,N可以设置
为32,每个区域可以默认占用4K的大小。同时第二心跳数据区域也可以包含第二头部区域
Header和N个第二数据区域data,具有与第一心跳数据区域相同的存储设置,来存储关于第
二节点的相应信息。
[0065] 具体的,获取最新的第一GI值时,可以是先在第一头部区域中获取存储的最新的编号,根据该编号去找对应的第一数据区域,其中存储的第一GI值即为最新的第一GI值。当
然,获取最新的第二GI值时也可以采用上述方法。
[0066] 还需要说明的是,第一头部区域还可以存储已存储有第一GI值的第一数据区域的个数来记录第一心跳数据区域的已使用容量,存储所有的第一数据区域的个数N来记录第
一心跳数据区域的总体容量。当第一数据区域的编号是从1开始依次排列的,此时第一头部
区域存储的最新的编号也就相当于第一心跳数据区域的已使用容量。
[0067] 综上,通过第一数据区域的编号和第一头部区域存储的最新的编号可以快速获取第一心跳数据区域中的最新的第一GI值。
[0068] 作为一种优选的实施例,第一头部区域还用于存储第一节点的标识,从心跳盘中的第一心跳数据区域中获取最新的第一GI值和最新的第一GI值的产生时间,包括:
[0069] 根据第一节点的标识确定从心跳盘中的第一心跳数据区域中获取最新的第一GI值和最新的第一GI值的产生时间。
[0070] 本实施例中,第一头部区域还用于存储第一节点的标识,具体的,该标识可以为第一节点的唯一标识HOST_UUID,第一节点可以根据第一节点的标识来确定从第一心跳数据
区域中获取相关数据,避免了第一心跳数据区域和第二心跳数据区域的混淆,进而能够保
证获取正确的数据。
[0071] 作为一种优选的实施例,心跳盘的数据格式还包括元数据区域,用于存储心跳盘的magic、version和label。
[0072] 本实施例中,心跳盘的数据格式还包括元数据区域,具体的,该元数据区域可以占据心跳盘的数据格式中的前4K的大小,可以存储心跳盘的基础信息,例如magic、version和
label,来校验版本信息。
[0073] 作为一种优选的实施例,从心跳盘中的第一心跳数据区域中获取最新的第一GI值和最新的第一GI值的产生时间之后,还包括:
[0074] 在判定开机时间与最新的第一GI值的产生时间的时间差小于预设时间时,判断第二心跳数据区域中是否包含最新的第一GI值和基于最新的第一GI值产生的GI值;
[0075] 若是,则开启DRBD服务;
[0076] 若否,则从第二心跳数据区域中获取最新的第二GI值并在判定第一心跳数据区域中包含最新的第二GI值和基于最新的第二GI值产生的GI值时,开启DRBD服务。
[0077] 在第一节点掉电后再重启时,当其掉电时长超过预设时间并且是两个节点中先掉电的节点时,判定第一节点中的第一GI值为旧数据,不可容忍,此时不开启DRBD服务。当第
一节点掉电前最后产生的第一GI值,即第一节点的最新的第一GI值,其产生时间即为第一
节点的掉电时间,第一节点上电后的开机时间即为当前时间,掉电时间与当前时间的时间
差即为第一节点到当前为止的掉电时长。其中,本实施例考虑到掉电时长小于预设时间的
情况,当判定第二心跳数据区域中包含最新的第一GI值和基于最新的第一GI值产生的GI值
时,此时第一节点为先掉电的节点,但由于掉电时长较小,此时可以默认容忍小于预设时间
的数据的丢失,即此时舍弃在第一节点掉电后第二节点获取的新的第二GI值,认为第一节
点的第一GI值为可以容忍的旧数据,允许开启DRBD服务,其中,预设时间可以默认为15分
钟。
[0078] 在判定第二心跳数据区域中不包含最新的第一GI值和基于最新的第一GI值产生的GI值时,第一节点不是先掉电的节点;然后继续在判定第一心跳数据区域中包含最新的
第二GI值和基于最新的第二GI值产生的GI值时,第二节点是先掉电的节点,也就是第一节
点为后掉电的节点,此时第一节点的第一GI值为新数据,开启DRBD服务。
[0079] 综上,当时间差小于预设时间时,无论第一节点是先掉电还是后掉电,此时均可以开启DRBD服务。
[0080] 作为一种优选的实施例,判断第二心跳数据区域中是否包含最新的第一GI值和基于最新的第一GI值产生的GI值之后,还包括:
[0081] 若否,则从第二心跳数据区域中获取最新的第二GI值并在判定第一心跳数据区域中包含最新的第二GI值和基于最新的第二GI值产生的GI值时,开启DRBD服务。
[0082] 本实施例中,在时间差大于预设时间时,如果判定第二心跳数据区域中不包含最新的第一GI值和基于最新的第一GI值产生的GI值时,第一节点不是先掉电的节点,继续在
判定第一心跳数据区域中包含最新的第二GI值和基于最新的第二GI值产生的GI值时,第二
节点为先掉电的节点,也就是第一节点为后掉电的节点,此时第一节点的第一GI值也就为
新数据,开启DRBD服务。
[0083] 综上,当时间差大于预设时间时,第一节点为后掉电才可以开启DRBD服务。
[0084] 作为一种优选的实施例,第一心跳数据区域包括第一头部区域和N个第一数据区域,N为正整数,第一数据区域用于存储第一数据区域的编号、一个第一节点的第一GI值和
第一GI值的产生时间,第一数据区域与编号一一对应;第一头部区域用于存储最新的编号,
还包括:
[0085] 从存储区域中获取第一节点的实时的第一GI值和实时的第一GI值的产生时间;
[0086] 获取心跳盘中的第一头部区域中最新的编号;
[0087] 获取与最新的编号对应的第一数据区域中的已有的第一GI值和已有的第一GI值的产生时间;
[0088] 若实时的第一GI值与已有的第一GI值相同,则将已有的第一GI值的产生时间更新为实时的第一GI值的产生时间;
[0089] 若实时的第一GI值与已有的第一GI值不同,则将心跳盘中的第一头部区域中存储的最新的编号进行加一得到更新后的编号;
[0090] 将更新后的编号、实时的第一GI值和实时的第一GI值的产生时间存储至一个空白的第一数据区域中。
[0091] 本实施例中考虑到判定能否开启DRBD服务的相关信息是从心跳盘中获取的,所以心跳盘中的数据要进行不断的检测和更新,避免由于心跳盘中数据检测和更新不及时而造
成不开启DRBD服务,实现DRBD服务的高可用。
[0092] 例如图4,图4为本申请提供的一种更新心跳盘的流程图,第一节点的第一GI值等相关信息可以存储在第一节点的DRBD盘中,第一节点可以从第一节点的DRBD盘中定时读取
第一GI值等相关信息,并将其存储至心跳盘中的第一心跳数据区域中,对第一心跳数据区
域中的数据进行定时更新;第二节点也是如此,同时第一节点的DRBD盘通过网络与第二节
点的DRBD盘进行DRBD服务。
[0093] 具体的,从存储区域(例如第一节点的DRBD盘)中获取第一节点的实时的第一GI值和实时的第一GI值的产生时间,可以将实时的第一GI值记录为drbd_uuid;获取心跳盘中第
一心跳数据区域中的第一头部区域中存储的最新的编号;获取与最新的编号对应的第一数
据区域中的已有的第一GI值和已有的第一GI值的产生时间,可以将已有的第一GI值记录为
sentinel_uuid;可以比较drbd_uuid和sentinel_uuid,若一致,则更新已有的第一GI值的
产生时间;若不一致,则将心跳盘中的第一头部区域中存储的最新的编号进行加一得到更
新后的编号,并将更新后的编号、实时的第一GI值和实时的第一GI值的产生时间存储至一
个空白的第一数据区域中。其中,第二节点也可进行上述操作来更新第二心跳数据区域。
[0094] 综上,通过保持心跳盘中数据的不断的检测和更新,避免了心跳盘中数据检测和更新不及时而造成不开启DRBD服务,实现DRBD服务的高可用。
[0095] 作为一种优选的实施例,从存储区域中获取第一节点的实时的第一GI值和实时的第一GI值的产生时间,包括:
[0096] 每隔预设周期从存储区域中获取第一节点的实时的第一GI值和实时的第一GI值的产生时间。
[0097] 本实施例中对心跳盘进行检测和更新时,采用每隔预设周期,例如5秒,进行依次检测和更新,有效提高心跳盘的实时性,进而通过心跳盘中的数据能够更好地判断能否开
启DRBD服务。
[0098] 请参照图5,图5为本申请提供的一种节点的结构示意图,包括:
[0099] 存储器21,用于存储计算机程序;
[0100] 处理器22,用于执行计算机程序以实现防止DRBD裂脑的处理方法的步骤。
[0101] 对于本申请提供的一种节点的介绍,请参照上述实施例,本申请此处不再赘述。
[0102] 本申请提供了一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序,计算机程序被处理器执行时实现防止DRBD裂脑的处理方法的步骤。
[0103] 对于本申请提供的一种计算机可读存储介质的介绍,请参照上述实施例,本申请此处不再赘述。
[0104] 需要说明的是,在本说明书中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要
素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备
所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在
包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
[0105] 对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本申请。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的
一般原理可以在不脱离本申请的精神或范围的情况下,在其他实施例中实现。因此,本申请
将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一
致的最宽的范围。