Distributed Replicated Block Device

2.6.33 Linux 內核引入了一個有用的新服務,稱爲Distributed Replicated Block Device(DRBD)。該服務在運行期間可以將整塊設備鏡像到另一個網絡主機上,允許進行數據塊高可用性集羣的開發。在 Linux 內核中探究 DRBD 背後蘊含的思想及其實現


高可用性簡介

高可用性是提高可用性的一個系統設計原理。可用性,或者系統操作連續性的度量通常被定義爲是一年中計算機正常運行時間的百分比,例如某一系統是 99% 可用的,那麼一年中它的停機時間是 3.65 天。99% 通常被稱爲兩個 9。與之相比,5 個 9(99.999%)最大停機時間降到每年 5.26 分鐘。這差別很大,需要精心設計和高質量才能實現。

HA 最常見的實現是故障冗餘。在這個模型中,您可以爲一個給定資源定義多條路徑,正常情況下使用可用路徑,故障發生時使用冗餘路徑。企業級磁盤驅動器闡述了這一概念,因爲它們提供兩個訪問端口(相比用戶級驅動器的一個訪問端口而言)。


存儲冗餘

在存儲系統中使用冗餘是不足爲奇的,特別是在企業級設計中。標準方法 — RAID — 使用各種基礎算法是很常見的,每一種算法都有不同的功能和特性。

RAID 是 1987 年在加利福尼亞大學伯克利分校第一次定義的。傳統 RAID 級別包括 RAID-0 和 RAID-1,RAID-0 可以實現跨磁盤條帶化(但是沒有冗餘),RAID-1 可以跨越兩個磁盤實現鏡像 ,這樣一個信息就存在兩個副本。對於 RAID-1,一個磁盤發生故障時,信息仍然可以通過其他副本獲取。其他 RAID 級別包括 RAID-5 和 RAID-6,RAID-5 跨磁盤包含分佈式奇偶校驗碼的塊級條帶化,RAID-6 包含帶有雙重分佈式奇偶校驗的塊級條帶化。儘管 RAID-5 支持一個驅動器故障,而 RAID-6 可以支持兩個驅動器故障(儘管奇偶校驗信息消耗更多的容量)。RAID-1 很簡單,但是就容量利用而言太浪費。關於存儲容量方面 RAID-5 和 RAID-6 更節省,但是它們通常需要額外硬件處理來避免奇偶校驗計算加重處理器負荷。通常需要權衡利弊。圖 1 提供了 RAID-0 和 RAID-1 模式的一個概覽圖。

圖 1. Linux 中 RAID-0 和 RAID-1 模式的概覽圖

wKioL1NVAKmzr_EdAACOlT9FL-k827.jpg

RAID 技術在繼續發展,一些所謂的非標準技術蓄勢待發。這些技術包括 Oracle 的 RAID-Z 模式(它解決了RAID-5 的 write-hold 問題);NetApp 的 RAID-DP(對角線奇偶校驗) ,它擴展了 RAID-6;以及 IBM 的 RAID 1E(增強版本),它在奇數量的磁盤上可實現條帶化(RAID-0)和鏡像(RAID-1)。

DRBD 操作

現在,在深入鑽研架構之前,讓我們先看一下 DRBD 的操作。圖 2 是在兩個提供獨立存儲資源的獨立服務器的背景之下的 DRBD 的一個概覽。其中一個服務器被定義爲主服務器,另一個是輔助服務器(通常是集羣解決方案的一部分)。用戶訪問 DRBD 塊設備,將其作爲一個傳統本地塊設備,或一個存儲區域網或網絡附加存儲解決方案。DRBD 軟件爲用戶讀寫操作提供主服務器和輔助服務器之間的同步操作,以及其他同步操。

圖 2. 基本 DRBD 操作模型

wKiom1NVAZ3xX5EUAACj5M3XErM473.jpg



在主動/被動模式下,主節點用於所有用戶的讀寫操作。如果集羣解決方案檢測到主節點故障,輔助節點升爲主節點。寫操作從主節點開始進行,同時執行本地存儲和輔助存儲(見圖 3)。DRBD 支持兩個模式的寫操作,即完全同步和完全異步。

