1、DRBD介紹前端
DRBD(Distributed ReplicatedBlock Device)是一種基於軟件的,無共享,分佈式塊設備複製的存儲解決方案,在服務器之間的對塊設備(硬盤,分區,邏輯卷等) 進行鏡像。也就是說當某一個應用程序完成寫操做後,它提交的數據不只僅會保存在本地塊設備上,DRBD也會將這份數據複製一份,經過網絡傳輸到另外一個節點的塊設 備上,這樣,兩個節點上的塊設備上的數據將會保存一致,這就是鏡像功能。 DRBD是由內核模塊和相關腳本而構成,用以構建高可用性的集羣,其實現方式是經過網絡來鏡像整個設備。它容許用戶在遠程機器上創建一個本地塊設備的實時鏡像, 與心跳鏈接結合使用,能夠把它看做是一種網絡RAID,它容許用戶在遠程機器上創建一個本地塊設備的實時鏡像。 DRBD工做在內核當中,相似於一種驅動模塊。DRBD工做的位置在文件系統的buffer cache和磁盤調度器之間,經過tcp/ip發給另一臺主機到對方的tcp/ip最終發送 給對方的drbd,再由對方的drbd存儲在本地對應磁盤 上,相似於一個網絡RAID-1功能。在高可用(HA)中使用DRBD功能,能夠代替使用一個共享盤陣。本地(主節點) 與遠程主機(備節點)的數據能夠保 證明時同步。當本地系統出現故障時,遠程主機上還會保留有一份相同的數據,能夠繼續使用。
2、DRDB的工做原理node
DRBD是linux的內核的存儲層中的一個分佈式存儲系統,可用使用DRBD在兩臺Linux服務器之間共享塊設備,共享文件系統和數據。相似於一個網絡RAID-1的功能,
其工做原理的架構圖以下:linux
DRBD底層設備支持web
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的關係vim
一個DRBD系統由兩個節點構成,與HA集羣相似,也有主節點和備用節點之分,在帶有主要設備的節點上,應用程序和操做系統能夠運行和訪問DRBD設備(/dev/drbd*)。 在主節點寫入的數據經過DRBD設備存儲到主節點的磁盤設備中,同時,這個數據也會自動發送到備用節點對應的DRBD設備,最終寫入備用節點的磁盤設備上,在備用節點上, DRBD只是將數據從DRBD設備寫入到備用節點的磁盤中。如今大部分的高可用性集羣都會使用共享存儲,而DRBD也能夠做爲一個共享存儲設備,使用DRBD不須要太多的硬件的投資。 由於它在TCP/IP網絡中運行,因此,利用DRBD做爲共享存儲設備,要節約不少成本,由於價格要比專用的存儲網絡便宜不少;其性能與穩定性方面也不錯
3、DRBD的特性(基本功能)centos
分佈式複製塊設備(DRBD技術)是一種基於軟件的,無共享,複製的存儲解決方案,在服務器之間的對塊設備(硬盤,分區,邏輯卷等)進行鏡像。 DRBD鏡像數據的特性: 1)實時性:當某個應用程序完成對數據的修改時,複製功能當即發生 2)透明性:應用程序的數據存儲在鏡像塊設備上是獨立透明的,他們的數據在兩個節點上都保存一份,所以,不管哪一臺服務器宕機, 都不會影響應用程序讀取數據的操做,因此說是透明的。 3)同步鏡像和異步鏡像:同步鏡像表示當應用程序提交本地的寫操做後,數據後會同步寫到兩個節點上去;異步鏡像表示當應用程序提交寫操做後, 只有當本地的節點上完成寫操做後,另外一個節點才能夠完成寫操做。
4、DRBD的用戶空間管理工具api
爲了可以配置和管理drbd的資源,drbd提供了一些管理工具與內核模塊進行通訊: 1)drbdadm:高級的DRBD程序管理套件工具。它從配置文件/etc/drbd.conf中獲取全部配置參數。drbdadm爲drbdsetup和drbdmeta兩個命令充當程序的前端應用, 執行drbdadm實際是執行的drbdsetup和drbdeta兩個命令。 2)drbdsetup:drbdsetup可讓用戶配置已經加載在內核中運行的DRBD模塊,它是底層的DRBD程序管理套件工具。使用該命令時,全部的配置參數都須要直接在 命令行中定義,雖然命令很靈活,可是大大的下降了命令的簡單易用性,所以不少的用戶不多使用drbdsetup。 3)drbdmeta:drbdmeta容許用戶建立、轉儲、還原和修改drbd的元數據結構。這個命令也是用戶極少用到。
5、DRBD的模式bash
DRBD有2中模式,一種是DRBD的主從模式,另外一種是DRBD的雙主模式 1)DRBD的主從模式 這種模式下,其中一個節點做爲主節點,另外一個節點做爲從節點。其中主節點能夠執行讀、寫操做;從節點不能夠掛載文件系統,所以,也不能夠執行讀寫操做。 在這種模式下,資源在任什麼時候間只能存儲在主節點上。這種模式可用在任何的文件系統上(EXT三、EXT四、XFS等等)。默認這種模式下,一旦主節點發生故障,從 節點須要手工將資源進行轉移,且主節點變成從節點和從節點變成主節點須要手動進行切換。不能自動進行轉移,所以比較麻煩。 爲了解決手動將資源和節點進行轉移,能夠將DRBD作成高可用集羣的資源代理(RA),這樣一旦其中的一個節點宕機,資源會自動轉移到另外一個節點,從而保證服 務的連續性。 2)DRBD的雙主模式 這是DRBD8.0以後的新特性 在雙主模式下,任何資源在任何特定的時間都存在兩個主節點。這種模式須要一個共享的集羣文件系統,利用分佈式的鎖機制進行管理,如GFS和OCFS2。 部署雙主模式時,DRBD能夠是負載均衡的集羣,這就須要從兩個併發的主節點中選取一個首選的訪問數據。這種模式默認是禁用的,若是要是用的話必須在配置文 件中進行聲明。
6、DRBD的同步協議
DRBD的複製功能就是將應用程序提交的數據一份保存在本地節點,一份複製傳輸保存在另外一個節點上。可是DRBD須要對傳輸的數據進行確認以便保證另外一個節點的 寫操做完成,就須要用到DRBD的同步協議,DRBD同步協議有三種: 1)協議A:異步複製協議 一旦本地磁盤寫入已經完成,數據包已在發送隊列中,則寫被認爲是完成的。在一個節點發生故障時,可能發生數據丟失,由於被寫入到遠程節點上的數據可能仍在發送隊列。 儘管,在故障轉移節點上的數據是一致的,但沒有及時更新。這一般是用於地理上分開的節點。
數據在本地完成寫操做且數據已經發送到TCP/IP協議棧的隊列中,則認爲寫操做完成。若是本地節點的寫操做完成,此時本地節點發生故障,而數據還處在TCP/IP隊列中, 則數據不會發送到對端節點上。所以,兩個節點的數據將不會保持一致。這種協議雖然高效,可是並不能保證數據的可靠性。 2)協議B:內存同步(半同步)複製協議 一旦本地磁盤寫入已完成且複製數據包達到了對等節點則認爲寫在主節點上被認爲是完成的。數據丟失可能發生在參加的兩個節點同時故障的狀況下,由於在傳輸中的數據 可能不會被提交到磁盤
數據在本地完成寫操做且數據已到達對端節點則認爲寫操做完成。若是兩個節點同時發生故障,即便數據到達對端節點,這種方式一樣也會致使在對端節點和本地 節點的數據不一致現象,也不具備可靠性。 3)協議C:同步複製協議 只有在本地和遠程節點的磁盤已經確認了寫操做完成,寫才被認爲完成。沒有任何數據丟失,因此這是一個羣集節點的流行模式,但I / O吞吐量依賴於網絡帶寬。 只有當本地節點的磁盤和對端節點的磁盤都完成了寫操做,才認爲寫操做完成。這是集羣流行的一種方式,應用也是最多的,這種方式雖然不高效,可是最可靠。 以上三種協議中,通常使用協議C,但選擇C協議將影響流量,從而影響網絡時延。爲了數據可靠性,在生產環境使用時須慎重選項使用哪種協議。
7、DRBD的資源
在DRBD中,資源是全部可複製移動存儲設備的總稱,它包括: 1)資源名稱:資源名稱能夠是除了空白字符之外的任意ASCII碼字符 2)DRBD設備:DRBD的虛擬塊設備。在雙方節點上,DRBD設備的設備文件命名方式;通常爲/dev/drbdN,其主設備號147,N是次設備號 3)磁盤配置:DRBD內部應用須要本地數據副本,元數據。在雙方節點上,爲各自提供的存儲設備。 4)網絡配置:雙方數據同步時所使用的網絡屬性;
8、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會自動開始。
9、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能夠,傳統的ext三、ext四、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: //該選項指定一個用於在線校驗的算法,內核通常都會支持md五、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; } }
----------------------------------------------------------------------------------------------------------------------------------------
10、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-----