DRBD的官網:http://www.drbd.org
下載下傳位址:http://oss.linbit.com/drbd/
DRBD概念:

DRBD是由核心子產品和相關腳本構成,用以建構高可用性的叢集,其實作方式是通過網絡來鏡像整個裝置,允許使用者在遠端機器上建立一個本地塊裝置的實時鏡像,與心跳連接配接結合使用,可以把它看做是一種網絡RAID1。目前DRBD每次隻允許對一個節點進行讀寫通路,這對于通常的故障切換高可用性叢集來說已經足夠。
一個DRBD系統由兩個或兩個以上節點構成,與HA叢集類似,也有主節點和備用節點之分。在主節點寫入資料通過DRDB裝置存儲到主節點的磁盤中,同時,這個資料也會自動發送到備用節點相應的DRBD裝置,最終寫入備用節點的磁盤。
DRBD可以作為一個共享儲存設備,不需要任何硬體投資,因為它在IP網絡中運作,是以利用DRBD作為共享儲存設備,可以節約很多成本,在價格上比專用的存儲網絡SAN經濟很多。
<b>DRDB</b><b>的讀寫操作過程分析:</b>
對于讀操作, 都是使用"主用"的存儲, 即本地的.
對于寫操作, 問題有些複雜, 但是針對最簡單的情況, 它的實作方式如下,
1. 接到寫請求;
2. 把寫請求發送給本地底層存儲, 同時通過網絡把寫請求發送給對端的"次用"DRBD裝置;
3. "次用"DRBD裝置執行寫請求, 把資料寫到實體存儲上.
4. "次用"DRBD在完成寫操作後, 發送一個"确認"給"主用"DRDB
5. 這是, "主用"DRBD應已完成對本地硬碟的寫, 傳回給應用一個寫操作完成确認.
也就是說, DRBD直到完成本地和遠端的寫操作, 才傳回應用一個寫完成.
當然, 這是DRBD最嚴格的一種實作. DRDB也可以有另兩種相對松散的實作,
a. 主用DRBD在接到寫請求後, 立刻傳回寫完成給應用.
b. 在次用DRBD的緩存收到寫請求後, 立刻傳回寫完成給應用.
DRBD還支援同時向"主用"和"次用"裝置的寫操作, 實作就要複雜的多. 我的個人了解, 對于應用來說, 隻面對主用裝置, 在發生叢集(clustering)切換之前, 應用是不直接通路次用裝置的. 結構越簡單, 可靠性越高.
DRBD協定:
A、資料一旦寫入磁盤并發送到網絡中就認為完成了寫入操作。
B、收到遠端節點接收确認就認為完成了寫入操作。
C、收到遠端節點寫入确認就認為完成了寫入操作。
DRBD裝置的三個程序:
每個drbd裝置會有三個程序:
drbd0_worker 是drbd0的主要程序,統一控制資料的寫入和傳出等的排程。
drbd0_asender是primary上drbd0的資料發送程序(資料先寫入主節點後,然後asender程序發送資料到備用節點)
drbd0_receiver是secondary上drbd0的資料接收程序。
<b>一、測試環境</b>
server1 單獨一塊硬碟sdb作DRDB, 128.1.37.204
server2 單獨一塊硬碟sdb作DRDB 128.1.37.205
<b>二、安裝步驟:</b>
#tar -zxvf drbd-8.3.10.tar.gz
#cd drbd-8.3.10
注意,DRBD需要核心子產品支援,2.6.33後的Linux核心已内置DRBD的支援,在此版本前,安裝時需要kernel-
devel包,同時編譯drbd時要帶上--with-km。
#./configure --prefix=/ --with-km
#make
#make install
#chkconfig --add drbd
檢查DRBD是否安裝成功:
lsmod | grep -i drbd
modprobe -l | grep drbd
安裝完成後,在/sbin目錄下會有如下檔案: drbdadm、drbdmeta,drbdsetup指令,以及/etc/init.d/drbd啟動腳本
-------------------------------
<b>三、</b><b> DRBD</b><b>配置</b>
DRBD的配置檔案位于/etc/drbd.conf
DRBD配置請參考:http://www.drbd.org/docs/install/
[root@drbd1 ~]#cat /etc/drbd.conf
#
# drbd.conf
# create by [email protected] at 2010-08-12
global {
# minor-count 64;
# dialog-refresh 5; # 5 seconds
# disable-ip-verification;
usage-count no;
#是否參加DRBD使用者統計,預設yes
}
common {
syncer { rate 200M; }
#設定主備節點同步時的網絡速率最大值,機關是位元組。
resource drbdtest {
#資源名字為r0. 在啟動DRBD之前,你需要分别在兩台主機的hdb1分區上,建立供DRBD記錄資訊的資料塊,塊裝置名為r0
protocol C;
# 使用drbd的第三種同步協定,表示收到遠端主機的寫入确認後,則認為寫入完成.
handlers {
pri-on-incon-degr "echo o &gt; /proc/sysrq-trigger ; halt -f";
pri-lost-after-sb "echo o &gt; /proc/sysrq-trigger ; halt -f";
local-io-error "echo o &gt; /proc/sysrq-trigger ; halt -f";
fence-peer "/usr/lib64/heartbeat/drbd-peer-outdater -t 5";
pri-lost "echo pri-lost. Have a look at the log files. | mail -s 'DRBD Alert' root";
split-brain "/usr/lib/drbd/notify-split-brain.sh root";
out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";
#上面是在進行資料傳輸過程中的加密設定,都是預設參數
net {
# timeout 60;
# connect-int 10;
# ping-int 10;
# max-buffers 2048;
# max-epoch-size 2048;
cram-hmac-alg "sha1"; //同步過程中的加密級别為sha1(還有crc,md5)
shared-secret "mydrbdtest"; //自定義同步過程中的加密密碼,主備節點密碼要一緻
# DRBD同步時使用的驗證方式和密碼資訊。
disk {
on-io-error detach;
fencing resource-only;
#使用dpod功能(drbd outdate-peer daemon)保證在資料不同步時不進行切換,一般會配合heartbeat進行使用。
startup {
wfc-timeout 120;
degr-wfc-timeout 120;
#定義逾時的設定,此處為預設值、
device /dev/drbd0;
#定義drdb0的裝置塊的辨別
on server1 {
#每個主機的說明以on開頭,後面是hostname(uname -n),在後面的{}中為這個主機的配置。
disk /dev/sdb1;
#/dev/drbd0使用的磁盤分區是/dev/sda2,即要鏡像的磁盤分區
address 128.1.37.204:7788; //IP為對應主機的ip,而不是對方主機的IP
#設定DRBD的監聽端口,用于與另一台主機通信。
meta-disk internal; //定義drdb的中繼資料的存放方式
on server2 {
#/dev/drbd0使用的磁盤分區是/dev/sda2。
address 128.1.37.205:7788;
meta-disk internal; #drbd的中繼資料存放方式。
将上面這個drbd.conf檔案分别複制到兩台主機的/etc目錄下。
<b>四、建立塊裝置</b>
分别在兩台主機的sdb1分區上,建立供DRBD記錄資訊的資料塊.。
在兩台主機上執行同樣的指令,輸入yes就可以了。
<b>五、啟動</b><b>DRBD</b><b>并檢查狀态</b>
執行以下指令啟動drbd,
#service drbd start
或是
#/etc/init.d/drbd start
可以看到在程序中已經有了drbd的兩個程序:drbd0_worker、drbd0_receiver
下面我們來檢視現在drbd的狀态資訊:
看到在狀态顯示secondary/unknown,表示為能跟另一台主機連接配接上,我們這裡先停掉iptables
Service iptables stop
再次檢視狀态如下:
看到這裡已經顯示是secondary/secondary狀态了,
對輸出的含義解釋如下:
ro表示角色資訊,第一次啟動drbd時,兩個drbd節點預設都處于Secondary狀态,
ds是磁盤狀态資訊,“Inconsistent/Inconsisten”,即為“不一緻/不一緻”狀态,表示兩個節點的磁盤資料處于不一緻狀态。
Ns表示網絡發送的資料包資訊。
Dw是磁盤寫資訊
Dr是磁盤讀資訊
<b>4</b><b>設定主節點</b>
由于預設沒有主次節點之分,因而需要設定兩個主機的主次節點,選擇需要設定為主節點的主機,然後執行如下指令:
[root@drbd1 ~]#drbdsetup /dev/drbd1 primary –o
或者執行下面指令也是可以的
[root@drbd1 ~]#drbdadm -- --overwrite-data-of-peer primary all
第一次執行完此指令後,在後面如果需要設定哪個是主節點時,就可以使用另外一個指令:
[root@drbd1 ~]#/sbin/drbdadm primary r0或者/sbin/drbdadm primary all
再次檢視drbd狀态,
可以看到現在狀态已經是primary/secondary,而且磁盤資訊是upTodat/Inconsistent(實時/不一緻),而且已經開始同步兩台機器對應磁盤的資料
過了一會,我們再次檢視drbd狀态,如下:
此時的狀态資訊就是primary/secondary,磁盤資訊是UpToDate/UpToDate,說明已經同步完成了。
<b>六、主備節點切換測試:</b>
1、主用節點挂掉:
此時在備用節點執行以下指令:
#drbdsetup /dev/drbd0 primary -o
可以看到在執行指令前後的狀态變化。
2、正常切換主備節點:
在server1解除安裝磁盤分區,然後執行
[root@drbd1 ~]#drbdadm secondary all
如果不執行這個指令,直接在備用節點執行切換到主節點的指令,會報錯:
2: State change failed: (-1) Multiple primaries not allowed by config
Command 'drbdsetup 2 primary' terminated with exit code 11
接着,在備用節點執行
[root@drbd2 ~]#drbdadm primary all
最後在備用節點挂載磁盤分區即可:
[root@drbd2 ~]#mount /dev/drbd2 /mnt
<b>七、注意事項:</b>
1、 mount drbd裝置以前必須把裝置切換到primary狀态
2、 兩個節點中,同一個時刻隻能有一台處于primary狀态,另一台處于secondary狀态
3、 處于secondary狀态的伺服器上不能加載drbd裝置。
4、 主備伺服器同步的兩個分區大小最好相同,這樣不至于浪費磁盤空間,因為drbd磁盤相當于網絡raid1