DRBD簡介

簡介

什么是DRBD

DRBD (Distributed Replicated Block Device,分布式復(fù)制塊設(shè)備) 是由內(nèi)核模塊和相關(guān)腳本構(gòu)成,用以構(gòu)建高可用性的集群。其實(shí)現(xiàn)方式是通過網(wǎng)絡(luò)來鏡像整個設(shè)備??梢钥醋鍪且环N網(wǎng)絡(luò)RAID1
Distributed Replicated Block Device(DRBD)是一種基于軟件的,無共享,復(fù)制的存儲解決方案,在服務(wù)器之間的對塊設(shè)備(硬盤,分區(qū),邏輯卷等)進(jìn)行鏡像。DRBD工作在內(nèi)核 當(dāng)中的,類似于一種驅(qū)動模塊。DRBD工作的位置在文件系統(tǒng)的buffer cache和磁盤調(diào)度器之間,通過tcp/ip發(fā)給另外一臺主機(jī)到對方的tcp/ip最終發(fā)送給對方的drbd,再由對方的drbd存儲在本地對應(yīng)磁盤 上,類似于一個網(wǎng)絡(luò)RAID-1功能。在高可用(HA)中使用DRBD功能,可以代替使用一個共享盤陣。本地(主節(jié)點(diǎn))與遠(yuǎn)程主機(jī)(備節(jié)點(diǎn))的數(shù)據(jù)可以保 證實(shí)時同步。當(dāng)本地系統(tǒng)出現(xiàn)故障時,遠(yuǎn)程主機(jī)上還會保留有一份相同的數(shù)據(jù),可以繼續(xù)使用。DRBD的架構(gòu)如下圖

Paste_Image.png
簡單說一下DRBD主要功能,DRBD 負(fù)責(zé)接收數(shù)據(jù),把數(shù)據(jù)寫到本地磁盤,然后通過網(wǎng)絡(luò)將同樣的數(shù)據(jù)發(fā)送給另一個主機(jī),另一個主機(jī)再將數(shù)據(jù)存到自己的磁盤中。

DRBD 的工作原理

 每個設(shè)備(drbd 提供了不止一個設(shè)備)都有一個狀態(tài),可能是‘主’狀態(tài)或者‘從’狀態(tài) 在主節(jié)點(diǎn)上,應(yīng)用程序應(yīng)能運(yùn)行和訪問DRBD設(shè)備。每次寫入都會發(fā)往本地磁盤設(shè)備和從節(jié)點(diǎn)設(shè)備中。從節(jié)點(diǎn)只能簡單地把數(shù)據(jù)寫入它的磁盤設(shè)備上。讀取數(shù)據(jù)通常在本地進(jìn)行。如果主節(jié)點(diǎn)發(fā)生故障,心跳(heartbeat或corosync)將會把從節(jié)點(diǎn)轉(zhuǎn)換為主狀態(tài),并啟動其上的應(yīng)用程序。如果發(fā)生故障的節(jié)點(diǎn)恢復(fù)工作,它會成為新的從節(jié)點(diǎn),而且必須使自己的內(nèi)容與主節(jié)點(diǎn)的內(nèi)容保持同步。當(dāng)然,這些才做可能不會干擾到后臺的服務(wù)

底層設(shè)備支持

DRBD需要構(gòu)建在底層設(shè)備之上,然后構(gòu)建出一個塊設(shè)備出來。對于用戶來說,一個DRBD設(shè)備,就像是一塊物理的磁盤,可以在上面內(nèi)創(chuàng)建文件系統(tǒng)。DRBD所支持的底層設(shè)備有以下這些類:

  1. 一個磁盤,或者是磁盤的某一個分區(qū);
  2. 一個soft raid 設(shè)備;
  3. 一個LVM的邏輯卷;
  4. 一個EVMS(Enterprise Volume Management System,企業(yè)卷管理系統(tǒng))的卷;
  5. 其他任何的塊設(shè)備。

配置簡介

全局配置項(xiàng)(global)
基本上我們可以做的也就是配置usage-count是yes還是no了,usage-count參數(shù)其實(shí)只是為了讓linbit公司收集目前drbd的使用情況。當(dāng)drbd在安裝和升級的時候會通過http協(xié)議發(fā)送信息到linbit公司的服務(wù)器上面。

公共配置項(xiàng)(common)
這里的common,指的是drbd所管理的多個資源之間的common。配置項(xiàng)里面主要是配置drbd的所有resource可以設(shè)置為相同的參數(shù)項(xiàng),比如protocol,syncer等等。
</b>
DRBD設(shè)備
DRBD的虛擬塊設(shè)備。它有一個主設(shè)備號為147的設(shè)備,默認(rèn)的它的次要號碼編從0開始。在一組主機(jī)上,drbd的設(shè)備的設(shè)備名稱為/dev/drbdN,這個N通常和他的次設(shè)備號一致。
</b>
資源配置項(xiàng)(resource)
resource 項(xiàng)中配置的是drbd所管理的所有資源,包括節(jié)點(diǎn)的ip信息,底層存儲設(shè)備名稱,設(shè)備大小,meta信息存放方式,drbd對外提供的設(shè)備名等等。每一個 resource中都需要配置在每一個節(jié)點(diǎn)的信息,而不是單獨(dú)本節(jié)點(diǎn)的信息。并且資源名只能使用純ascii碼而且不能使用空白字符用于表示資源名稱。實(shí) 際上,在drbd的整個集群中,每一個節(jié)點(diǎn)上面的drbd.conf文件需要是完全一致的。
另外,resource還有很多其他的內(nèi)部配置項(xiàng):
net:網(wǎng)絡(luò)配置相關(guān)的內(nèi)容,可以設(shè)置是否允許雙主節(jié)點(diǎn)(allow-two-primaries)等。
startup:啟動時候的相關(guān)設(shè)置,比如設(shè)置啟動后誰作為primary(或者兩者都是primary:become-primary-on both)
syncer: 同步相關(guān)的設(shè)置。可以設(shè)置“重新”同步(re-synchronization)速度(rate)設(shè)置,也可以設(shè)置是否在線校驗(yàn)節(jié)點(diǎn)之間的數(shù)據(jù)一致性 (verify-alg 檢測算法有md5,sha1以及crc32等)。數(shù)據(jù)校驗(yàn)可能是一個比較重要的事情,在打開在線校驗(yàn)功能后,我們可以通過相關(guān)命令(drbdadm verify resource_name)來啟動在線校驗(yàn)。在校驗(yàn)過程中,drbd會記錄下節(jié)點(diǎn)之間不一致的block,但是不會阻塞任何行為,即使是在該不一致的 block上面的io請求。當(dāng)不一致的block發(fā)生后,drbd就需要有re-synchronization動作,而syncer里面設(shè)置的rate 項(xiàng),主要就是用于re-synchronization的時候,因?yàn)槿绻写罅坎灰恢碌臄?shù)據(jù)的時候,我們不可能將所有帶寬都分配給drbd做re- synchronization,這樣會影響對外提提供服務(wù)。rate的設(shè)置和還需要考慮IO能力的影響。如果我們會有一個千兆網(wǎng)絡(luò)出口,但是我們的磁盤 IO能力每秒只有50M,那么實(shí)際的處理能力就只有50M,一般來說,設(shè)置網(wǎng)絡(luò)IO能力和磁盤IO能力中最小者的30%的帶寬給re- synchronization是比較合適的(官方說明)。另外,drbd還提供了一個臨時的rate更改命令,可以臨時性的更改syncer的rate 值:
drbdsetup /dev/drbd0 syncer -r 100M
這樣就臨時的設(shè)置了re-synchronization的速度為100M。不過在re-synchronization結(jié)束之后,你需要通過
drbdadm adjust resource_name
來讓drbd按照配置中的rate來工作。

角色、模式和數(shù)據(jù)同步協(xié)議

