DRBD+Heartbeat 架設 HA NFS Server on CentOS 5

目標 : 由於 NFS Server 在公司非常重要,如果不能服務將會造成許多人無法工作,所以利用 DRBD 與 Heartbeat 來做出可以在NFS 主機當機時, NFS Server 會自動切換到備用機,來達成不停止服務的目標
目前這個方案的缺點是無法兩台同時服務,下次的目標是做出可以同時服務的 Cluster。

0. 環境
兩台主機 node1, node2, 虛擬 ip (vip) 為 172.16.1.10
node1 172.16.1.11
node2 172.16.1.12
vip 172.16.1.10
兩台均有兩顆硬碟, /dev/sda 作 OS 使用, 而 /dev/sdb 作 data 使用

在兩台主機
vi /etc/hosts
172.16.1.11 node1
172.16.1.12 node2

注意 主機名稱需與 /etc/sysconfig/network 的 HOSTNAME 相符
若有帶網域名稱, 則 /etc/hosts 也要使用網域名稱

1. 安裝套件

[node01],[node02] 皆執行
# yum -y install drbd83 kmod-drbd83 portmap nfs-utils heartbeat

NFS Service:
請設定 portmap 預測啟動, nfs 則可以不用 , Heartbeat 會自行啟動
[node01],[node02] 皆執行
chkconfig portmap on
service portmap start
service nfs on

NFS 分享設定: 分享 /data
[node01],[node02] 皆執行
vim /etc/exports
/data 172.16.1.0/255.255.255.0(rw,no_root_squash,no_all_squash,sync)

2. DRBD
分顆硬碟:
fdisk /dev/sdb -> 整顆切一塊為 /dev/sdb1
並會將 /dev/sdb1 在 drbd 指定為 r0 , 如下

設定 drbd.conf:
[node01],[node02] 皆執行
vim /etc/drbd.conf

global {
usage-count yes;
}

common {
syncer { rate 100M; }
}

resource r0 {
protocol C;
startup {
wfc-timeout 0;
degr-wfc-timeout 120;
}

disk {
on-io-error detach;
# no-disk-flushes;
# no-md-flushes
# size 1G;
}

net {
}

on node01 {
device /dev/drbd0;
disk /dev/sdb1;
address 172.16.1.12:7788;
meta-disk internal;
}

on node02 {
device /dev/drbd0;
disk /dev/sdb1;
address 172.16.1.12:7788;
meta-disk internal;
}
}

初始化 drbd :
node01, node02 兩台都執行以下指令

drbdadm create-md r0
chkconfig drbd on

service drbd start
Starting DRBD resources: [ d(r0) s(r0) n(r0) ].

查看 drbd 狀態, 一開始 node01, node02 都會是 Secondary 的狀態
cat /proc/drbd
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:02:24
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:1044124

等 drbd 作完後, 把 node01 的 drbd 設為 primary
[node01]# drbdadm primary r0

作完後,開始格式化
[node01]# mkfs.ext3 /dev/drbd0
[node01]# mount /dev/drbd0 /data

注意: 若此時要變更 primary 由 node01 到 node02, 最安全的方法
先將 node01 變成 secondary, 即兩台都是 secodary
[node01]# umount /data
[node01]# drbdadm secondary r0
此時才把 node01 提升為 primary
[node02]# drbdadm primary r0
[node02]# mount /data

3. HA 的部分
[node01], [node02] 兩台設定均同

vim /etc/ha.d/ha.cf

#debugfile /var/log/ha-debug.log
logfile /var/log/ha-log
logfacility local0

keepalive 2 #設定心跳(監測)時間時間為2秒
warntime 5
deadtime 20
initdead 120
#hopfudge 1

udpport 694 #使用 UDP Port 694 進行心跳監測
auto_failback off #如果主要伺服器故障後修復完成,另一台伺服器是否該放棄資源
#baud 19200
bcast eth0 #使用eth0做心跳監測 (注意:如果電腦只有 eth0, 請改成 eth0)
#ucast eth0 172.16.1.11

#watchdog /dev/watchdog
#crm on

node node01 #節點1,必須要與 hostname 或 uname -n 顯示的主機名稱相符合才可以,此處也可以寫為 node01
node node02 #節點2,此處也可以寫為 node02

ping 172.16.1.254 #使用 ping Gateway 當成檢查主要主機是否仍在運作 (心跳是否正常)
#ping 172.16.1.11 172.16.1.12 172.16.1.10
#deadping 5

#ping_group lbgroup 10.0.0.101 10.0.0.102
#ping_group lbgroup 172.16.1.11 172.16.1.12

#設定和 heartbeat 一起啟動、關閉的進程
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster

vim /etc/ha.d/authkeys

auth 1
1 crc

chmod 600 /etc/ha.d/authkeys

vim /etc/ha.d/haresources

node01 IPaddr::172.16.1.10/24/eth0 drbddisk::r0 Filesystem::/dev/drbd0::/data::ext3 nfs

vim /etc/ha.d/resource.d/nfs

killall -9 nfsd; /etc/init.d/nfs restart; exit 0

以上參考所實作,
http://forum.icst.org.tw/phpbb/viewtopic.php?f=10&t=17893&start=0

啟動與測試:

假設 node01 是主結點, node02 為副節點,所以請在 [node01] 執行後, 再到 [node02] 執行
[node01]# service heartbeat start
[node01]# /etc/init.d/heartbeat start
[node02]# service heartbeat start
[node02]# /etc/init.d/heartbeat start

Case01, 假設 node01 死掉, 切到 node02
[node01]# /etc/init.d/heartbeat stop
將會把 VIP (172.16.1.10) 切到 node02

建議, 若 node01 若恢復正常, 請將 heartbeat 切回去
[node01]# /etc/init.d/heartbeat start
[node02]# /etc/init.d/heartbeat stop
[node01]# /etc/init.d/heartbeat start

Case02: 若在切回至 node01 , 相當於假設 node02 死掉
要先讓 node01 的 heartbeat 為啟動狀態, 才能從 node02 接手過來
[node01]# /etc/init.d/heartbeat start
[node02]# /etc/init.d/heartbeat stop
等 node02 恢復
[node02]# /etc/init.d/heartbeat start
此時 VIP 仍在 node01

ps.
原有兩個錯誤
1. /etc/ha.d/haresources 內容為,
centos1.lu.idv.tw IPaddr::192.168.128.100/22/eth0 drbddisk::r0 Filesystem::/dev/drbd0::/d::ext3 nfs
遮罩應為 24, 才能順利啟動 heartbeat

2. /etc/ha.d/resource.d/killnfsd, 根據 haresources 設定名稱應為 /etc/ha.d/resource.d/nfs,
否則 heartbeat 會找不到 /etc/ha.d/resource.d/nfs, 而無法順利啟動 nfs service

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

%d 位部落客按了讚: