一、DRBD介紹
DRBD(Distributed ReplicatedBlock Device)是一種基於軟件的,無共享,分布式塊設備復制的存儲解決方案,在服務器之間的對塊設備(硬盤,分區,邏輯卷等) 進行鏡像。也就是說當某一個應用程序完成寫操作后,它提交的數據不僅僅會保存在本地塊設備上,DRBD也會將這份數據復制一份,通過網絡傳輸到另一個節點的塊設 備上,這樣,兩個節點上的塊設備上的數據將會保存一致,這就是鏡像功能。 DRBD是由內核模塊和相關腳本而構成,用以構建高可用性的集群,其實現方式是通過網絡來鏡像整個設備。它允許用戶在遠程機器上建立一個本地塊設備的實時鏡像, 與心跳連接結合使用,可以把它看作是一種網絡RAID,它允許用戶在遠程機器上建立一個本地塊設備的實時鏡像。 DRBD工作在內核當中,類似於一種驅動模塊。DRBD工作的位置在文件系統的buffer cache和磁盤調度器之間,通過tcp/ip發給另外一台主機到對方的tcp/ip最終發送 給對方的drbd,再由對方的drbd存儲在本地對應磁盤 上,類似於一個網絡RAID-1功能。在高可用(HA)中使用DRBD功能,可以代替使用一個共享盤陣。本地(主節點) 與遠程主機(備節點)的數據可以保 證實時同步。當本地系統出現故障時,遠程主機上還會保留有一份相同的數據,可以繼續使用。
二、DRDB的工作原理
DRBD是linux的內核的存儲層中的一個分布式存儲系統,可用使用DRBD在兩台Linux服務器之間共享塊設備,共享文件系統和數據。類似於一個網絡RAID-1的功能,
其工作原理的架構圖如下:
DRBD底層設備支持
DRBD需要構建在底層設備之上,然后構建出一個塊設備出來。對於用戶來說,一個DRBD設備,就像是一塊物理的磁盤,可以在上面內創建文件系統。 DRBD所支持的底層設備有以下這些類: 1)一個磁盤,或者是磁盤的某一個分區; 2)一個soft raid 設備; 3)一個LVM的邏輯卷; 4)一個EVMS(Enterprise Volume Management System,企業卷管理系統)的卷; 5)其他任何的塊設備。
DRBD工作原理
DRBD是一種塊設備,可以被用於高可用(HA)之中.它類似於一個網絡RAID-1功能.當你將數據寫入本地 文件系統時,數據還將會被發送到網絡中另一台主機上. 以相同的形式記錄在一個文件系統中。 本地(主節點)與遠程主機(備節點)的數據可以保證實時同步.當本地系統出現故障時,遠程主機上還會 保留有一份相 同的數據,可以繼續使用.在高可用(HA)中使用DRBD功能,可以代替使用一個共享盤陣.因為數據同時存在於本地主機和遠程主機上,切換時,遠程主機只要使用 它上面的那份備份數據,就可以繼續進行服務了。
DRBD是如何工作的(工作機制)
(DRBD Primary)負責接收數據,把數據寫到本地磁盤並發送給另一台主機(DRBD Secondary),另一個主機再將數據存到自己的磁盤中。 目前,DRBD每次只允許對一個節點進行讀寫訪問,但這對於通常的故障切換高可用集群來說已經足夠用了。 以后的版本將支持兩個節點進行讀寫存取。 DRBD協議說明 1)數據一旦寫入磁盤並發送到網絡中就認為完成了寫入操作。 2)收到接收確認就認為完成了寫入操作。 3)收到寫入確認就認為完成了寫入操作。
DRBD與HA的關系
一個DRBD系統由兩個節點構成,與HA集群類似,也有主節點和備用節點之分,在帶有主要設備的節點上,應用程序和操作系統可以運行和訪問DRBD設備(/dev/drbd*)。 在主節點寫入的數據通過DRBD設備存儲到主節點的磁盤設備中,同時,這個數據也會自動發送到備用節點對應的DRBD設備,最終寫入備用節點的磁盤設備上,在備用節點上, DRBD只是將數據從DRBD設備寫入到備用節點的磁盤中。現在大部分的高可用性集群都會使用共享存儲,而DRBD也可以作為一個共享存儲設備,使用DRBD不需要太多的硬件的投資。 因為它在TCP/IP網絡中運行,所以,利用DRBD作為共享存儲設備,要節約很多成本,因為價格要比專用的存儲網絡便宜很多;其性能與穩定性方面也不錯
三、DRBD的特性(基本功能)
分布式復制塊設備(DRBD技術)是一種基於軟件的,無共享,復制的存儲解決方案,在服務器之間的對塊設備(硬盤,分區,邏輯卷等)進行鏡像。 DRBD鏡像數據的特性: 1)實時性:當某個應用程序完成對數據的修改時,復制功能立即發生 2)透明性:應用程序的數據存儲在鏡像塊設備上是獨立透明的,他們的數據在兩個節點上都保存一份,因此,無論哪一台服務器宕機, 都不會影響應用程序讀取數據的操作,所以說是透明的。 3)同步鏡像和異步鏡像:同步鏡像表示當應用程序提交本地的寫操作后,數據后會同步寫到兩個節點上去;異步鏡像表示當應用程序提交寫操作后, 只有當本地的節點上完成寫操作后,另一個節點才可以完成寫操作。
四、DRBD的用戶空間管理工具
為了能夠配置和管理drbd的資源,drbd提供了一些管理工具與內核模塊進行通信: 1)drbdadm:高級的DRBD程序管理套件工具。它從配置文件/etc/drbd.conf中獲取所有配置參數。drbdadm為drbdsetup和drbdmeta兩個命令充當程序的前端應用, 執行drbdadm實際是執行的drbdsetup和drbdeta兩個命令。 2)drbdsetup:drbdsetup可以讓用戶配置已經加載在內核中運行的DRBD模塊,它是底層的DRBD程序管理套件工具。使用該命令時,所有的配置參數都需要直接在 命令行中定義,雖然命令很靈活,但是大大的降低了命令的簡單易用性,因此很多的用戶很少使用drbdsetup。 3)drbdmeta:drbdmeta允許用戶創建、轉儲、還原和修改drbd的元數據結構。這個命令也是用戶極少用到。
五、DRBD的模式
DRBD有2中模式,一種是DRBD的主從模式,另一種是DRBD的雙主模式 1)DRBD的主從模式 這種模式下,其中一個節點作為主節點,另一個節點作為從節點。其中主節點可以執行讀、寫操作;從節點不可以掛載文件系統,因此,也不可以執行讀寫操作。 在這種模式下,資源在任何時間只能存儲在主節點上。這種模式可用在任何的文件系統上(EXT3、EXT4、XFS等等)。默認這種模式下,一旦主節點發生故障,從 節點需要手工將資源進行轉移,且主節點變成從節點和從節點變成主節點需要手動進行切換。不能自動進行轉移,因此比較麻煩。 為了解決手動將資源和節點進行轉移,可以將DRBD做成高可用集群的資源代理(RA),這樣一旦其中的一個節點宕機,資源會自動轉移到另一個節點,從而保證服 務的連續性。 2)DRBD的雙主模式 這是DRBD8.0之后的新特性 在雙主模式下,任何資源在任何特定的時間都存在兩個主節點。這種模式需要一個共享的集群文件系統,利用分布式的鎖機制進行管理,如GFS和OCFS2。 部署雙主模式時,DRBD可以是負載均衡的集群,這就需要從兩個並發的主節點中選取一個首選的訪問數據。這種模式默認是禁用的,如果要是用的話必須在配置文 件中進行聲明。
六、DRBD的同步協議
DRBD的復制功能就是將應用程序提交的數據一份保存在本地節點,一份復制傳輸保存在另一個節點上。但是DRBD需要對傳輸的數據進行確認以便保證另一個節點的 寫操作完成,就需要用到DRBD的同步協議,DRBD同步協議有三種: 1)協議A:異步復制協議 一旦本地磁盤寫入已經完成,數據包已在發送隊列中,則寫被認為是完成的。在一個節點發生故障時,可能發生數據丟失,因為被寫入到遠程節點上的數據可能仍在發送隊列。 盡管,在故障轉移節點上的數據是一致的,但沒有及時更新。這通常是用於地理上分開的節點。
數據在本地完成寫操作且數據已經發送到TCP/IP協議棧的隊列中,則認為寫操作完成。如果本地節點的寫操作完成,此時本地節點發生故障,而數據還處在TCP/IP隊列中, 則數據不會發送到對端節點上。因此,兩個節點的數據將不會保持一致。這種協議雖然高效,但是並不能保證數據的可靠性。 2)協議B:內存同步(半同步)復制協議 一旦本地磁盤寫入已完成且復制數據包達到了對等節點則認為寫在主節點上被認為是完成的。數據丟失可能發生在參加的兩個節點同時故障的情況下,因為在傳輸中的數據 可能不會被提交到磁盤
數據在本地完成寫操作且數據已到達對端節點則認為寫操作完成。如果兩個節點同時發生故障,即使數據到達對端節點,這種方式同樣也會導致在對端節點和本地 節點的數據不一致現象,也不具有可靠性。 3)協議C:同步復制協議 只有在本地和遠程節點的磁盤已經確認了寫操作完成,寫才被認為完成。沒有任何數據丟失,所以這是一個群集節點的流行模式,但I / O吞吐量依賴於網絡帶寬。 只有當本地節點的磁盤和對端節點的磁盤都完成了寫操作,才認為寫操作完成。這是集群流行的一種方式,應用也是最多的,這種方式雖然不高效,但是最可靠。 以上三種協議中,一般使用協議C,但選擇C協議將影響流量,從而影響網絡時延。為了數據可靠性,在生產環境使用時須慎重選項使用哪一種協議。
七、DRBD的資源
在DRBD中,資源是所有可復制移動存儲設備的總稱,它包括: 1)資源名稱:資源名稱可以是除了空白字符以外的任意ASCII碼字符 2)DRBD設備:DRBD的虛擬塊設備。在雙方節點上,DRBD設備的設備文件命名方式;一般為/dev/drbdN,其主設備號147,N是次設備號 3)磁盤配置:DRBD內部應用需要本地數據副本,元數據。在雙方節點上,為各自提供的存儲設備。 4)網絡配置:雙方數據同步時所使用的網絡屬性;
八、DRBD的配置說明
----------全局配置項(global)---------- 基本上我們可以做的也就是配置usage-count是yes還是no了,usage-count參數其實只是為了讓linbit公司收集目前drbd的使用情況。當drbd在安裝和升級的時候會通過http 協議發送信息到linbit公司的服務器上面。 ----------公共配置項(common)---------- 這里的common,指的是drbd所管理的多個資源之間的common。配置項里面主要是配置drbd的所有resource可以設置為相同的參數項,比如protocol,syncer等等。 ----------DRBD設備---------- DRBD的虛擬塊設備。它有一個主設備號為147的設備,默認的它的次要號碼編從0開始。在一組主機上,drbd的設備的設備名稱為/dev/drbdN,這個N通常和他的次設備號一致。 資源配置項(resource) resource 項中配置的是drbd所管理的所有資源,包括節點的ip信息,底層存儲設備名稱,設備大小,meta信息存放方式,drbd對外提供的設備名等等。每一個 resource中都需要配置在每一個節點的信息,而不是單獨本節點的信息。並且資源名只能使用純ascii碼而且不能使用空白字符用於表示資源名稱。實 際上,在drbd的整個集群中,每一個節點上面的drbd.conf文件需要是完全一致的。 另外,resource還有很多其他的內部配置項: 1)net:網絡配置相關的內容,可以設置是否允許雙主節點(allow-two-primaries)等。 2)startup:啟動時候的相關設置,比如設置啟動后誰作為primary(或者兩者都是primary:become-primary-on both) 3)syncer: 同步相關的設置。可以設置“重新”同步(re-synchronization)速度(rate)設置,也可以設置是否在線校驗節點之間的數據一致性 (verify-alg 檢測算法有md5,sha1以及crc32等)。數據校驗可能是一個比較重要的事情,在打開在線校驗功能后,我們可以通過相關命令(drbdadm verify resource_name)來啟動在線校驗。在校驗過程中,drbd會記錄下節點之間不一致的block,但是不會阻塞任何行為,即使是在該不一致的 block上面的io請求。當不一致的block發生后,drbd就需要有re-synchronization動作,而syncer里面設置的rate 項,主要就是用於re-synchronization的時候,因為如果有大量不一致的數據的時候,我們不可能將所有帶寬都分配給drbd做re- synchronization,這樣會影響對外提提供服務。rate的設置和還需要考慮IO能力的影響。如果我們會有一個千兆網絡出口,但是我們的磁盤 IO能力每秒只有50M,那么實際的處理能力就只有50M,一般來說,設置網絡IO能力和磁盤IO能力中最小者的30%的帶寬給re- synchronization是比較合適的(官方說明)。另外,drbd還提供了一個臨時的rate更改命令,可以臨時性的更改syncer的rate 值: 4)drbdsetup /dev/drbd0 syncer -r 100M 這樣就臨時的設置了re-synchronization的速度為100M。不過在re-synchronization結束之后,需要通過 drbdadm adjust resource_name 來讓drbd按照配置中的rate來工作。 ----------角色---------- 在drbd構造的集群中,資源具有角色的概念,分別為primary和secondary。 所有設為primary的資源將不受限制進行讀寫操作。可以創建文件系統,可以使用裸設備,甚至直接io。所有設為secondary的設備中不能掛載,不能讀寫。 ----------數據同步協議---------- drbd有三種數據同步模式:同步,異步,半同步 1)異步:指的是當數據寫到磁盤上,並且復制的數據已經被放到我們的tcp緩沖區並等待發送以后,就認為寫入完成 2)半同步:指的是數據已經寫到磁盤上,並且這些數據已經發送到對方內存緩沖區,對方的tcp已經收到數據,並宣布寫入 3)同步:指的是主節點已寫入,從節點磁盤也寫入 drbd 的復制模型是靠protocol關鍵字來定義的: protocol A表示異步; protocol B表示半同步; protocol C表示同步, 默認為protocol C。在同步模式下只有主、從節點上兩塊磁盤同時損害才會導致數據丟失。在半同步模式下只有主節點宕機,同時從節點異常停電才會導致數據丟失。 注意:drbd的主不會監控從的狀態所以有可能會造成數據重傳 -----------------------------------metadata---------------------------------- DRBD將數據的各種信息塊保存在一個專用的區域里,這些metadata包括了 1)DRBD設備的大小 2)產生的標識 3)活動日志 4)快速同步的位圖 metadata的存儲方式有內部和外部兩種方式,使用哪種配置都是在資源配置中定義的 內部meta data 內部metadata存放在同一塊硬盤或分區的最后的位置上 優點:metadata和數據是緊密聯系在一起的,如果硬盤損壞,metadata同樣就沒有了,同樣在恢復的時候,metadata也會一起被恢復回來 缺點:metadata和數據在同一塊硬盤上,對於寫操作的吞吐量會帶來負面的影響,因為應用程序的寫請求會觸發metadata的更新,這樣寫操作就會造成兩次額外的磁頭讀寫移動。 外部meta data 外部的metadata存放在和數據磁盤分開的獨立的塊設備上 優點:對於一些寫操作可以對一些潛在的行為提供一些改進 缺點:metadata和數據不是聯系在一起的,所以如果數據盤出現故障,在更換新盤的時候就需要認為的干預操作來進行現有node對心硬盤的同步了 如果硬盤上有數據,並且硬盤或者分區不支持擴展,或者現有的文件系統不支持shrinking,那就必須使用外部metadata這種方式了。 可以通過下面的命令來計算metadata需要占用的扇區數 ---------------------------------------------split brain腦裂--------------------------------------------- split brain實際上是指在某種情況下,造成drbd的兩個節點斷開連接,都以primary的身份來運行。當drbd某primary節點連接對方節點准備 發送信息的時候如果發現對方 也是primary狀態,那么會立刻自行斷開連接,並認定當前已經發生split brain了,這時候他會在系統日志中記錄以下信息: "Split-Brain detected,dropping connection!" 當發生split brain之后,如果查看連接狀態,其中至少會有一個是StandAlone狀態,另外一個可能也是StandAlone(如果是同時發現split brain狀態),也有可能是 WFConnection的狀態。 如果在配置文件中配置了自動解決split brain(好像linbit不推薦這樣做),drbd會自行解決split brain問題,可通過如下策略進行配置。 1)Discarding modifications made on the “younger” primary。在這種模式下,當網絡重新建立連接並且發現了裂腦,DRBD會丟棄最后切換到主節點上的主機所修改的數據。 2)Discarding modifications made on the “older” primary. 在這種模式下,當網絡重新建立連接並且發現了裂腦,DRBD丟棄首先切換到主節點上的主機后所修改的數據。 3)Discarding modifications on the primary with fewer changes.在這種模式下,當網絡重新建立連接並且發現了裂腦,DRBD會比較兩台主機之間修改的數據量,並丟棄修 改數據量較少的主機上的所有數據。 4)Graceful recovery from split brain if one host has had no intermediate changes.在這種模式下,如果其中一個主機在腦裂期間並沒有數據修改,DRBD會自動重新進 行數據同步,並宣布腦裂問題已解決。(這種情況幾乎不可 能存在) 特別注意: 自動裂腦自動修復能不能被接受取決於個人應用。考慮 建立一個DRBD的例子庫。在“丟棄修改比較少的主節點的修改”興許對web應用好過數據庫應用。與此相反,財務的數據庫 則是對於任何修改的丟失都是不能 容忍的,這就需要不管在什么情況下都需要手工修復裂腦問題。因此需要在啟用裂腦自動修復前考慮你的應用情況。 如果沒有配置 split brain自動解決方案,我們可以手動解決。首先我們必須要確定哪一邊應該作為解決問題后的primary,一旦確定好這一點,那么我們同時也就確定接受丟失 在split brain之后另外一個節點上面所做的所有數據變更了。當這些確定下來后,就可以通過以下操作來恢復了: 1)首先在確定要作為secondary的節點上面切換成secondary並放棄該資源的數據: drbdadm secondary resource_name drbdadm — –discard-my-data connect resource_name 2)在要作為primary的節點重新連接secondary(如果這個節點當前的連接狀態為WFConnection的話,可以省略) drbdadm connect resource_name 當作完這些動作之后,從新的primary到secondary的re-synchnorisation會自動開始。
九、DRBD的配置文件說明
DRBD的主配置文件為/etc/drbd.conf;為了管理的便捷性, 目前通常會將配置文件分成多個部分,且都保存至/etc/drbd.d目錄中,主配置文件中僅使用"include"指令將這些配置文件片斷整合起來。通常,/etc/drbd.d目錄中的配置文件 為global_common.conf和所有以.res結尾的文件。其中global_common.conf中主要定義global段和common段,而每一個.res的文件用於定義一個資源。 在配置文件中,global段僅能出現一次,且如果所有的配置信息都保存至同一個配置文件中而不分開為多個文件的話,global段必須位於配置文件的最開始處。目前global段中 可以定義的參數僅有minor-count, dialog-refresh, disable-ip-verification和usage-count。 common段則用於定義被每一個資源默認繼承的參數,可以在資源定義中使用的參數都可以在common段中定義。實際應用中,common段並非必須,但建議將多個資源共享的參數定 義為common段中的參數以降低配置文件的復雜度。 resource段則用於定義DRBD資源,每個資源通常定義在一個單獨的位於/etc/drbd.d目錄中的以.res結尾的文件中。資源在定義時必須為其命名,名字可以由非空白的ASCII字符 組成。每一個資源段的定義中至少要包含兩個host子段,以定義此資源關聯至的節點,其它參數均可以從common段或DRBD的默認中進行繼承而無須定義。 DRBD配置文件 [root@huanqiu ~]# cat /etc/drbd.d/global_common.conf global { usage-count yes; //是否參加DRBD使用者統計,默認是參加 # minor-count dialog-refresh disable-ip-verification //這里是global可以使用的參數 #minor-count:32 //從(設備)個數,取值范圍1~255,默認值為32。該選項設定了允許定義的resource個數,當要定義的resource超過了此選項的設定時,需要重新載入DRBD內核模塊。 #disable-ip-verification:no //是否禁用ip檢查 } common { protocol C; //指定復制協議,復制協議共有三種,為協議A,B,C,默認協議為協議C handlers { //該配置段用來定義一系列處理器,用來回應特定事件。 # These are EXAMPLE handlers only. # They may have severe implications, # like hard resetting the node under certain circumstances. # Be careful when chosing your poison. # pri-on-incon-degr "/usr/lib/DRBD/notify-pri-on-incon-degr.sh; /usr/lib/DRBD/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; # pri-lost-after-sb "/usr/lib/DRBD/notify-pri-lost-after-sb.sh; /usr/lib/DRBD/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; # local-io-error "/usr/lib/DRBD/notify-io-error.sh; /usr/lib/DRBD/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f"; # fence-peer "/usr/lib/DRBD/crm-fence-peer.sh"; # split-brain "/usr/lib/DRBD/notify-split-brain.sh root"; # out-of-sync "/usr/lib/DRBD/notify-out-of-sync.sh root"; # before-resync-target "/usr/lib/DRBD/snapshot-resync-target-lvm.sh -p 15 -- -c 16k"; # after-resync-target /usr/lib/DRBD/unsnapshot-resync-target-lvm.sh; } startup { //#DRBD同步時使用的驗證方式和密碼。該配置段用來更加精細地調節DRBD屬性,它作用於配置節點在啟動或重啟時。常用選項有: # wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb wfc-timeout: //該選項設定一個時間值,單位是秒。在啟用DRBD塊時,初始化腳本DRBD會阻塞啟動進程的運行,直到對等節點的出現。該選項就是用來限制這個等待時間的,默認為0,即不限制,永遠等待。 degr-wfc-timeout: //該選項也設定一個時間值,單位為秒。也是用於限制等待時間,只是作用的情形不同:它作用於一個降級集群(即那些只剩下一個節點的集群)在重啟時的等待時間。 outdated-wfc-timeout: //同上,也是用來設定等待時間,單位為秒。它用於設定等待過期節點的時間 } disk { # on-io-error fencing use-bmbv no-disk-barrier no-disk-flushes //這里是disk段內可以定義的參數 # no-disk-drain no-md-flushes max-bio-bvecs //這里是disk段內可以定義的參數 on-io-error: detach //選項:此選項設定了一個策略,如果底層設備向上層設備報告發生I/O錯誤,將按照該策略進行處理。有效的策略包括: detach //發生I/O錯誤的節點將放棄底層設備,以diskless mode繼續工作。在diskless mode下,只要還有網絡連接,DRBD將從secondary node讀寫數據,而不需要failover(故障轉移)。該策略會導致一定的損失,但好處也很明顯,DRBD服務不會中斷。官方推薦和默認策略。 pass_on //把I/O錯誤報告給上層設備。如果錯誤發生在primary節點,把它報告給文件系統,由上層設備處理這些錯誤(例如,它會導致文件系統以只讀方式重新掛載),它可能會導致DRBD停止提供服務;如果發生在secondary節點,則忽略該錯誤(因為secondary節點沒有上層設備可以報告)。該策略曾經是默認策略,但現在已被detach所取代。 call-local-io-error //調用預定義的本地local-io-error腳本進行處理。該策略需要在resource(或common)配置段的handlers部分,預定義一個相應的local-io-error命令調用。該策略完全由管理員通過local-io-error命令(或腳本)調用來控制如何處理I/O錯誤。 fencing: //該選項設定一個策略來避免split brain的狀況。有效的策略包括: dont-care: //默認策略。不采取任何隔離措施。 resource-only: //在此策略下,如果一個節點處於split brain狀態,它將嘗試隔離對端節點的磁盤。這個操作通過調用fence-peer處理器來實現。fence-peer處理器將通過其它通信路徑到達對等節點,並在這個對等節點上調用DRBDadm outdate res命令 resource-and-stonith: //在此策略下,如果一個節點處於split brain狀態,它將停止I/O操作,並調用fence-peer處理器。處理器通過其它通信路徑到達對等節點,並在這個對等節點上調用DRBDadm outdate res命令。如果無法到達對等節點,它將向對等端發送關機命令。一旦問題解決,I/O操作將重新進行。如果處理器失敗,你可以使用resume-io命令來重新開始I/O操作。 } net { //該配置段用來精細地調節DRBD的屬性,網絡相關的屬性。常用的選項有: # sndbuf-size rcvbuf-size timeout connect-int ping-int ping-timeout max-buffers //這里是net段內可以定義的參數 # max-epoch-size ko-count allow-two-primaries cram-hmac-alg shared-secret //這里是net段內可以定義的參數 # after-sb-0pri after-sb-1pri after-sb-2pri data-integrity-alg no-tcp-cork //這里是net段內可以定義的參數 sndbuf-size: //該選項用來調節TCP send buffer的大小,DRBD 8.2.7以前的版本,默認值為0,意味着自動調節大小;新版本的DRBD的默認值為128KiB。高吞吐量的網絡(例如專用的千兆網卡,或負載均衡中綁定的連接)中,增加到512K比較合適,或者可以更高,但是最好不要超過2M。 timeout: //該選項設定一個時間值,單位為0.1秒。如果搭檔節點沒有在此時間內發來應答包,那么就認為搭檔節點已經死亡,因此將斷開這次TCP/IP連接。默認值為60,即6秒。該選項的值必須小於connect-int和ping-int的值。 connect-int: //如果無法立即連接上遠程DRBD設備,系統將斷續嘗試連接。該選項設定的就是兩次嘗試間隔時間。單位為秒,默認值為10秒。 ping-timeout: //該選項設定一個時間值,單位是0.1秒。如果對端節點沒有在此時間內應答keep-alive包,它將被認為已經死亡。默認值是500ms。 max-buffers: //該選項設定一個由DRBD分配的最大請求數,單位是頁面大小(PAGE_SIZE),大多數系統中,頁面大小為4KB。這些buffer用來存儲那些即將寫入磁盤的數據。最小值為32(即128KB)。這個值大一點好。 max-epoch-size: //該選項設定了兩次write barriers之間最大的數據塊數。如果選項的值小於10,將影響系統性能。大一點好 ko-count: //該選項設定一個值,把該選項設定的值 乘以 timeout設定的值,得到一個數字N,如果secondary節點沒有在此時間內完成單次寫請求,它將從集群中被移除(即,primary node進入StandAlong模式)。取值范圍0~200,默認值為0,即禁用該功能。 allow-two-primaries: //這個是DRBD8.0及以后版本才支持的新特性,允許一個集群中有兩個primary node。該模式需要特定文件系統的支撐,目前只有OCFS2和GFS可以,傳統的ext3、ext4、xfs等都不行! cram-hmac-alg: //該選項可以用來指定HMAC算法來啟用對端節點授權。DRBD強烈建議啟用對端點授權機制。可以指定/proc/crypto文件中識別的任一算法。必須在此指定算法,以明確啟用對端節點授權機制,實現數據加密傳輸。 shared-secret: //該選項用來設定在對端節點授權中使用的密碼,最長64個字符。 data-integrity-alg: //該選項設定內核支持的一個算法,用於網絡上的用戶數據的一致性校驗。通常的數據一致性校驗,由TCP/IP頭中所包含的16位校驗和來進行,而該選項可以使用內核所支持的任一算法。該功能默認關閉。 } syncer { //該配置段用來更加精細地調節服務的同步進程。常用選項有 # rate after al-extents use-rle cpu-mask verify-alg csums-alg rate: //設置同步時的速率,默認為250KB。默認的單位是KB/sec,也允許使用K、M和G,如40M。注意:syncer中的速率是以bytes,而不是bits來設定的。配置文件中的這個選項設置的速率是永久性的,但可使用下列命令臨時地改變rate的值:DRBDsetup /dev/DRBDN syncer -r 100M。如果想重新恢復成drbd.conf配置文件中設定的速率,執行如下命令: DRBDadm adjust resource verify-alg: //該選項指定一個用於在線校驗的算法,內核一般都會支持md5、sha1和crc32c校驗算法。在線校驗默認關閉,必須在此選項設定參數,以明確啟用在線設備校驗。DRBD支持在線設備校驗,它以一種高效的方式對不同節點的數據進行一致性校驗。在線校驗會影響CPU負載和使用,但影響比較輕微。DRBD 8.2.5及以后版本支持此功能。一旦啟用了該功能,你就可以使用下列命令進行一個在線校驗: DRBDadm verify resource。該命令對指定的resource進行檢驗,如果檢測到有數據塊沒有同步,它會標記這些塊,並往內核日志中寫入一條信息。這個過程不會影響正在使用該設備的程序。 如果檢測到未同步的塊,當檢驗結束后,你就可以如下命令重新同步它們:DRBDadm disconnect resource or DRBDadm connetc resource } } common段是用來定義共享的資源參數,以減少資源定義的重復性。common段是非必須的。resource段一般為DRBD上每一個節點來定義其資源參數的。 資源配置文件詳解 [root@huanqiu ~]# cat /etc/drbd.d/web.res resource web { //web為資源名稱 on ha1.xsl.com { //on后面為節點的名稱,有幾個節點就有幾個on段,這里是定義節點ha1.xsl.com上的資源 device /dev/DRBD0; //定義DRBD虛擬塊設備,這個設備事先不要格式化。 disk /dev/sda6; //定義存儲磁盤為/dev/sda6,該分區創建完成之后就行了,不要進行格式化操作 address 192.168.108.199:7789; //定義DRBD監聽的地址和端口,以便和對端進行通信 meta-disk internal; //該參數有2個選項:internal和externally,其中internal表示將元數據和數據存儲在同一個磁盤上;而externally表示將元數據和數據分開存儲,元數據被放在另一個磁盤上。 } on ha2.xsl.com { //這里是定義節點ha2.xsl.com上的資源 device /dev/DRBD0; disk /dev/sda6; address 192.168.108.201:7789; meta-disk internal; } }
----------------------------------------------------------------------------------------------------------------------------------------
十、Centos下DRBD的安裝記錄(主從模式)
DRBD(Distributed Replicated Block Device) 可以理解為它其實就是個網絡RAID-1,兩台服務器間就算某台因斷電或者宕機也不會對數據有任何影響,
而真正的熱切換可以通過Keepalived或Heartbeat方案解決,不需要人工干預。廢話不多說了,下面記錄下在centos下安裝DRBD的操作記錄
1)服務器信息(centos6.8) 192.168.1.151 主服務器 主機名:Primary 192.168.1.152 備服務器 主機名:Secondary ------------------------------------------------------------------------------------------------------------------------- 2)兩台機器的防火牆要相互允許訪問。最好是關閉selinux和iptables防火牆(兩台機器同樣操作) [root@Primary ~]# setenforce 0 //臨時性關閉;永久關閉的話,需要修改/etc/sysconfig/selinux的SELINUX為disabled [root@Primary ~]# /etc/init.d/iptables stop ------------------------------------------------------------------------------------------------------------------------- 3)設置hosts文件(兩台機器同樣操作) [root@Primary drbd-8.4.3]# vim /etc/hosts ...... 192.168.1.151 Primary 192.168.1.152 Secondary ------------------------------------------------------------------------------------------------------------------------- 4)兩台機器同步時間 [root@Primary ~]# yum install -y netpdate [root@Primary ~]# ntpdate -u asia.pool.ntp.org ------------------------------------------------------------------------------------------------------------------------- 5)DRBD的安裝配置(兩台機器上同樣操作) 這里采用yum方式安裝 [root@Primary ~]# rpm -ivh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm [root@Primary ~]# yum -y install drbd83-utils kmod-drbd83 注意:上面是centos6的安裝方式,如果是centos7,則安裝方式如下: # rpm -ivh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm # yum install -y drbd84-utils kmod-drbd84 加載模塊: [root@Primary ~]# modprobe drbd 查看模塊是否已加上 [root@Primary ~]# lsmod |grep drbd drbd 332493 0 ------------------------------------------------------------------------------------------------------------------------- 6)DRBD配置(兩台機器上同樣操作) [root@Primary ~]# cat /etc/drbd.conf # You can find an example in /usr/share/doc/drbd.../drbd.conf.example include "drbd.d/global_common.conf"; include "drbd.d/*.res"; [root@Primary ~]# cp /etc/drbd.d/global_common.conf /etc/drbd.d/global_common.conf.bak [root@Primary ~]# vim /etc/drbd.d/global_common.conf global { usage-count yes; # minor-count dialog-refresh disable-ip-verification } common { protocol C; handlers { # These are EXAMPLE handlers only. # They may have severe implications, # like hard resetting the node under certain circumstances. # Be careful when chosing your poison. # pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; # pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; # local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f"; # fence-peer "/usr/lib/drbd/crm-fence-peer.sh"; # split-brain "/usr/lib/drbd/notify-split-brain.sh root"; # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root"; # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k"; # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh; } startup { wfc-timeout 240; degr-wfc-timeout 240; outdated-wfc-timeout 240; } disk { on-io-error detach; } net { cram-hmac-alg md5; shared-secret "testdrbd"; } syncer { rate 30M; } } [root@Primary ~]# vim /etc/drbd.d/r0.res resource r0 { on Primary { device /dev/drbd0; //這是Primary機器上的DRBD虛擬塊設備,事先不要格式化 disk /dev/vdd1; address 192.168.1.151:7898; meta-disk internal; } on Secondary { device /dev/drbd0; //這是Secondary機器上的DRBD虛擬塊設備,事先不要格式化 disk /dev/vde1; address 192.168.1.152:7898; //DRBD監聽的地址和端口。端口可以自己定義 meta-disk internal; } } ------------------------------------------------------------------------------------------------------------------------- 7)在兩台機器上添加DRBD磁盤 在Primary機器上添加一塊10G的硬盤作為DRBD,分區為/dev/vdd1,不做格式化,並在本地系統創建/data目錄,不做掛載操作。 [root@Primary ~]# fdisk -l ...... [root@Primary ~]# fdisk /dev/vdd 依次輸入"n->p->1->1->回車->w" //分區創建后,再次使用"fdisk /dev/vdd",輸入p,即可查看到創建的分區,比如/dev/vdd1 在Secondary機器上添加一塊10G的硬盤作為DRBD,分區為/dev/vde1,不做格式化,並在本地系統創建/data目錄,不做掛載操作。 [root@Secondary ~]# fdisk -l ...... [root@Secondary ~]# fdisk /dev/vde 依次輸入"n->p->1->1->回車->w" ------------------------------------------------------------------------------------------------------------------------- 8)在兩台機器上分別創建DRBD設備並激活r0資源(下面操作在兩台機器上都要執行) [root@Primary ~]# mknod /dev/drbd0 b 147 0 mknod: `/dev/drbd0': File exists [root@Primary ~]# drbdadm create-md r0 Writing meta data... initializing activity log NOT initialized bitmap New drbd meta data block successfully created. 再次輸入該命令進行激活r0資源 [root@Primary ~]# drbdadm create-md r0 You want me to create a v08 style flexible-size internal meta data block. There appears to be a v08 flexible-size internal meta data block already in place on /dev/vdd1 at byte offset 10737340416 Do you really want to overwrite the existing v08 meta-data? [need to type 'yes' to confirm] yes //這里輸入"yes" Writing meta data... initializing activity log NOT initialized bitmap New drbd meta data block successfully created. 啟動drbd服務(注意:需要主從共同啟動方能生效) [root@Primary ~]# /etc/init.d/drbd start Starting DRBD resources: [ d(r0) s(r0) n(r0) ].... [root@Primary ~]# ps -ef|grep drbd root 5174 2 0 02:25 ? 00:00:00 [drbd0_worker] root 5193 2 0 02:25 ? 00:00:00 [drbd0_receiver] root 5207 2 0 02:25 ? 00:00:00 [drbd0_asender] root 5211 18667 0 02:25 pts/0 00:00:00 grep --color drbd 查看狀態(兩台機器上都執行查看) [root@Primary ~]# cat /proc/drbd version: 8.3.16 (api:88/proto:86-97) GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37 0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r----- ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:10485332 或者 [root@Primary ~]# /etc/init.d/drbd status drbd driver loaded OK; device status: version: 8.3.16 (api:88/proto:86-97) GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37 m:res cs ro ds p mounted fstype 0:r0 Connected Secondary/Secondary Inconsistent/Inconsistent C 由上面兩台主機的DRBD狀態查看結果里的ro:Secondary/Secondary表示兩台主機的狀態都是備機狀態,ds是磁盤狀態,顯示的狀態內容為“不一致”,這是因為DRBD無法判斷哪一方為主機, 應以哪一方的磁盤數據作為標准。 ------------------------------------------------------------------------------------------------------------------------- 9)接着將Primary主機配置為DRBD的主節點 [root@Primary ~]# drbdsetup /dev/drbd0 primary --force 分別查看主從DRBD狀態: [root@Primary ~]# /etc/init.d/drbd status drbd driver loaded OK; device status: version: 8.3.16 (api:88/proto:86-97) GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37 m:res cs ro ds p mounted fstype ... sync'ed: 1.5% (10096/10236)M 0:r0 SyncSource Primary/Secondary UpToDate/Inconsistent C [root@Secondary ~]# /etc/init.d/drbd status drbd driver loaded OK; device status: version: 8.3.16 (api:88/proto:86-97) GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37 m:res cs ro ds p mounted fstype ... sync'ed: 12.5% (8960/10236)M 0:r0 SyncTarget Secondary/Primary Inconsistent/UpToDate C ro在主從服務器上分別顯示 Primary/Secondary和Secondary/Primary ds顯示UpToDate/UpToDate 表示主從配置成功 ------------------------------------------------------------------------------------------------------------------------- 10)掛載DRBD (Primary主節點機器上操作) 從上面Primary主節點的DRBD狀態上看到mounted和fstype參數為空,所以這步開始掛載DRBD到系統目錄 先格式化/dev/drbd0 [root@Primary ~]# mkfs.ext4 /dev/drbd0 創建掛載目錄,然后執行DRBD掛載 [root@Primary ~]# mkdir /data [root@Primary ~]# mount /dev/drbd0 /data [root@Primary ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup00-LogVol00 156G 36G 112G 25% / tmpfs 2.9G 0 2.9G 0% /dev/shm /dev/vda1 190M 98M 83M 55% /boot /dev/drbd0 9.8G 23M 9.2G 1% /data 特別注意: Secondary節點上不允許對DRBD設備進行任何操作,包括只讀,所有的讀寫操作只能在Primary節點上進行。 只有當Primary節點掛掉時,Secondary節點才能提升為Primary節點 ------------------------------------------------------------------------------------------------------------------------- 11)DRBD主備故障切換測試 模擬Primary節點發生故障,Secondary接管並提升為Primary 下面是在Primary主節點上操作記錄: [root@Primary ~]# cd /data [root@Primary data]# touch wangshibo wangshibo1 wangshibo2 wangshibo3 [root@Primary data]# cd ../ [root@Primary /]# umount /data [root@Primary /]# drbdsetup /dev/drbd0 secondary //將Primary主機設置為DRBD的備節點。在實際生產環境中,直接在Secondary主機上提權(即設置為主節點)即可。 [root@Primary /]# /etc/init.d/drbd status drbd driver loaded OK; device status: version: 8.3.16 (api:88/proto:86-97) GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37 m:res cs ro ds p mounted fstype 0:r0 Connected Secondary/Secondary UpToDate/UpToDate C 注意:這里實際生產環境若Primary主節點宕機,在Secondary狀態信息中ro的值會顯示為Secondary/Unknown,只需要進行DRBD提權操作即可。 下面是在Secondary 備份節點上操作記錄: 先進行提權操作,即將Secondary手動升級為DRBD的主節點 [root@Secondary ~]# drbdsetup /dev/drbd0 primary [root@Secondary ~]# /etc/init.d/drbd status drbd driver loaded OK; device status: version: 8.3.16 (api:88/proto:86-97) GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37 m:res cs ro ds p mounted fstype 0:r0 Connected Primary/Secondary UpToDate/UpToDate C 然后掛載DRBD [root@Secondary ~]# mkdir /data [root@Secondary ~]# mount /dev/drbd0 /data [root@Secondary ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup00-LogVol00 156G 13G 135G 9% / tmpfs 2.9G 0 2.9G 0% /dev/shm /dev/vda1 190M 89M 92M 50% /boot /dev/vdd 9.8G 23M 9.2G 1% /data2 /dev/drbd0 9.8G 23M 9.2G 1% /data 發現DRBD掛載目錄下已經有了之前在遠程Primary主機上寫入的內容 [root@Secondary ~]# cd /data [root@Secondary data]# ls wangshibo wangshibo1 wangshibo2 wangshibo3 [root@Secondary ~]# /etc/init.d/drbd status drbd driver loaded OK; device status: version: 8.3.16 (api:88/proto:86-97) GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37 m:res cs ro ds p mounted fstype 0:r0 Connected Primary/Secondary UpToDate/UpToDate C /data ext4 在Secondary節點上繼續寫入數據 [root@Secondary data]# touch huanqiu huanqiu1 huanqiu2 huanqiu3 然后模擬Secondary節點故障,Primary節點再提權升級為DRBD主節點(操作同上,此處省略.......) 最后,使用命令fdisk -l查看本機磁盤情況,可以發現DRBD的磁盤/dev/drbd0 [root@Secondary ~]# fdisk -l ....... ....... Disk /dev/drbd0: 10.7 GB, 10736979968 bytes 255 heads, 63 sectors/track, 1305 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000
到此,DRBD的主從環境的部署工作已經完成。不過上面是記錄的是主備手動切換,至於保證DRBD主從結構的智能切換,實現高可用,還需里用到Keepalived或Heartbeat來實現了(會在DRBD主端掛掉的情況下,自動切換從端為主端並自動掛載/data分區)
---------------------------------------------------------------------------------------------------------------------------------- 最后說一下"Split-Brain"(腦裂)的情況: 假設把Primary主機的的eth0設備宕掉,然后直接在Secondary主機上進行提權升級為DRBD的主節點,並且mount掛載DRBD,這時會發現之前在Primary主機上寫入的數據文件確實同步過來了。 接着再把Primary主機的eth0設備恢復,看看有沒有自動恢復 主從關系。經過查看,發現DRBD檢測出了Split-Brain的狀況,也就是兩個節點都處於standalone狀態, 故障描述如下:Split-Brain detected,dropping connection! 這就是傳說中的“腦裂”。 DRBD官方推薦的手動恢復方案: 1)Secondary主機上的操作 # drbdadm secondary r0 # drbdadm disconnect all # drbdadm --discard-my-data connect r0 //或者"drbdadm -- --discard-my-data connect r0" 2)Primary主機上的操作 # drbdadm disconnect all # drbdadm connect r0 # drbdsetup /dev/drbd0 primary ---------------------------------------------------------------------------------------------------------------------------------- 另外,還可以使用下面的命令查看DRBD狀態: [root@Primary ~]# drbd-overview 0:r0 Connected Primary/Secondary UpToDate/UpToDate C r----- /data ext4 9.8G 23M 9.2G 1% [root@Secondary ~]# drbd-overview 0:r0 Connected Secondary/Primary UpToDate/UpToDate C r-----