by:http://blog.vfocus.net
heartbeat+drbd
如果主伺服器宕機,造成的損失是不可估量的。要保證主伺服器不間斷服務,就需要對伺服器實現冗餘。在眾多的實現伺服器冗餘的解決方案中,heartbeat為我們提供了廉價的、可伸縮的高可用叢集方案。我們通過heartbeat+drbd在Linux下建立一個高可用(HA)的叢集伺服器。
DRBD是一種塊裝置,可以被用於高可用(HA)之中。它類似於一個網路RAID-1功能。當你將資料寫入本地檔案系統時,資料還將會被發送到網路中另一台主機上。以相同的形式記錄在一個檔案系統中。本地(主節點)與遠程主機(備節點)的資料可以保證即時同步。當本地系統出現故障時,遠程主機上還會保留有一份相同的資料,可以繼續使用。在高可用(HA)中使用DRBD功能,可以代替使用一個共用盤陣。因為資料同時存在於本地主機和遠程主機上。切換時,遠程主機只要使用它上面的那份備份資料,就可以繼續進行服務了。
安裝heartbeat
[root@manager src]# rpm -ivh e2fsprogs-1.35-7.1.i386.rpm
[root@manager src]# tar zxvf libnet.tar.gz
[root@manager libnet]# ./configure
[root@manager libnet]# make
[root@manager libnet]# make install
[root@manager src]# tar zxvf heartbeat-2.1.2.tar.tar
[root@manager src]# cd heartbeat-2.1.2
[root@manager heartbeat-2.1.2]# ./ConfigureMe configure
[root@manager heartbeat-2.1.2]# make
[root@manager heartbeat-2.1.2]# make install
[root@manager heartbeat-2.1.2]# cp doc/ha.cf /etc/ha.d/
[root@manager heartbeat-2.1.2]# cp doc/haresources /etc/ha.d/
[root@manager heartbeat-2.1.2]# cp doc/authkeys /etc/ha.d/
[root@manager heartbeat-2.1.2]# cd /etc/ha.d/
開始編輯設定檔(兩台機器上都需要安裝和配置)
(heartbeat的配置比較簡單,網上也有很多例子,這裡就不多廢話了)
開始編譯安裝DRBD
[root@manager root]# cp drbd-8.2.1.tar.tar /usr/src/
[root@manager root]# cd /usr/src/
[root@manager src]# tar zxvf drbd-8.2.1.tar.tar
[root@manager src]# cd drbd-8.2.1
[root@manager src]# make KERNVER=2.6.17.11 KDIR=/usr/src/linux-2.6.17.11
如果編譯順利可以看到Module build was successful.
[root@manager drbd-8.2.1]# make install
可以編輯設定檔了
[root@manager drbd-8.2.1]# vi /etc/drbd.conf
在manager和manage_bak上都需要安裝drbd服務。
分別在兩台機器上配置好/etc/drbd.conf
[root@manager_bak root]# grep -v "#" /etc/drbd.conf
global {
usage-count yes; (是否參加使用者統計,yes為參加)
}
common {
syncer { rate 300M; }
}
resource r0 {
protocol C; (資料同步協議,C為收到資料並寫入後返回,確認成功)
disk {
on-io-error detach;
size 100G; (由於實驗環境下兩台伺服器硬碟大小不同,所以需要設定drbd的大小)
}
net {
after-sb-0pri disconnect;
rr-conflict disconnect;
}
syncer {
rate 300M; (設定網路同步速率)
al-extents 257;
}
on manager_bak {
device /dev/drbd0;
disk /dev/sda3;
address 192.168.0.2:7788;
meta-disk internal;
}
on manager {
device /dev/drbd0;
disk /dev/sdc;
address 192.168.0.1:7788;
meta-disk internal;
}
}
在啟動DRBD之前,需要建立供DRBD記錄資訊的資料區塊.分別在兩台主機上執行:
[root@manager ha.d]# drbdadm create-md r0
[root@manager ha.d]#mknod /dev/drbd0 b 147 0
[root@manager ha.d]# /etc/init.d/drbd srart
現在兩台主機都是備機狀態,都是”不一致”狀態,這是由於DRBD無法判斷哪一方為主機,以哪一方的磁碟資料作為標準資料。所以我們需要初始化,在manager上執行:
[root@manager /]#drbdsetup /dev/drbd0 primary –o
現在資料開始同步,可以用cat /proc/drbd查看資料同步的進度
等資料同步完查看DRBD的狀態
[root@manager /]# cat /proc/drbd
version: 8.2.1 (api:86/proto:86-87)
GIT-hash: 318925802fc2638479ad090b73d7af45503dd184 build by root@manager, 2007-12-05 16:40:14
0: cs:Connected st Primary/Secondary ds:UpToDate/UpToDate C r---
ns:1514 nr:1110 dw:2616 dr:2259 al:0 bm:482 lo:0 pe:0 ua:0 ap:0
resync: used:0/31 hits:2 misses:2 starving:0 dirty:0 changed:2
act_log: used:0/257 hits:202 misses:0 starving:0 dirty:0 changed:0
磁碟狀態都是”即時”,表示資料同步完成了。
[root@manager /]# mkfs.xfs /dev/drbd0
現在可以把manager上的DRBD裝置掛載到/export目錄上進行使用。備機的DRBD裝置無法被掛載,因為它是用來接收主機資料的,由DRBD負責操作。
[root@manager /]# mount /dev/drbd0 /export
[root@manager /]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 10229696 3019636 7210060 30% /
/dev/drbd0 104806400 3046752 101759648 3% /export
現在把之前備份的/export中的所有內容再恢複回去。
如果不使用heartbeat的情況下,DRBD只能手工切換主從關係
現在修改heartbeat的設定檔,使DRBD可以通過heartbeat自動切換
[root@manager /]# vi /etc/ha.d/haresources
manager 192.168.0.3 drbddisk::r0 Filesystem::/dev/drbd0::/export::xfs dhcpd xinetd portmap nfs
注釋:上面那行
manager 定義manager為heartbeat的主機
192.168.0.3 定義對外服務的IP地址,這個IP自動在主從機之間切換
drbddisk::r0 定義使用的drbd資源
Filesystem::/dev/drbd0::/export::xfs 定義掛載檔案系統
dhcpd xinetd portmap nfs 定義其他需要切換的服務(用空格隔開)
現在我們可以測試一下了
(dhcpd portmap nfs等需要切換的服務,應該先在兩台伺服器上都配置好)
[root@manager root]# chkconfig –list
確定heartbeat和DRBD開機自啟動
確定需要由heartbeat切換的服務,開機不自啟動(由heartbeat來啟用相關的服務)
給gg1接通電源,通過pxe啟動系統(gg1是一組伺服器中的一台,是一台無盤伺服器,啟動後掛載在manager上儲存的系統)
在manager上ssh gg1
[root@manager root]# ssh gg1
-bash-2.05b#
-bash-2.05b# arp -a
? (192.168.0.3) at 00:19:B9:E4:7D:22 [ether] on eth0
-bash-2.05b# ls
-bash-2.05b# touch test
-bash-2.05b# ls
test
現在在manager上關機或停止heartbeat服務
[root@manager root]# /etc/init.d/heartbeat stop
Stopping High-Availability services: [ OK ]
到manager_bak上ifconfig
[root@manager_bak root]# ifconfig
可以看到eth1:0起來了,IP地址是192.168.0.3
[root@manager_bak root]# ssh gg1
-bash-2.05b#
-bash-2.05b# arp -a
? (192.168.0.3) at 00:19:B9:E5:3B:FC [ether] on eth0 (可以看到192.168.0.3的mac地址變了)
-bash-2.05b# ls
test
可以看到在manager上ssh上gg1後建立的test檔案
-bash-2.05b# echo "this is test" > test
-bash-2.05b# cat test
this is test
可以看到現在gg1可以正常讀寫manager_bak上nfs出來的磁碟
現在把manager上的heartbeat服務啟動起來
[root@manager root]# /etc/init.d/heartbeat start
Starting High-Availability services:
2007/12/06_12:46:08 INFO: Resource is stopped [ OK ]
-bash-2.05b# cat test
this is test
現在終於大功告成了,之前在不使用drbd的情況下,heartbeat也可以切換apache、dhcpd、portmap、nfs等等服務,但是 nfs服務切換後,必須重新mount一下nfs共用出來的目錄,否則會報 Stale NFS file handle 的錯誤。現在heartbeat+drbd配合使用後,nfs等等服務可以無縫切換,不必再重新mount一下nfs目錄了