Corosync/openais+pacemaker+DRBD實現DRBD服務高可用集羣

一、準備工作

1、配置node1和node2的物理IP地址:|
node1:
ifconfig eth0 192.168.0.202/24

node2:
ifconfig eth0 192.168.0.204/24

2、配置兩主機名,保證重啓之後主機名不變

node1:
sed -i 's@\(HOSTNAME=\).*@\1node1.a.org@g'
hostname node1.a.org

node2:
sed -i 's@\(HOSTNAME=\).*@\1node2.a.org@g'
hostname node2.a.org

3、配置/etc/hosts文件,保證能夠進行本地主機名解析
node1:
vim /etc/hosts 添加如下內容:
192.168.0.202 node1.a.org node1
192.168.0.204 node2.a.org node2
在node2上進行同樣的配置

4、配置兩個主機之間能夠實現無密碼訪問

node1:
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub root@node2

node2:
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub root@node1

二、安裝Corosync/openais+pacemaker

1、下載、安裝軟件包

我們只是爲了驗證這個解決方案,爲了方便演示,使用rpm包進行安裝

所需的軟件包:

cluster-glue-1.0.6-1.6.el5.i386.rpm
libesmtp-1.0.4-5.el5.i386.rpm
cluster-glue-libs-1.0.6-1.6.el5.i386.rpm
openais-1.1.3-1.6.el5.i386.rpm
corosync-1.2.7-1.1.el5.i386.rpm
openaislib-1.1.3-1.6.el5.i386.rpm
corosynclib-1.2.7-1.1.el5.i386.rpm
pacemaker-1.0.11-1.2.el5.i386.rpm
pacemaker-libs-1.0.11-1.2.el5.i386.rpm
heartbeat-3.0.3-2.3.el5.i386.rpm
perl-TimeDate-1.16-5.el5.noarch.rpm
heartbeat-libs-3.0.3-2.3.el5.i386.rpm
resource-agents-1.0.4-1.1.el5.i386.rpm

將所有的軟件包放到一個自建的目錄yum中,方便安裝

安裝軟件包
cd /yum
yum localinstall * --nogpgcheck -y

配置node1

2、配置node1的corosync

cd /etc/corosync/
cp corosync.conf.example corosync.conf 創建配置文件

修改配置文件

vim corosync.conf 添加如下內容:

service {
ver: 0
name: pacemaker
}

aisexec { 這個是安裝了openais才需要添加的內容
user: root
group: root
}
並設定此配置文件中 bindnetaddr後面的IP地址爲你的網卡所在網絡的網絡地址,我們這裏的兩個節點在192.168.0.0網絡,因此這裏將其設定爲192.168.0.0;如下
bindnetaddr: 192.168.0.0
保存退出即可

創建所需要的日誌目錄

mkdir /var/log/cluster/

3、使用corosync-keygen 生成一個密鑰,來進行同個集羣主機的認證

corosync-keygen

4、將配置文件和密鑰同步到node2上,並在node2上創建日誌目錄

scp –p corosync.conf authkey node2.a.org;/etc/corosync/
ssh node2 ‘mkdir –v /var/log/cluster’

5、啓動node1的corosync服務

/etc/init.d/corosync start

6、驗證是否成功啓動了服務,在兩個節點上進行同樣的操作

(1)查看corosync引擎是否正常啓動:

grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/messages 下面爲輸出信息

2011-09-15 12-01-06_thumb[5]

(2)查看初始化成員節點通知是否正常發出:

grep TOTEM /var/log/messages

2011-09-15 11-59-18_thumb[7]

(3)檢查啓動過程中是否有錯誤產生:

grep ERROR: /var/log/messages | grep -v unpack_resources 應該沒有信息輸出

(4)查看pacemaker是否正常啓動:

grep pcmk_startup /var/log/messages

2011-09-15 12-02-56_thumb[6]

如果上面命令執行均沒有問題,接着可以執行如下命令啓動node2上的corosync