完全同步模式下,在寫事務被認可之前兩個節點存儲中的寫操作必須是安全的 。在異步模式下,寫數據被存儲到本地節點存儲中之後,寫事務被認可;對等節點中的數據的副本出現在後臺中。異步模式相對來說不太安全,因爲在複製數據之前,有一個窗口顯示可能發生的故障,但是它比完全同步模式更快,後者是數據保護最安全的模式。儘管推薦使用完全同步模式,但在出現遠距離複製的情況下(比如在廣域網中進行地理災難恢復的場景),異步模式也是很有用的。讀操作是使用本地存儲執行的(除非本地磁盤發生故障,那時通過輔助節點訪問輔助存儲)。

Figure 3. 使用 DRBD 進行讀/寫操作

wKioL1NVAbqh_lphAABaAJF-8V4323.jpg

DRBD 也支持主動/被動模式,比如讀和寫操作可以在兩個服務器上同時進行,這就是所謂的共享磁盤模式。該模式依賴一個共享磁盤文件系統,比如,Global File System (GFS) 或 Oracle Cluster File System 第 2 版(OCFS2),包含分佈式鎖管理功能。

DRBD 架構

DRBD 被分成獨立的兩部分:一個實現 DRBD 行爲的內核模塊和一組用於管理 DRBD 磁盤的用戶空間管理應用程序(見圖 4 )。內核模塊實現一個用於虛擬塊設備(跨網絡在本地磁盤與遠程磁盤之間複製)的驅動程序。作爲一個虛擬磁盤,DRBD 提供一個供各種應用程序使用的靈活模型(從文件系統到依賴於一個原始磁盤的其他應用程序,比如數據庫)。DRBD 模塊不僅僅實現一個基礎塊驅動程序接口(磁盤配置細節在 drbd.conf 中有定義),而且也實現網絡堆接口(其端點通過一個 IP 地址和端口號定義,也在 drbd.conf 中)。

圖 4. Linux 架構中的 DRBD

wKiom1NVAiSRb3uMAAA3w_KpDyE738.gif

在用戶空間,DRBD 提供一組用於管理複製磁盤的實用工具。您可以使用drbdsetup在 Linux 內核中配置 DRBD 模快,使用drbdmeta管理 DRBD 元數據結構。一個同時使用這兩個工具的包裝實用工具是drbdadm。高級管理工具是最常用的一個(從 /etc/drbd.conf 中的 DRBD 配置文件獲取具體細節)。作爲之前討論的實用工具的一個前端,drbdadm是管理 DRBD 最常用的。

您可以像使用其他任何磁盤那樣使用 DRBD 提供的虛擬磁盤,其後的複製操作是透明的。現在,我們來看一下 DRBD 的一些主要功能,包括自我修復功能。


DRBD 主要功能

儘管複製磁盤的思想從概念上來說是很簡單的(開發也相對比較容易),但是一個健壯的實現也有很多固有的複雜性。例如,向一個網絡驅動器複製塊相對比較簡單,但是,處理故障和暫時斷電(以及隨後的驅動器同步)纔是真正解決方案的開始。本節將介紹 DRBD 提供的主要功能,包括各種 DRBD 支持的故障模型。

複製模式

本文前面探究了節點之間複製數據的各種方法(尤其是這兩種 — 完全同步和完全異步)。DRBD 支持每種方法的變體,這些方法比異步模式提供更多的數據保護,代價是性能略有下降。內存異步模式(或半異步模式)是介於同步模式和異步模式之間的一個變體。在這種模式下,寫操作是在數據存儲到本地磁盤並鏡像到對等節點內存後被確認的。該模式提供更多保護,因爲數據被鏡像到另一個節點,這僅僅是針對易失性內存,而不是非易失性磁盤。這仍然可能丟失數據(例如,如果兩個節點都發生故障),但是主節點故障不會引起數據丟失,因爲數據已經被複制了。

聯機設備驗證

