DRBD的元数据实现:GI元组的原理

1、GI元组

DRBD使用代标识GI tuple来肯定复制数据的“代”,经过GI tuple,DRBD能够肯定两个节点是否是属于同一集群的事实(而不是意外链接的两个节点),肯定从新同步时同步的方向(若是必要的话) ,肯定是彻底从新同步或者是部分从新同步是否知足需求以及确认是否发生了裂脑。所以,GI的使用在DRBD的算法中是很是重要的。算法

GI元组(GI tuple)由一个CurrentUUID、一个BitmapUUID和两个HistoryUUID组成,每一个新的数据生成的标识都由一个8字节的、全局惟一的标识符(UUID)标志。以下图所示: 网络

  • CurrentUUID:当前数据代的UUID,当一个资源链接并彻底同步即磁盘状态为UpToDate时,两节点之间的UUID是相同的。
  • BitmapUUID:磁盘的同步位图的变化跟踪代的UUID。只有在断开模式磁盘上的同步位图才与该标识符有关。若是资源是连通的,此UUID老是空。
  • HistoryUUID:用于保存前几代的两个数据的标识符。

image

通常来讲,会有以下三种状况下,DRBD会产生一个新的GI数据代:.net

  • 最初设备的初始化彻底同步
  • 一个断开链接的资源切换到主角色(Primary)
  • 主角色的资源断开链接

 

注意,只要资源处于链接状态,且两个节点的磁盘状态为UpToDate,那么目前两个节点上的GI元组就是相同的。资源

2、GI元组的变化过程

image

 

3、经过GI元组识别集群节点的状态

(1) 新配置的资源 get

特征:两个节点上的currentUUID为空 同步

image

一个新配置的资源,没有进行完整设备初始同步。 it

必须手动启动。 io

 

(2) 初始节点创建网络链接集群

特征:本地节点有currentUUID,对等节点currentUUID为空。后台

image

当节点间创建链接后,两节点交换GI tuple表示状态。

这是一个新配置的资源
刚启动初始设备彻底同步的正常状况
此时,本地节点被选中做为初始同步源
DRBD设置磁盘上的同步位图(这意味着它进行整个设备同步)的全部位。并开始做为一个同步源进行同步。

 

(3) 本地节点Node1为Primary,Node2为Secondary时,Secondary节点故障

特征:当前节点的BitmapUUID与对等节点的CurrentUUID一致,且对等节点的的BitmapUUID为空。

image

当前节点为主节点,对等节点为次节点
次节点发生故障
这意味着在此期间对等节点历来没有升级为Primary,并在相同的数据生成的基础上都单独工做。
如今DRBD正常启动后,本地成为同步源节点,后台从新同步。

 

(4)两个节点共有一个祖先UUID,且对等节点有最新的数据

特征:当前节点的CurrentUUID与对等节点的HistoryUUID之一相同

image

 

两个节点共有一个祖先UUID
对等节点有最新的数据,可是保存在对等节点Bitmap中的数据是过期和不能被使用的。
此时,一个正常的同步是不够的。
须要本地节点做为同步目标,DRBD标识整个设备out-of-syn,并初始化所有进行从新同步

 

(5)裂脑状况1

特征:本地节点的CurrentUUID 和对等节点的CurrentUUID不一样,而两节点BitmapUUID的匹配

image

 

这就是裂脑,split-brain
此时前一个数据代是相同的父代。
能够调用裂脑自动恢复策略(若是有配置),不然,DRBD断开链接,并等待人工脑裂进行处理。

(6)裂脑状况2

特征:两节点的CurrentUUID 和BitmapUUID都不匹配。

image

这也裂脑且不是相同的父代(ancestor generations)
此时,即便配置自动恢复策略,也没有用。
DRBD将断开链接,并等待人工脑裂进行处理。

(7) 集群中两个彼此之间并不认识节点
特征:两个GI元组没有一个匹配的UUID

image

这是DRBD意外链接集群中两个彼此之间并不认识节点。DRBD仅记录一个无关数据的警告log,而后断开链接。

相关文章
相关标签/搜索