drbd使用代標識gi tuple來確定複製資料的「代」,通過gi tuple,drbd可以確定兩個節點是不是屬於同一集群的事實(而不是意外連線的兩個節點),確定重新同步時同步的方向(如果必要的話) ,確定是完全重新同步或者是部分重新同步是否滿足需求以及確認是否發生了裂腦。因此,gi的使用在drbd的演算法中是非常重要的。
gi元組(gi tuple)由乙個currentuuid、乙個bitmapuuid和兩個historyuuid組成,每個新的資料生成的標識都由乙個8位元組的、全域性唯一的識別符號(uuid)標誌。如下圖所示:
一般來說,會有如下三種情況下,drbd會產生乙個新的gi資料代:
注意,只要資源處於連線狀態,且兩個節點的磁碟狀態為uptodate,那麼目前兩個節點上的gi元組就是相同的。
(1) 新配置的資源
特徵:兩個節點上的currentuuid為空
乙個新配置的資源,沒有進行完整裝置初始同步。
必須手動啟動。
(2) 初始節點建立網路連線
特徵:本地節點有currentuuid,對等節點currentuuid為空。
當節點間建立連線後,兩節點交換gi tuple表示狀態。
這是乙個新配置的資源
剛啟動初始裝置完全同步的正常情況
此時,本地節點被選中作為初始同步源
drbd設定磁碟上的同步位圖(這意味著它進行整個裝置同步)的所有位。並開始作為乙個同步源進行同步。
(3) 本地節點node1為primary,node2為secondary時,secondary節點故障
特徵:當前節點的bitmapuuid與對等節點的currentuuid一致,且對等節點的的bitmapuuid為空。
當前節點為主節點,對等節點為次節點
次節點發生故障
這意味著在此期間對等節點從來沒有公升級為primary,並在相同的資料生成的基礎上都單獨工作。
現在drbd正常啟動後,本地成為同步源節點,後台重新同步。
(4)兩個節點共有乙個祖先uuid,且對等節點有最新的資料
特徵:當前節點的currentuuid與對等節點的historyuuid之一相同
兩個節點共有乙個祖先uuid
對等節點有最新的資料,但是儲存在對等節點bitmap中的資料是過時和不能被使用的。
此時,乙個正常的同步是不夠的。
需要本地節點作為同步目標,drbd標識整個裝置out-of-syn,並初始化全部進行重新同步
(5)裂腦情況1
特徵:本地節點的currentuuid 和對等節點的currentuuid不同,而兩節點bitmapuuid的匹配
這就是裂腦,split-brain
此時前乙個資料代是相同的父代。
可以呼叫裂腦自動恢復策略(如果有配置),否則,drbd斷開連線,並等待人工腦裂進行處理。
(6)裂腦情況2
特徵:兩節點的currentuuid 和bitmapuuid都不匹配。
這也裂腦且不是相同的父代(ancestor generations)
此時,即使配置自動恢復策略,也沒有用。
drbd將斷開連線,並等待人工腦裂進行處理。
(7) 集群中兩個彼此之間並不認識節點
特徵:兩個gi元組沒有乙個匹配的uuid
這是drbd意外連線集群中兩個彼此之間並不認識節點。
drbd僅記錄乙個無關資料的警告log,然後斷開連線。
《資料結構》 三元組的實現
在此給出三元組的c語言實現方法,h檔案與.c檔案沒有分開,寫在了乙個檔案中,可以貼上放在clockblocks中執行,或者liunx平台。include include define ok 1 define error 0 typedef int status typedef int elemtyp...
TCP IP的四元組 五元組 七元組
四元組是 源ip位址 目的ip位址 源埠 目的埠 五元組是 源ip位址 目的ip位址 協議號 源埠 目的埠 七元組是 源ip位址 目的ip位址 協議號 源埠 目的埠,服務型別以及介面索引 協議號 ip是網路層協議,ip頭中的協議號用來說明ip報文中承載的是哪種協議,協議號標識上層是什麼協議 一般是傳...
三元組運算的實現
在三元組中主要需要弄清楚它的結構體,其中包含的成員。在進行賦值的時候應該弄清楚是對哪個結構體成員進行的操作。這次程式的功能只實現了加減法,後續還會進行補充逆序和乘法。include include define maxsize 100 typedef structtriple typedef str...