DRBD 允許對本地和遠程對等設備進行聯網驗證(在輸入/輸出發生的同時)。驗證意味着 DRBD 可以覈實本地和遠程磁盤是否是相互間的副本,這是一個耗時的操作。但是相比在節點之間移動數據進行驗證,DRBD 提供了一個更爲高效的方法。爲了保護節點間的帶寬(可能是一個受限資源),DRBD 不需要在節點間移動數據進行驗證,而是移動數據(hash)的加密摘要。這樣一來,一個節點可以計算一個塊的散列值;將較小的簽名轉移到對等節點,該節點也可以計算散列值,然後對兩者進行比較。如果散列值是相同的,數據塊已經被正確的複製了。如果散列值不相同,將過期的數據塊標記爲不同步,隨後的同步確保數據塊是正確同步的。

通信完整性

節點之間的通信可能會將錯誤引入複製數據(由於軟件或防火牆漏洞,或者不能被 TCP/IP 的校驗碼檢測出來的其他錯誤)。爲了提供數據的完整性,DRBD 計算消息完整性代碼,以隨數據一起在節點之間移動。這支持接收節點驗證輸入數據,並在發現一個錯誤時請求重發數據。DRBD 使用 Linux 加密應用程序編程接口,因此在完整性算法使用方面是比較靈活的。

自動恢復

DRBD 可以從多種錯誤中恢復,但是一個最嚴重的錯誤就是所謂的 “裂腦(split-brain)”。在這個錯誤場景中,節點之間的通信鏈發生故障,每個節點都認爲自己是主節點。而對於主節點而言,每個節點支持寫操作,而不會將這些操作傳播到對等節點。這導致每個節點中的存儲不一致。

大多數情況下,腦裂恢復是人工進行的,但是 DRBD 提供幾個主動恢復這一狀況的操作方法,所用恢復算法具體取決於實際的存儲方式。

發生裂腦之後,同步存儲最簡單的方法是在鏈接出現故障時其中一個節點沒有發現改變。這樣,已經發生改變的節點與潛在對等節點進行簡單的同步。另一個方法是丟棄變更較少的那個節點中的更改。這使得最大變更集合的節點可以繼續工作,但也意味着一個主機上的變更將丟失。

還有兩個方法是根據節點當時的狀態丟棄更改。一種方法是將最後一次轉換成主節點的那個節點中的變更丟棄,而另一種是將最老的主節點(是第一次轉換成主節點的節點)中的變更丟棄。您可以在 DRBD 配置文件中操作每個節點,但是它們最終的使用取決於使用存儲的應用程序以及數據是否有必要丟棄或進行人工恢復。

優化同步

複製存儲設備的一個關鍵因素是節點之間數據同步的方法是否高效。DRBD 使用的模式其中兩個是活動日誌和快速同步位圖。活動日誌存儲最近寫入的塊並確定故障恢復後應同步哪些塊。快速同步位圖確定連接斷開時同步(或不同步)的數據塊。節點重新連接之後,可使用這些位圖快速同步節點,彼此之間進行精確的複製。時間是很重要的,因爲它代表輔助磁盤不一致時的窗口。




linux disk scheduler:

wKioL1NVRHShmTLOAABNdBRd5XE439.gif
在linux有4種調度算法