ssh node2 -- /etc/init.d/corosync start

注意:啓動node2需要在node1上使用如上命令進行,不要在node2節點上直接啓動;

使用同樣的方法驗證node2是否成功啓動

(5)使用Crm status命令, 查看兩個節點的信息,看該服務是否已經同步

2011-09-14-11-57-14_thumb2_thumb

表示兩個節點上的服務已經同步

三、安裝DRBD

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

2、安裝軟件包

安裝drbd使用的軟件包:

drbd83-8.3.8-1.el5.centos.i386.rpm
kmod-drbd83-8.3.8-1.el5.centos.i686.rpm

yum -y --nogpgcheck localinstall drbd83-8.3.8-1.el5.centos.i386.rpm kmod-drbd83-8.3.8-1.el5.centos.i686.rpm

3、配置drbd

1)複製樣例配置文件爲即將使用的配置文件:
cp /usr/share/doc/drbd83-8.3.8/drbd.conf /etc

2)配置/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 "mydrbdlab";
}

syncer {
rate 100M;
}
}

4、定義我們要使用的web資源/etc/drbd.d/web.res,內容如下:
resource web {
on node1.a.org {
device /dev/drbd0; 定義drbd設備號
disk /dev/sda5; 定義drbd設備所使用的磁盤
address 192.168.0.202:7789; 此drbd設備監聽的網絡地址和端口
meta-disk internal;
}
on node2.a.org {
device /dev/drbd0;
disk /dev/sda5;
address 192.168.0.204:7789;
meta-disk internal;
}
}

將這兩個配置文件拷貝到node2上,以保證配置文件相同
cd /etc/drbd.d
scp web.res global_common.conf node2:/etc/drbd.d

scp /etc/drbd.conf node2:/etc/

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

1)初始化資源,在node1和node2上分別執行:
drbdadm create-md web

2011-09-15-00-34-14_thumb2_thumb

2)啓動服務,在node1和node2上分別執行:
/etc/init.d/drbd start

2011-09-15-00-39-53_thumb1_thumb

3)查看啓動狀態:
cat /proc/drbd
2011-09-15-00-40-34_thumb4_thumb

也可以使用drbd-overview命令來查看:
drbd-overview
2011-09-15-00-41-50_thumb3_thumb

從上面的信息中可以看出此時兩個節點均處於Secondary狀態。我們要將其設定爲Primary/Secondary模型,接下來需要將node1設置爲Primary,在node1上執行如下命令:

drbdadm -- --overwrite-data-of-peer primary web
注:這個設置primary節點的命令只在第一次使用,以後就可以直接使用drbdadm primary web

而後再次查看狀態,可以發現數據同步過程已經開始:
drbd-overview
2011-09-15-00-44-47_thumb1_thumb

此時我們還可以使用如下命令動態的查看同步過程
watch -n 1 'drbd-overview'
當數據同步完成以後再次查看狀態
drbd-overview

2011-09-15-00-57-07_thumb1_thumb

可以發現節點已經爲實時狀態,且兩節點已經成爲Primary/Secondary模型

6、將兩個節點上的/dev/drbd0設備進行格式化(只有爲主節點上的drbd設備能夠格式化,所以要通過改變節點的角色來實現)

現在node1爲主節點,所以可以直接進行格式化
mke2fs -j /dev/drbd0

然後讓node1成爲從節點,node2稱爲主節點進行drbd設備的格式化
node1:
drbdadm seconday web

node2:
drbdadm primary web
mke2fs -j /dev/drbd0

7、關閉drbd服務,並確保兩節點上的drbd服務不會開機自動啓動

/etc/init.d/drbd stop
ssh node2 -- '/etc/init.d/drbd stop'
chkconfig drbd off
ssh node2 -- 'chkconfig drbd off'

四、配置drbd服務爲高可用

1、查看當前集羣的配置信息,確保已經配置全局屬性參數爲兩節點集羣所適用:

