一、drbd概述
Distributed Replicated Block Device(DRBD)是一種基于軟件的,無(wú)共享,復(fù)制的存儲(chǔ)解決方案,在服務(wù)器之間的對(duì)塊設(shè)備(硬盤,分區(qū),邏輯卷等)進(jìn)行鏡像。
DRBD工作在內(nèi)核當(dāng)中的,類似于一種驅(qū)動(dòng)模塊。DRBD工作的位置在文件系統(tǒng)的buffer cache和磁盤調(diào)度器之間,通過(guò)tcp/ip發(fā)給另外一臺(tái)主機(jī)到對(duì)方的tcp/ip最終發(fā)送給對(duì)方的drbd,再由對(duì)方的drbd存儲(chǔ)在本地對(duì)應(yīng)磁盤 上,類似于一個(gè)網(wǎng)絡(luò)RAID-1功能。
在高可用(HA)中使用DRBD功能,可以代替使用一個(gè)共享盤陣。本地(主節(jié)點(diǎn))與遠(yuǎn)程主機(jī)(備節(jié)點(diǎn))的數(shù)據(jù)可以保 證實(shí)時(shí)同步。當(dāng)本地系統(tǒng)出現(xiàn)故障時(shí),遠(yuǎn)程主機(jī)上還會(huì)保留有一份相同的數(shù)據(jù),可以繼續(xù)使用。
DRBD的架構(gòu)如下圖
底層設(shè)備支持
DRBD需要構(gòu)建在底層設(shè)備之上,然后構(gòu)建出一個(gè)塊設(shè)備出來(lái)。對(duì)于用戶來(lái)說(shuō),一個(gè)DRBD設(shè)備,就像是一塊物理的磁盤,可以在上面內(nèi)創(chuàng)建文件系統(tǒng)。DRBD所支持的底層設(shè)備有以下這些類:
1、一個(gè)磁盤,或者是磁盤的某一個(gè)分區(qū);
2、一個(gè)soft raid 設(shè)備;
3、一個(gè)LVM的邏輯卷;
4、一個(gè)EVMS(Enterprise Volume Management System,企業(yè)卷管理系統(tǒng))的卷;
5、其他任何的塊設(shè)備。
DRBD復(fù)制模式
協(xié)議A:
異步復(fù)制協(xié)議。一旦本地磁盤寫入已經(jīng)完成,數(shù)據(jù)包已在發(fā)送隊(duì)列中,則寫被認(rèn)為是完成的。在一個(gè)節(jié)點(diǎn)發(fā)生故障時(shí),可能發(fā)生數(shù)據(jù)丟失,因?yàn)楸粚懭氲竭h(yuǎn)程節(jié)點(diǎn)上的數(shù)據(jù)可能仍在發(fā)送隊(duì)列。盡管,在故障轉(zhuǎn)移節(jié)點(diǎn)上的數(shù)據(jù)是一致的,但沒(méi)有及時(shí)更新。這通常是用于地理上分開(kāi)的節(jié)點(diǎn)。
協(xié)議B:
內(nèi)存同步(半同步)復(fù)制協(xié)議。一旦本地磁盤寫入已完成且復(fù)制數(shù)據(jù)包達(dá)到了對(duì)等節(jié)點(diǎn)則認(rèn)為寫在主節(jié)點(diǎn)上被認(rèn)為是完成的。數(shù)據(jù)丟失可能發(fā)生在參加的兩個(gè)節(jié)點(diǎn)同時(shí)故障的情況下,因?yàn)樵趥鬏斨械臄?shù)據(jù)可能不會(huì)被提交到磁盤。
協(xié)議C:
同步復(fù)制協(xié)議。只有在本地和遠(yuǎn)程節(jié)點(diǎn)的磁盤已經(jīng)確認(rèn)了寫操作完成,寫才被認(rèn)為完成。沒(méi)有任何數(shù)據(jù)丟失,所以這是一個(gè)群集節(jié)點(diǎn)的流行模式,但I(xiàn) / O吞吐量依賴于網(wǎng)絡(luò)帶寬。
一般使用協(xié)議C,但選擇C協(xié)議將影響流量,從而影響網(wǎng)絡(luò)時(shí)延。為了數(shù)據(jù)可靠性,我們?cè)谏a(chǎn)環(huán)境使用時(shí)須慎重選項(xiàng)使用哪一種協(xié)議。
二、drbd的安裝
1、準(zhǔn)備工作
1)本配置共有兩個(gè)測(cè)試節(jié)點(diǎn),分別node1.comratings.com和node2.comratings.com,相的IP地址分別為10.0.0.16和10.0.0.17,且解析寫到對(duì)應(yīng)的/etc/hosts下面;
2)node1和node2兩個(gè)節(jié)點(diǎn)上各提供了一個(gè)大小相同的分區(qū)作為drbd設(shè)備;我們這里為在兩個(gè)節(jié)點(diǎn)上均為/dev/sda5,大小為512M;
3)系統(tǒng)為CentOS 6.5,x86_64平臺(tái)。
2、軟件包介紹
drbd共有兩部分組成:內(nèi)核模塊和用戶空間的管理工具。其中drbd內(nèi)核模塊代碼已經(jīng)整合進(jìn)Linux內(nèi)核2.6.33以后的版本中,因此,如果您的內(nèi)核版本高于此版本的話,你只需要安裝管理工具即可;否則,您需要同時(shí)安裝內(nèi)核模塊和管理工具兩個(gè)軟件包,并且此兩者的版本號(hào)一定要保持對(duì)應(yīng)。
目前適用CentOS 5的drbd版本主要有8.0、8.2、8.3三個(gè)版本,其對(duì)應(yīng)的rpm包的名字分別為drbd, drbd82和drbd83,對(duì)應(yīng)的內(nèi)核模塊的名字分別為kmod-drbd, kmod-drbd82和kmod-drbd83。而適用于CentOS 6的版本為8.4,其對(duì)應(yīng)的rpm包為drbd和drbd-kmdl,但在實(shí)際選用時(shí),要切記兩點(diǎn):drbd和drbd-kmdl的版本要對(duì)應(yīng);另一個(gè)是drbd-kmdl的版本要與當(dāng)前系統(tǒng)的內(nèi)容版本相對(duì)應(yīng)。各版本的功能和配置等略有差異;我們實(shí)驗(yàn)所用的平臺(tái)為x86_64且系統(tǒng)為CentOS 6.4,因此需要同時(shí)安裝內(nèi)核模塊和管理工具。我們這里選用最新的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/,請(qǐng)按照需要下載。
實(shí)際使用中,您需要根據(jù)自己的系統(tǒng)平臺(tái)等下載符合您需要的軟件包版本,這里不提供各版本的下載地址。
3、軟件包安裝
下載完成后直接安裝即可:
# 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
三、配置drbd
1、配置文件介紹
drbd的主配置文件為/etc/drbd.conf;為了管理的便捷性,目前通常會(huì)將些配置文件分成多個(gè)部分,且都保存至/etc/drbd.d目錄中,主配置文件中僅使用"include"指令將這些配置文件片斷整合起來(lái)。通常,/etc/drbd.d目錄中的配置文件為global_common.conf和所有以.res結(jié)尾的文件。其中g(shù)lobal_common.conf中主要定義global段和common段,而每一個(gè).res的文件用于定義一個(gè)資源。
在配置文件中,global段僅能出現(xiàn)一次,且如果所有的配置信息都保存至同一個(gè)配置文件中而不分開(kāi)為多個(gè)文件的話,global段必須位于配置文件的最開(kāi)始處。目前global段中可以定義的參數(shù)僅有minor-count, dialog-refresh, disable-ip-verification和usage-count。
common段則用于定義被每一個(gè)資源默認(rèn)繼承的參數(shù),可以在資源定義中使用的參數(shù)都可以在common段中定義。實(shí)際應(yīng)用中,common段并非必須,但建議將多個(gè)資源共享的參數(shù)定義為common段中的參數(shù)以降低配置文件的復(fù)雜度。
resource段則用于定義drbd資源,每個(gè)資源通常定義在一個(gè)單獨(dú)的位于/etc/drbd.d目錄中的以.res結(jié)尾的文件中。資源在定義時(shí)必須為其命名,名字可以由非空白的ASCII字符組成。每一個(gè)資源段的定義中至少要包含兩個(gè)host子段,以定義此資源關(guān)聯(lián)至的節(jié)點(diǎn),其它參數(shù)均可以從common段或drbd的默認(rèn)中進(jìn)行繼承而無(wú)須定義。
以下是我的配置事例:
#cat /etc/drbd.d/global-common.conf
global {
usage-count no;
# minor-count dialog-refresh disable-ip-verification
}
common {
protocol C;
handlers {
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 120;
#degr-wfc-timeout 120;
}
disk {
on-io-error detach;
#fencing resource-only;
}
net {
cram-hmac-alg "sha1";
shared-secret "mydrbd";
}
syncer {
rate 1000M;
}
}
2、定義一個(gè)資源/etc/drbd.d/web.res,內(nèi)容如下:
resource web {
on node1.comratings.com {
device /dev/drbd0;
disk /dev/sda5;
address 10.0.0.16:7789;
meta-disk internal;
}
on node2.comratings.com {
device /dev/drbd0;
disk /dev/sda5;
address 10.0.0.17:7789;
meta-disk internal;
}
}
注:以上配置在兩個(gè)節(jié)點(diǎn)上必須相同
四、drbd啟動(dòng)和查看
1、初始化資源
在Node1和Node2上分別執(zhí)行:
# drbdadm create-md web
2、啟動(dòng)服務(wù)
在Node1和Node2上分別執(zhí)行:
# service drbd start
3、查看啟動(dòng)狀態(tài)
# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by mockbuild@builder10.centos.org, 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命令來(lái)查看:
# drbd-overview
0:web Connected Secondary/Secondary Inconsistent/Inconsistent C r----
從上面的信息中可以看出此時(shí)兩個(gè)節(jié)點(diǎn)均處于Secondary狀態(tài)。于是,我們接下來(lái)需要將其中一個(gè)節(jié)點(diǎn)設(shè)置為Primary。在要設(shè)置為Primary的節(jié)點(diǎn)上執(zhí)行如下命令:
# drbdadm primary --force resource
注: 也可以在要設(shè)置為Primary的節(jié)點(diǎn)上使用如下命令來(lái)設(shè)置主節(jié)點(diǎn):
# drbdadm -- --overwrite-data-of-peer primary web
而后再次查看狀態(tài),可以發(fā)現(xiàn)數(shù)據(jù)同步過(guò)程已經(jīng)開(kāi)始:
# drbd-overview
0:web SyncSource Primary/Secondary UpToDate/Inconsistent C r----
[============>.......] sync'ed: 66.2% (172140/505964)K delay_probe: 35
等數(shù)據(jù)同步完成以后再次查看狀態(tài),可以發(fā)現(xiàn)節(jié)點(diǎn)已經(jīng)牌實(shí)時(shí)狀態(tài),且節(jié)點(diǎn)已經(jīng)有了主次:
# drbd-overview
0:web Connected Primary/Secondary UpToDate/UpToDate C r----
4、創(chuàng)建文件系統(tǒng)
文件系統(tǒng)的掛載只能在Primary節(jié)點(diǎn)進(jìn)行,因此,也只有在設(shè)置了主節(jié)點(diǎn)后才能對(duì)drbd設(shè)備進(jìn)行格式化:
# mke2fs -j -L DRBD /dev/drbd0
# mkdir /mnt/drbd
# mount /dev/drbd0 /mnt/drbd
5、切換Primary和Secondary節(jié)點(diǎn)
對(duì)主Primary/Secondary模型的drbd服務(wù)來(lái)講,在某個(gè)時(shí)刻只能有一個(gè)節(jié)點(diǎn)為Primary,因此,要切換兩個(gè)節(jié)點(diǎn)的角色,只能在先將原有的Primary節(jié)點(diǎn)設(shè)置為Secondary后,才能原來(lái)的Secondary節(jié)點(diǎn)設(shè)置為Primary:
Node1:
# cp -r /etc/drbd.* /mnt/drbd
# umount /mnt/drbd
# drbdadm secondary web
查看狀態(tài):
# 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
使用下面的命令查看在此前在主節(jié)點(diǎn)上復(fù)制至此設(shè)備的文件是否存在:
# ls /mnt/drbd