CFQ(Completely Fair Queuing 完全公平的排隊〉(elevator=cfq):
這是默認算法,對於通用服務器來說通常是最好的選擇。它試圖均勻地分佈對I/O帶寬的訪H在多媒休應用,總能保證audio、video及吋從磁盤讀取 數據.但對於其他各類應用表現也很好。每個進程一個queue,每個queue按 照上述規則進行merge和sort。進程之間round robin調度,每次執行一個進程的4個淸求。可以調queued和quantum來優化


Deadline(elevator=deadline):
這個算法試圖把每次請求的延遲降至最低。該算法重排了請求的順序來提 高性能。可以調隊列的過期的讀寫過程,如read_expire和write_expire 二個 參數來控制多久內一定要讀到數據,超時就放棄排序。比較合適小文件。還可 以使用打開frontjierges來進行合併鄰近文件。


NOOP(elevator=noop):
I/O請求被分配到隊列,調度由硬件進行,只有當CPU時鐘頻率比較有限 時進行。
Noop對於I/O不那麼操心,對所有的I/O請求都用FIFO隊列形式處理,
默認認爲I/O不會存在性能問題。這也使得CPU也不用那麼操心。當然對於複雜一點的應用類型使用這個調度器,用戶自己就會非常操心。
Noop調度算法指的是當諸求被存儲到隊列並交由I/O子系統處理時由磁盤硬件對其進行優化。該算法一般只對一些特定的硬件(例如RAMdisk和TCQ
disk等)。現代磁盤控制器都具備通過tagged command queuing進行優化的功 能。Tagged command queuing(TCQ)可以通過由磁盤控制器對I/O請求進行重新排序來減少磁頭的動作。通常需要進行重組的I/O請求都會帶有一個標識符,這樣控制器在接收到這些I/O請求的時候會按照規則進行處理。有些應用程序需要對隊列長度進行限制,而現代的設備驅動都具備用於控制隊列長度的TCQ功能,並且該功能可以作爲內核參數在系統啓動的時候添加。 例如要控制SCSI驅動器Lun2的隊列長度爲64個請求,可以修改 /etc/grub, conf 並增加下而的內核參數:aic7xxx=tag_info:{{0, 0’ 64, 0’ 0’ 0’ 0}}

Anticipatory(elevator=as):
對讀操作優化服務時間,在提供一個I/O的時候進行短時間等待,使進程 能夠提交到另外的 I/O。Anticipatory scheduler (as)曾經一度是 Linux 2.6 Kernel的I/O scheduler。Anticipatory的屮文含義是〃預料的,預想的",這 個詞的確揭示了這個算法的特點,簡單的說有個I/O發生的時候,如果又有進 程諸求I/O操作,則將產生一個默認的6毫秒猜測時間,猜測下一個進程請求 I/O是要幹什麼的。這對於隨機讀取會造成比較大的延時,對數據庫應用很糟 糕,而對於Web Server等則會表現的不錯。這個算法也可以簡單理解爲而向低 速磁盤的,因爲那個〃猜測"實際上的目的是爲了減少磁頭移動時間。因此這種 算法更加適合順序讀寫的應用程序。這個可以用來調整的內核參數有 antic_expire, read_expire和 write_expire.
linux中10調度方法的查看和設置的方法
查看當前 10 cat/sys/block/{DEVICE-NAME}/queue/scheduler cat/sys/block/sd*/queue/scheduler
例:輸出結果如下
noop anticipatory deadline[cfq]
設置當前 10 echo{SCHEDULER-NAME}/sys/block/{DEVICE-NAME} /queue/scheduler echo noop/sys/block/hda/queue/scheduler


對10調度使用的建議
Deadline I/O scheduler
在這個屮deadline調度算法通過降低性能而獲得更短的等待時間,它使用 輪詢的調度器,簡潔小巧,提供了最小的讀取延遲和尚佳的吞吐量,特別適合於讀 取較多的環境(比如數據庫,Oracle 10G之類)

Anticipatory I/O scheduler anticipatory算法通過增加等待時間來獲 得更高的性能,假設一個塊設備只有一個物理查找磁頭(例如一個單獨的SATA 硬盤),將多個隨機的小寫入流合併成一個大寫入流(相當於給隨機讀寫變順序讀 寫),使用這個原理來使用讀取寫入的延時換取最大的讀取寫入吞吐量.適用於大 多數環境,特別是讀取寫入較多的環境,比如文件服務器,Web應用,App等應用我 們可以採納as調度.後而我會教大家怎麼調這個的合併的等待時間。

CFQ I/O scheduler
這個是對所有因素也都做了折屮而儘量獲得公平性,使用QoS策略爲所有任 務分配等量的帶寬,避免進程被餓死並實現/較低的延遲,可以認爲是上述兩種 調度器的折屮.適用於有大景進程的多用戶系統

Anticipatory 調節
根據上而的內容,我們算法屮可能用的最多的就是Anticipatory的算法了, 會根據時間來多排一些內容在寫,所以下而講講這個參數可以調的部分。
除了算法修改成這個算法外,影響它的還有磁盤隊列長度/sys/block/sda/queue/nr_requests默認只有128個隊列,可以提高到 512個。會更加佔用內存,但能更加多的合併讀寫操作,速度變慢,但能讀寫更加多的量等待時間/sys/block/sda/queue/iosched/antic_expire 讀取附近產生的新諸時等 待多長時間對讀優化的參數/sys/block/sda/queue/read_ahead_kb這個參數對順序讀非常有用,意思是,一次提前讀多少內容,無論實際需 要多少。默認一次讀128kb遠小於要讀的,設置大些對讀大文件非常有用,可 以有效的減少讀seek的次數,這個參數可以使用blockdev - setra來設置, setra設置的是多少個扇區,所以實際的字節是除以2,比如設置512,實阮是 讀256個字節。


幾個非常有效的IO調度調節的內核參數
/proc/sys/vm/dirty_ratio
這個參數控制文件系統的文件系統寫緩衝區的大小,單位是百分比,表示 系統內存的百分比,表示當寫緩衝使用到系統內存多少的時候,開始向磁盤寫 出數據。增大之會使用更多系統內存用於磁盤寫緩衝,也可以極大提高系統的 寫性能。但是,當你需要持續、恆定的寫入場合時,應該降低其數值,一般啓 動上缺省是10。下而是增大的方法:echo’40' /proc/sys/vm/dirty_ratio
/proc/sys/vm/dirty_background_ratio
這個參數控制文件系統的pdflush進程,在何時刷新磁盤。單位是百分比, 表示系統內存的百分比,意姐是當寫緩衝使用到系統內存多少的時候,pdflush 開始向磁盤寫出數據。增大之會使用更多系統內存用於磁盤寫緩衝,也可以極 大提高系統的寫性能。但是,當你需要持續、恆定的寫入場合時,應該降低其 數值,一般啓動上缺省是5。下而是增大的方法:echo’20'
/proc/sys/vm/dirty_background_ratio
/proc/sys/vm/dirty_writeback_centisecs
這個參數控制內核的髒數據刷新進程pdflush的運行間隔。單位是1/100 秒。缺省數值是500,也就是5秒。如果你的系統是持續地寫入動作,那麼實 阮上還是降低這個數值比較好,這樣可以把尖峯的寫操作削平成多次寫操作。 設置方法如下:echo’ 200' /proc/sys/vm/dirty_writeback_centisecs 如果你 的系統是短期地尖峯式的寫操作,並11寫入數據不大(幾十M/次)II內存有比較多富裕,那麼應該增大此數值:echo’1000' /proc/sys/vm/dirty_writeback_centisecs
/proc/sys/vm/dirty_expire_centisecs
這個參數聲明Linux內核寫緩衝區裏而的數據多"舊"了之後,pdflush進 程就開始考慮寫到磁盤中去。單位是1/100秒。缺省是30000,也就是30秒的 數據就算舊了,將會刷新磁盤。對於特別重載的寫操作來說,這個值適當縮小 也是好的,但也不能縮小太多,因爲縮小太多也會導致10提高太快。建議設置 爲1500,也就是15秒算舊。echo’1500'
/proc/sys/vm/dirty_expire_centisecs當然,如果你的系統內存比較大,並 且寫入模式是間歇式的,並II每次寫入的數據不大(比如幾十M),那麼這個值 還是大些的好。





配置安裝DRBD;

前提:

1)本配置共有兩個測試節點,分別node1.firefox.com和node2.firefox.com,相的IP地址分別爲172.16.100.7和172.16.100.8;