角色
在drbd構(gòu)造的集群中,資源具有角色的概念,分別為primary和secondary。
所有設(shè)為primary的資源將不受限制進(jìn)行讀寫操作??梢詣?chuàng)建文件系統(tǒng),可以使用裸設(shè)備,甚至直接io。所有設(shè)為secondary的設(shè)備中不能掛載,不能讀寫
模式
drbd也有drbd mode:單主模型(主從),雙主模型(drbd只有在8.0以后的版本才支持雙主模型)
在單主模型下drbd可以使用任意的文件系統(tǒng)
單在雙主模型下只能使用集群文件系統(tǒng),常用的開源的集群文件系統(tǒng)有:ocfs2和gfs2
數(shù)據(jù)同步協(xié)議
drbd有三種數(shù)據(jù)同步模式:同步,異步,半同步
異步:指的是當(dāng)數(shù)據(jù)寫到磁盤上,并且復(fù)制的數(shù)據(jù)已經(jīng)被放到我們的tcp緩沖區(qū)并等待發(fā)送以后,就認(rèn)為寫入完成
半同步:指的是數(shù)據(jù)已經(jīng)寫到磁盤上,并且這些數(shù)據(jù)已經(jīng)發(fā)送到對方內(nèi)存緩沖區(qū),對方的tcp已經(jīng)收到數(shù)據(jù),并宣布寫入
同步:指的是主節(jié)點(diǎn)已寫入,從節(jié)點(diǎn)磁盤也寫入
</b>
drbd 的復(fù)制模型是靠protocol關(guān)鍵字來定義的:protocol A表示異步;protocol B表示半同步;protocol C表示同步,默認(rèn)為protocol C。在同步模式下只有主、從節(jié)點(diǎn)上兩塊磁盤同時損害才會導(dǎo)致數(shù)據(jù)丟失。在半同步模式下只有主節(jié)點(diǎn)宕機(jī),同時從節(jié)點(diǎn)異常停電才會導(dǎo)致數(shù)據(jù)丟失。
注意:drbd的主不會監(jiān)控從的狀態(tài)所以有可能會造成數(shù)據(jù)重傳

metadata

DRBD將數(shù)據(jù)的各種信息塊保存在一個專用的區(qū)域里,這些metadata包括了
a,DRBD設(shè)備的大小
b,產(chǎn)生的標(biāo)識
c,活動日志
d,快速同步的位圖
metadata的存儲方式有內(nèi)部和外部兩種方式,使用哪種配置都是在資源配置中定義的
內(nèi)部meta data
內(nèi)部metadata存放在同一塊硬盤或分區(qū)的最后的位置上
優(yōu)點(diǎn):metadata和數(shù)據(jù)是緊密聯(lián)系在一起的,如果硬盤損壞,metadata同樣就沒有了,同樣在恢復(fù)的時候,metadata也會一起被恢復(fù)回來
缺點(diǎn):metadata和數(shù)據(jù)在同一塊硬盤上,對于寫操作的吞吐量會帶來負(fù)面的影響,因?yàn)閼?yīng)用程序的寫請求會觸發(fā)metadata的更新,這樣寫操作就會造成兩次額外的磁頭讀寫移動。
外部meta data
外部的metadata存放在和數(shù)據(jù)磁盤分開的獨(dú)立的塊設(shè)備上
優(yōu)點(diǎn):對于一些寫操作可以對一些潛在的行為提供一些改進(jìn)
缺點(diǎn):metadata和數(shù)據(jù)不是聯(lián)系在一起的,所以如果數(shù)據(jù)盤出現(xiàn)故障,在更換新盤的時候就需要認(rèn)為的干預(yù)操作來進(jìn)行現(xiàn)有node對心硬盤的同步了
如果硬盤上有數(shù)據(jù),并且硬盤或者分區(qū)不支持?jǐn)U展,或者現(xiàn)有的文件系統(tǒng)不支持shrinking,那就必須使用外部metadata這種方式了。
可以通過下面的命令來計算metadata需要占用的扇區(qū)數(shù)