crm configure show

2011-09-15 14-17-46_thumb[3]

確保有stonith-enabled和no-quorum-policy出現且其值與如上輸出信息中相同。
否則,可以分別使用如下命令進行配置:
crm configure property stonith-enabled=false
crm configure property no-quorum-policy=ignore

2、將已經配置好的drbd設備/dev/drbd0定義爲集羣服務;

1)配置drbd爲集羣資源:
drbd需要同時運行在兩個節點上,但只能有一個節點(primary/secondary模型)是Master,而另一個節點爲Slave;因此,它是一種比較特殊的集羣資源,其資源類型爲多狀態(Multi-state)clone類型,即主機節點有Master和Slave之分,且要求服務剛啓動時兩個節點都處於slave狀態。

[root@node1 ~]# crm
crm(live)# configure
crm(live)configure# primitive httpd_drbd_web ocf:heartbeat:drbd params drbd_resource=web op monitor role=Master interval=60s timeout=40s op monitor role=Slave interval=70s timeout=40s
crm(live)configure# master MS_Webdrbd webdrbd meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"
crm(live)configure# verify
crm(live)configure# commit

查看關於httpd_drbd_web的配置
crm(live)configure# show httpd_drbd_web

2011-09-15 15-20-14_thumb[1]
查看資源的運行狀態

crm status 顯示如下:

2011-09-15 15-25-09_thumb[1]

由上面的信息可以看出此時的drbd服務的Primary節點爲node1.a.org,Secondary節點爲node2.a.org,我們在node1上使用如下命令驗正當前主機是否已經成爲web資源的Primary節點:
drbdadm role web
2011-09-15 15-29-22_thumb[1]

2)爲Primary節點上的web資源創建自動掛載的集羣服務

MS_Webdrbd的Master節點即爲drbd服務web資源的Primary節點,此節點的設備/dev/drbd0可以掛載使用,且在某集羣服務的應用當中也需要能夠實現自動掛載。假設我們這裏的web資源是爲Web服務器集羣提供網頁文件的共享文件系統,其需要掛載至/var/www/html目錄。

因爲此自動掛載的集羣資源需要運行於drbd服務的Master節點上,並且只能在drbd服務將某節點設置爲Primary以後方可啓動,所以還需要爲這兩個資源建立排列約束和順序約束。

# crm
crm(live)# configure
crm(live)configure# primitive drbd_webFS ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/var/www/html" fstype="ext3"
crm(live)configure# colocation drbd_webFS_on_MS_Webdrbd inf: drbd_webFS MS_Webdrbd:Master
crm(live)configure# order drbd_webFS_after_MS_Webdrbd inf: MS_Webdrbd:promote drbd_webFS:start
crm(live)configure# verify
crm(live)configure# commit

查看集羣中資源的運行狀態:
crm status
2011-09-15 16-21-17

由上面的信息可以發現,此時drbd_webFS運行的節點和drbd服務的Primary節點均爲node1.a.org

3)測試

在node1的/var/www/html目錄創建一個網頁文件,而後在故障故障轉移後查看node2的/var/www/html目錄下是否存在這些文件。
echo node1 > /var/www/html/index.html

我們模擬node1節點故障,看此些資源可否正確轉移至node2。
node1:
crm node standby
node2:
crm status

2011-09-15 16-45-18

由上面的信息可以推斷出node1停止服務,所有資源已經正常轉移至node2。

在node2可以看到在node1作爲primary節點時創建保存至/var/www/html目錄中的數據,在node2上是否存在一份拷貝。

2011-09-15 16-50-41

文件存在

讓node1上線,看我們drbd資源是否會分佈在兩個節點上

2011-09-15 16-52-34

可見drbd高可用服務的資源全部在node2上,也就是我們創建的約束條件得到了證實

到此使用Corosync/openais+pacemaker+DRBD實現DRBD服務高可用集羣已經實現

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