2)node1和node2兩個節點上各提供了一個大小相同的分區作爲drbd設備;我們這裏爲在兩個節點上均爲/dev/sda5,大小爲512M;

3)系統爲CentOS 6.5,x86_64平臺;


1、準備工作


兩個節點的主機名稱和對應的IP地址解析服務可以正常工作,且每個節點的主機名稱需要跟"uname -n“命令的結果保持一致;因此,需要保證兩個節點上的/etc/hosts文件均爲下面的內容:

172.16.249.7 node1.firefox.com node1

172.16.249.8 node2.firefox.com node2


爲了使得重新啓動系統後仍能保持如上的主機名稱,還分別需要在各節點執行類似如下的命令:

Node1:
# sed -i 's@\(HOSTNAME=\).*@\1node1.firefox.com@g'
# hostname node1.firefox.com
Node2:
# sed -i 's@\(HOSTNAME=\).*@\1node2.firefox.com@g'
# hostname node2.firefox.com


2、安裝軟件包


drbd共有兩部分組成:內核模塊和用戶空間的管理工具。其中drbd內核模塊代碼已經整合進Linux內核2.6.33以後的版本中,因此,如果您的內核版本高於此版本的話,你只需要安裝管理工具即可;否則,您需要同時安裝內核模塊和管理工具兩個軟件包,並且此兩者的版本號一定要保持對應。


