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,而後斷開鏈接。

相關文章
相關標籤/搜索