一、 什麼是DRBD
DRBD的全稱為:Distributed Replicated Block Device (DRBD)分布式塊設備復制,DRBD是由內核模塊和相關腳本而構成,用以構建高可用性的集群。其實現方式是通過網絡來鏡像整個設備。它允許用戶在遠程機器上建立一個本地塊設備的實時鏡像。與心跳連接結合使用,也可以把它看作是一種網絡RAID。
二、DRBD是如何工作的
Drbd 負責接收數據,把數據寫到本地磁盤,然後發送給另一個主機。另一個主機再將數據存到自己的磁盤中。目前,drbd 每次只允許對一個節點進行讀寫訪問,這對於通常的故障切換高可用性集群來講已經足夠用了。以後的版本將支持兩個節點進行讀寫存取。
三、 drbd與現在的HA集群的關系
一個drbd系統由兩個以上節點構成,與HA集群類似,也有主用節點和備用節點之分,在帶有主要設備的節點上,應用程序和操作系統可以運行和訪問drbd設備(/dev/nbX)。
在主節點寫入的數據通過drbd設備存儲到主節點的磁盤設備中,同時,這個數據也會自動發送到備用節點相應的drbd設備,最終寫入備用節點的磁盤設備中,在備用節點上,drbd只是將數據從drbd設備寫入到備用節點的磁盤設備中。
大部分現行高可用性集群都會使用共享存儲,而Drbd也可以作為一個共享存儲設備,使用drbd不需要任何硬件的投資。因為它在IP網絡中運行,所以,利用drbd作為共享存儲設備,要節約很多成本,因為在價格上IP網絡要比專用的存儲網絡經濟的多。
四、 DRBD實現原理圖
DRBD是linux的內核的存儲層中的一個分布式存儲系統,可用使用DRBD在兩台linux服務器之間共享塊設備,共享文件系統和數據。類似於一個網絡RAID1的功能,如圖1所示:
圖1
五、DRDB的安裝
從官方網站下載源碼包來編譯或直接使用yum源來安裝,這裡以CentOS為例說明安裝過程,其它系統類似。
[root@drbd1 ~]# uname -a
Linux drbd1 2.6.18-194.11.1.el5 #1 SMP Tue Aug 10 19:09:06 EDT 2010 i686 i686 i386 GNU/Linux
通過yum安裝DRBD服務:
[root@drbd1 ~]# yum -y install kmod-drbd83 drbd83
檢查DRBD是否安裝成功:
[root@drbd1 ~]# lsmod | grep -i drbd
drbd 228528 3
[root@drbd1 ~]# modprobe -l | grep -i drbd
/lib/modules/2.6.18-194.11.1.el5/weak-updates/drbd83/drbd.ko
安裝成功之後/sbin目錄下面有drbdadm,drbdmeta,drbdsetup命令,以及/etc/init.d/drbd啟動腳本。
六、配置DRDB
DRBD運行需要讀取/etc/drbd.conf配置文件,下面是兩台主機節點配置的drbd.conf文件的簡單示例:
[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 r0 {
#資源名字為r0.
protocol C;
# 使用drbd的第三種同步協議,表示收到遠程主機的寫入確認後,則認為寫入完成.
handlers {
pri-on-incon-degr "echo o > /proc/sysrq-trigger ; halt -f";
pri-lost-after-sb "echo o > /proc/sysrq-trigger ; halt -f";
local-io-error "echo o > /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";
shared-secret "MySQL-HA";
# DRBD同步時使用的驗證方式和密碼信息。
}
disk {
on-io-error detach;
fencing resource-only;
#使用dpod功能(drbd outdate-peer daemon)保證在數據不同步時不進行切換。
}
startup {
wfc-timeout 120;
degr-wfc-timeout 120;
}
device /dev/drbd0;
on dbm157 {
#每個主機的說明以on開頭,後面是hostname(uname -n),在後面的{}中為這個主機的配置。
disk /dev/sda2;
#/dev/drbd0使用的磁盤分區是/dev/sda2。
address 192.168.0.157:7788;
#設置DRBD的監聽端口,用於與另一台主機通信。
meta-disk internal;
}
on dbm158 {
disk /dev/sda2;
#/dev/drbd0使用的磁盤分區是/dev/sda2。
address 192.168.0.158:7788;
#設置DRBD的監聽端口,用於與另一台主機通信。
meta-disk internal; #drbd的元數據存放方式。
}
}
將上面這個drbd.conf文件分別復制到兩台主機的/etc目錄下。drbd.conf的配置參數很多,有興趣的話可以使用命令:man drbd.conf來查看了解更多的參數說明。
七、啟動DRBD
1 在兩個節點執行
在啟動DRBD之前,你需要分別在兩台主機的hdb1分區上,創建供DRBD記錄信息的數據塊.分別在兩台主機上執行:
[root@drbd1 ~]# drbdadm create-md r0 或者執行drbdadm create-md all
[root@drbd2 ~]# drbdadm create-md r0
2在兩個節點啟動服務
[root@drbd1 ~]#/etc/init.d/drbd start
[root@drbd2 ~]#/etc/init.d/drbd start
最好同時啟動
3在任意節點查看節點狀態
[root@drbd1 ~]# cat /proc/drbd
1: 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:2007644
對輸出的含義解釋如下:
ro表示角色信息,第一次啟動drbd時,兩個drbd節點默認都處於Secondary狀態,
ds是磁盤狀態信息,“Inconsistent/Inconsisten”,即為“不一致/不一致”狀態,表示兩個節點的磁盤數據處於不一致狀態。
Ns表示網絡發送的數據包信息。
Dw是磁盤寫信息
Dr是磁盤讀信息
4設置主節點
由於默認沒有主次節點之分,因而需要設置兩個主機的主次節點,選擇需要設置為主節點的主機,然後執行如下命令:
[root@drbd1 ~]#drbdsetup /dev/drbd0 primary –o
或者執行下面命令也是可以的
[root@drbd1 ~]#drbdadm -- --overwrite-data-of-peer primary all
第一次執行完此命令後,在後面如果需要設置哪個是主節點時,就可以使用另外一個命令:
[root@drbd1 ~]#/sbin/drbdadm primary r0或者/sbin/drbdadm primary all
執行此命令後,開始同步兩台機器對應磁盤的數據
[root@drbd1 ~]#cat /proc/drbd
1: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r----
ns:576224 nr:0 dw:0 dr:581760 al:0 bm:34 lo:84 pe:369 ua:256 ap:0 ep:1 wo:b oos:1443196
[====>...............] sync'ed: 28.4% (1443196/2007644)K delay_probe: 69
finish: 0:03:56 speed: 6,024 (5,876) K/sec
從輸出可知:
“ro狀態現在變為“Primary/Secondary”,“ds”狀態也變為“UpToDate/Inconsistent”,也就是“實時/不一致”狀態,現在數據正在主備兩個主機的磁盤間進行同步,且同步進度為28.4%,同步速度每秒5.8M左右。
等待片刻,再次查看同步狀態,輸出如下:
[root@drbd1 ~]#cat /proc/drbd
1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----
ns:2007644 nr:0 dw:0 dr:2007644 al:0 bm:123 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
可以看到同步完成了,並且“ds“狀態也變為“UpToDate/UpToDate”了。即為“實時/實時”狀態了。
如果第一次設置主備節點時使用“/sbin/drbdadm primary r0”命令,那麼會提示如下錯誤:
0: State change failed: (-2) Need access to UpToDate data
Command '/sbin/drbdsetup 0 primary' terminated with exit code 17
只要第一次用上面命令成功後,以後就可以用“/sbin/drbdadm primary r0”命令了。
5格式化文件系統
由於mount操作只能在主節點進行,所以只有設置了主節點後才能格式化磁盤分區,然後掛載:
[root@drbd1 ~]#mkfs.ext3 /dev/drbd0
[root@drbd1 ~]#mount /dev/drbd0 /mnt
八、 DRBD主備節點切換
主備節點切換有兩種方式,分別是停止drbd服務切換和正常切換,依次介紹:
1停止drbd服務切換
關閉主節點服務,此時掛載的drbd分區就自動在主節點卸載了,然後在備用節點執行切換命令:
[root@drbd2 ~]#drbdadm primary all
此時會報錯:
2: State change failed: (-7) Refusing to be Primary while peer is not outdated
Command 'drbdsetup 2 primary' terminated with exit code 11
因此,必須在備用節點執行如下命令:
[root@drbd2 ~]#drbdsetup /dev/drbd0 primary –o
或者
[root@drbd2~]#drbdadm -- --overwrite-data-of-peer primary all
此時就可以正常切換了。
當在備用節點執行切換到主節點命令後,原來的主用節點自動變為備用節點。無需在主用節點再次執行切換到備用節點的命令。
2正常切換
在主節點卸載磁盤分區,然後執行
[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