目前適用CentOS 5的drbd版本主要有8.0、8.2、8.3三個版本,其對應的rpm包的名字分別爲drbd, drbd82和drbd83,對應的內核模塊的名字分別爲kmod-drbd, kmod-drbd82和kmod-drbd83。而適用於CentOS 6的版本爲8.4,其對應的rpm包爲drbd和drbd-kmdl,但在實際選用時,要切記兩點:drbd和drbd-kmdl的版本要對應;另一個是drbd-kmdl的版本要與當前系統的內容版本相對應。各版本的功能和配置等略有差異;我們實驗所用的平臺爲x86_64且系統爲CentOS 6.5,因此需要同時安裝內核模塊和管理工具。我們這裏選用最新的8.4的版本(drbd-8.4.3-33.el6.x86_64.rpm和drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm),下載地址爲ftp://rpmfind.net/linux/atrpms/,請按照需要下載。


實際使用中,您需要根據自己的系統平臺等下載符合您需要的軟件包版本,這裏不提供各版本的下載地址。


下載完成後直接安裝即可:


# rpm -ivh drbd-8.4.3-33.el6.x86_64.rpm drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm


3、配置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的默認中進行繼承而無須定義。


下面的操作在node1.firefox.com上完成。

1 新建磁盤分區;

[root@node1 ~]# fdisk  /dev/sda
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').
Command (m for help): p
Disk /dev/sda: 68.7 GB, 68719476736 bytes
255 heads, 63 sectors/track, 8354 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: 0x00080f2b
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26        7859    62914560   8e  Linux LVM
Command (m for help): p
Disk /dev/sda: 68.7 GB, 68719476736 bytes
255 heads, 63 sectors/track, 8354 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: 0x00080f2b
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26        7859    62914560   8e  Linux LVM
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 3
First cylinder (7859-8354, default 7859):
Using default value 7859
Last cylinder, +cylinders or +size{K,M,G} (7859-8354, default 8354):
Using default value 8354
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.
[root@node1 ~]# partx  -a /dev/sda
BLKPG: Device or resource busy
error adding partition 1
BLKPG: Device or resource busy
error adding partition 2
[root@node1 ~]# kpartx -af /dev/sda
device-mapper: reload ioctl on sda1 failed: Invalid argument
create/reload failed on sda1
device-mapper: reload ioctl on sda2 failed: Invalid argument
create/reload failed on sda2
device-mapper: reload ioctl on sda3 failed: Invalid argument
create/reload failed on sda3


2 配置/etc/drbd.d/global-common.conf

global {
    usage-count no;
    # minor-count dialog-refresh disable-ip-verification
}
common {
    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 degr-wfc-timeout outdated-wfc-timeout wait-after-sb
        #wfc-timeout 120;
        #degr-wfc-timeout 60;
    }
    options {
        # cpu-mask on-no-data-accessible
    }
    disk {
        on-io-error detach;
        # size max-bio-bvecs on-io-error fencing disk-barrier disk-flushes
        # disk-drain md-flushes resync-rate resync-after al-extents
                # c-plan-ahead c-delay-target c-fill-target c-max-rate
                # c-min-rate disk-timeout
    }
    net {
        protocol C;
        cram-hmac-alg "sha1";
        shared-secret "drbd.firefox.com";
        # protocol timeout max-epoch-size max-buffers unplug-watermark
        # connect-int ping-int sndbuf-size rcvbuf-size ko-count
        # allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri
        # after-sb-1pri after-sb-2pri always-asbp rr-conflict
        # ping-timeout data-integrity-alg tcp-cork on-congestion
        # congestion-fill congestion-extents csums-alg verify-alg
        # use-rle
    }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
    syncer {
        rate 1000M;
    }
}

3、定義一個資源/etc/drbd.d/mystore.res,內容如下:

# cat mystore.res
resource mystore {
    on node1.firefox.com {
        device /dev/drbd0;
        disk /dev/sda3;
        address 172.16.249.7:7789;
        meta-disk internal;
    }
    on node2.firefox.com {
        device /dev/drbd0;
        disk /dev/sda3;
        address 172.16.249.8:7789;
        meta-disk internal;
    }
}