split brain腦裂

split brain實(shí)際上是指在某種情況下,造成drbd的兩個節(jié)點(diǎn)斷開連接,都以primary的身份來運(yùn)行。當(dāng)drbd某primary節(jié)點(diǎn)連接對方節(jié)點(diǎn)準(zhǔn)備 發(fā)送信息的時候如果發(fā)現(xiàn)對方也是primary狀態(tài),那么會立刻自行斷開連接,并認(rèn)定當(dāng)前已經(jīng)發(fā)生split brain了,這時候他會在系統(tǒng)日志中記錄以下信息:“Split-Brain detected,dropping connection!”當(dāng)發(fā)生split brain之后,如果查看連接狀態(tài),其中至少會有一個是StandAlone狀態(tài),另外一個可能也是StandAlone(如果是同時發(fā)現(xiàn)split brain狀態(tài)),也有可能是WFConnection的狀態(tài)。
如果我們在配置文件中配置了自動解決split brain(好像linbit不推薦這樣做),drbd會自行解決split brain問題,可通過如下策略進(jìn)行配置。
Discarding modifications made on the “younger” primary。在這種模式下,當(dāng)網(wǎng)絡(luò)重新建立連接并且發(fā)現(xiàn)了裂腦,DRBD會丟棄最后切換到主節(jié)點(diǎn)上的主機(jī)所修改的數(shù)據(jù)。
Discarding modifications made on the “older” primary. 在這種模式下,當(dāng)網(wǎng)絡(luò)重新建立連接并且發(fā)現(xiàn)了裂腦,DRBD丟棄首先切換到主節(jié)點(diǎn)上的主機(jī)后所修改的數(shù)據(jù)。
Discarding modifications on the primary with fewer changes.在這種模式下,當(dāng)網(wǎng)絡(luò)重新建立連接并且發(fā)現(xiàn)了裂腦,DRBD會比較兩臺主機(jī)之間修改的數(shù)據(jù)量,并丟棄修改數(shù)據(jù)量較少的主機(jī)上的所有數(shù)據(jù)。
Graceful recovery from split brain if one host has had no intermediate changes.在這種模式下,如果其中一個主機(jī)在腦裂期間并沒有數(shù)據(jù)修改,DRBD會自動重新進(jìn)行數(shù)據(jù)同步,并宣布腦裂問題已解決。(這種情況幾乎不可 能存在)
注意:自動裂腦自動修復(fù)能不能被接受取決于個人應(yīng)用。考慮 建立一個DRBD的例子庫。在“丟棄修改比較少的主節(jié)點(diǎn)的修改”興許對web應(yīng)用好過數(shù)據(jù)庫應(yīng)用。與此相反,財務(wù)的數(shù)據(jù)庫則是對于任何修改的丟失都是不能 容忍的,這就需要不管在什么情況下都需要手工修復(fù)裂腦問題。因此需要在啟用裂腦自動修復(fù)前考慮你的應(yīng)用情況。
如果沒有配置 split brain自動解決方案,我們可以手動解決。首先我們必須要確定哪一邊應(yīng)該作為解決問題后的primary,一旦確定好這一點(diǎn),那么我們同時也就確定接受 丟失在split brain之后另外一個節(jié)點(diǎn)上面所做的所有數(shù)據(jù)變更了。當(dāng)這些確定下來后,我們就可以通過以下操作來恢復(fù)了:
</b>
1、首先在確定要作為secondary的節(jié)點(diǎn)上面切換成secondary并放棄該資源的數(shù)據(jù):
drbdadm secondary resource_name
drbdadm — –discard-my-data connect resource_name
2、在要作為primary的節(jié)點(diǎn)重新連接secondary(如果這個節(jié)點(diǎn)當(dāng)前的連接狀態(tài)為WFConnection的話,可以省略)
drbdadm connect resource_name
當(dāng)作完這些動作之后,從新的primary到secondary的re-synchnorisation會自動開始。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容