以上文件在兩個節點上必須相同,因此,可以基於ssh將剛纔配置的文件全部同步至另外一個節點。

# scp  -p  /etc/drbd.d/*  node2:/etc/drbd.d/


4、在兩個節點上初始化已定義的資源並啓動服務:


1)初始化資源,在Node1和Node2上分別執行:

# drbdadm create-md mystore


2)啓動服務,在Node1和Node2上分別執行:

/etc/init.d/drbd start

3)查看啓動狀態:

# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by [email protected], 2010-06-04 08:04:16
 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:b oos:505964
也可以使用drbd-overview命令來查看:
# drbd-overview
  0:web  Connected Secondary/Secondary Inconsistent/Inconsistent C r----
從上面的信息中可以看出此時兩個節點均處於Secondary狀態。於是,我們接下來需要將其中一個節點設置爲Primary。在要設置爲Primary的節點上執行如下命令:
# drbdadm primary --force mystore
  注: 也可以在要設置爲Primary的節點上使用如下命令來設置主節點:
     # drbdadm -- --overwrite-data-of-peer primary mystore
而後再次查看狀態,可以發現數據同步過程已經開始:
# drbd-overview
  0:web  SyncSource Primary/Secondary UpToDate/Inconsistent C r----
    [============>.......] sync'ed: 66.2% (172140/505964)K delay_probe: 35
                                                                                                                                                                                                                                                                                                                                                                              
等數據同步完成以後再次查看狀態,可以發現節點已經牌實時狀態,且節點已經有了主次:
# drbd-overview
  0:web  Connected Primary/Secondary UpToDate/UpToDate C r----



5、創建文件系統


文件系統的掛載只能在Primary節點進行,因此,也只有在設置了主節點後才能對drbd設備進行格式化:

[root@node1 drbd.d]# mke2fs  -t ext4 /dev/drbd0
mke2fs 1.41.12 (17-May-2010)
Filesystem label=DRBD
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
248992 inodes, 995740 blocks
49787 blocks (5.00%) reserved forthe super user
First data block=0
Maximum filesystem blocks=1023410176
31 block groups
32768 blocks per group, 32768 fragments per group
8032 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 22 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
root@node1 drbd.d]# mkdir  /mnt/drbd
[root@node1 drbd.d]# mount /dev/drbd0  /mnt/drbd

5、切換Primary和Secondary節點


對主Primary/Secondary模型的drbd服務來講,在某個時刻只能有一個節點爲Primary,因此,要切換兩個節點的角色,只能在先將原有的Primary節點設置爲Secondary後,才能原來的Secondary節點設置爲Primary:


Node1:
# cp -r /etc/drbd.* /mnt/drbd
# umount /mnt/drbd
# drbdadm secondary mystore
查看狀態:
# drbd-overview
  0:web  Connected Secondary/Secondary UpToDate/UpToDate C r----
Node2:
# drbdadm primary web
# drbd-overview
  0:web  Connected Primary/Secondary UpToDate/UpToDate C r----
# mkdir /mnt/drbd
# mount /dev/drbd0 /mnt/drbd
[root@node2 ~]# cd /mnt/drbd/
[root@node2 drbd]# ls
drbd.conf  drbd.d  lost+found


drbd 8.4中第一次設置某節點成爲主節點的命令

# drbdadm primary --force resource


配置資源雙主模型的示例:

resource mydrbd {
        net {
                protocol C;
                allow-two-primaries yes;
        }
        startup {
                become-primary-on both;
        }
        disk {
                fencing resource-and-stonith;
        }
        handlers {
                # Make sure the other node is confirmed
                # dead after this!
                outdate-peer "/sbin/kill-other-node.sh";
        }
        on node1.firefox.com {
                device  /dev/drbd0;
                disk    /dev/vg0/mydrbd;
                address 172.16.200.11:7789;
                meta-disk       internal;
        }
        on node2.firefox.com {
                device  /dev/drbd0;
                disk    /dev/vg0/mydrbd;
                address 172.16.200.12:7789;
                meta-disk       internal;
        }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章