HeartBeat
HeartBeat 是 Linux-HA 的高可用性集羣軟件,它的主要做用是:
• 安裝在 Load Balancer 和 Backup 上,運行於 active/standby 模式。
當 Load Balancer 失效時,Backup 自動激活,成爲實際的 Load Balancer。
• 切換到 active 模式時,按順序啓動 Virtual IP、IPVS 和 Ldirectord。
切換到 standby 模式時,按順序關閉 Ldirectord、IPVS 和 Virtual IPnode
實驗環境:rhel6.5
virtual IP 172.25.254.100
load blancer 172.25.254.5 vm5.example.com
backup 172.25.254.6 vm6.example.com
服務的安裝與配置:
主備兩臺主機vm5 vm6 之間要有解析,作如下操做:
下載如下安裝包:
heartbeat-3.0.4-2.el6.x86_64.rpm
heartbeat-libs-3.0.4-2.el6.x86_64.rpm
heartbeat-devel-3.0.4-2.el6.x86_64.rpm
ldirectord-3.9.5-3.1.x86_64.rpm
# yum localinstall -y heartbeat-3.0.4-2.el6.x86_64.rpm heartbeat-devel-3.0.4-2.el6.x86_64.rpm heartbeat-libs-3.0.4-2.el6.x86_64.rpm ldirectord-3.9.5-3.1.x86_64.rpm
# yum install -y mysql-server #作的是數據庫服務器的熱備
# cp /usr/share/doc/heartbeat-3.0.4/authkeys /usr/share/doc/heartbeat-3.0.4/ha.cf /usr/share/doc/heartbeat-3.0.4/haresources /etc/ha.d/
# cd /etc/ha.d/
# vim ha.cf
#debugfile /var/log/ha-debug
調試日誌文件文件,取默認值
#logfile /var/log/ha-log
系統運行日誌文件,取默認值
logfacility local0
日誌等級,取默認值
keepalive 2
心跳頻率,本身設定。1:表示 1 秒;200ms:表示 200 毫秒
deadtime 30
節點死亡時間閥值,就是從節點在過了 30 後尚未收到心跳就認爲主節點死亡,本身設定
warntime 10
發出警告時間,本身設定
initdead 60
守護進程首次啓動後應該等待 120 秒後再啓動主服務器上的資源
#udpport 694
心跳信息傳遞的 udp 端口,使用端口 694 進行 bcast 和 ucast 通訊,取默認值
#baud 19200
串口波特率,與 serial 一塊兒使用。
#serial /dev/ttyS0
採用串口來傳遞心跳信息。
bcast eth0
採用 udp 廣播播來通知心跳
#ucast eth0 192.168.1.2
採用網卡 eth0 的 udp 單播來通知心跳,eth0 的 IP
#mcast eth0 225.0.0.1 694 1 0
採用 udp 多播播來通知心跳
auto_failback on
當主節點恢復後,是否自動切回
#stonith baytech /etc/ha.d/conf/stonith.baytech
stonith 用來保證共享存儲環境中的數據完整性
watchdog /dev/watchdog
watchdog 能讓系統在出現故障 1 分鐘後重啓該機器,這個功能能夠幫助服務器在確實中止心
跳後可以從新恢復心跳。 若是使用該特性,修改系統中/etc/modprobe.conf, 添加以下行
options softdog nowayout=0
這樣在系統啓動的時候,在內核中裝入"softdog"內核模塊,用來生成實際的設備文件
/dev/watchdog
node vm5.example.com
主節點名稱,與 uname –n 保持一致。排在第一的默認爲主節點,因此不要搞措順序
node vm6.example.com
副節點名稱,與 uname –n 保持一致
ping 172.25.254.252 ##不能使用集羣節點做爲ping節點
respawn hacluster /usr/lib64/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster
默認 heartbeat 並不檢測除自己以外的其餘任何服務,也不檢測網絡情況。
因此當網絡中斷時,並不會進行 Load Balancer 和 Backup 之間的切換。
能夠經過 ipfail 插件,設置'ping nodes'來解決這一問題,但不能使用一個集羣節點做爲
ping 的節點。
資源文件(/etc/ha.d/haresources):
# vim haresources
vm5.example.com IPaddr::172.25.254.100/24/eth0 mysqld
這個文件中定義了實現集羣所需的各個軟件的啓動腳本,這些腳本必須放在/etc/init.d 或者
/etc/ha.d/resource.d 目錄裏 IPaddr 的做用是啓動 Virutal IP,它是 HeartBeart 自帶的一個腳本;mysqld 是 mysql 服務的啓動腳本。
認證文件(/etc/ha.d/authkeys),文件的權限必須是 600:
# vim authkeys
auth 1
1 crc
#2 sha1 HI!
#3 md5 Hello!
實驗測試
兩臺主機都啓動heartbeat
vm5:
[root@vm5 ~]# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:a7:83:8f brd ff:ff:ff:ff:ff:ff
inet 172.25.254.5/24 brd 172.25.254.255 scope global eth0
inet 172.25.254.100/24 brd 172.25.254.255 scope global secondary eth0
inet6 fe80::5054:ff:fea7:838f/64 scope link
valid_lft forever preferred_lft forever
[root@vm5 ~]# /etc/init.d/mysqld status
mysqld (pid 2818) is running...
vm6:
[root@vm6 ~]# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:28:fb:8c brd ff:ff:ff:ff:ff:ff
inet 172.25.254.6/24 brd 172.25.254.255 scope global eth0
inet6 fe80::5054:ff:fe28:fb8c/64 scope link
valid_lft forever preferred_lft forever
比較看出vm5主機出現了Virtual IP 並且mysql服務已經自動起來了
[root@vm5 ~]# /etc/init.d/heartbeat stop
[root@vm5 ~]# ip addr show
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:a7:83:8f brd ff:ff:ff:ff:ff:ff
inet 172.25.254.5/24 brd 172.25.254.255 scope global eth0
inet6 fe80::5054:ff:fea7:838f/64 scope link
valid_lft forever preferred_lft forever
[root@vm6 ~]# ip addr show
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:28:fb:8c brd ff:ff:ff:ff:ff:ff
inet 172.25.254.6/24 brd 172.25.254.255 scope global eth0
inet 172.25.254.100/24 brd 172.25.254.255 scope global secondary eth0
inet6 fe80::5054:ff:fe28:fb8c/64 scope link
valid_lft forever preferred_lft forever
[root@vm ~]# /etc/init.d/mysqld status
mysqld (pid 3120) is running...
vm5關閉heartbeat,則vm6自動接管,VIP出如今vm6主機上
[root@vm5 ~]# /etc/init.d/heartbeat start
[root@vm5 ~]# ip addr show
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:a7:83:8f brd ff:ff:ff:ff:ff:ff
inet 172.25.254.5/24 brd 172.25.254.255 scope global eth0
inet 172.25.254.100/24 brd 172.25.254.255 scope global secondary eth0
inet6 fe80::5054:ff:fea7:838f/64 scope link
valid_lft forever preferred_lft forever
當vm5的heartbeat活過來後,主節點恢復,服務自動切回。
因爲vm5 vm6 所熱備的服務是mysql數據庫,而數據庫有寫的操做,因此須要數據同步。
解決方法採用drbd軟件 軟件下載:http://oss.linbit.com/drbd
下載drbd軟件包 drbd-8.4.4.tar.gz
主機:vm5 172.25.254.5 /dev/vda (附加磁盤)
vm6 172.25.254.6 /dev/vda (附加磁盤)
製做rpm包,安裝方便
# tar zxf drbd-8.4.4.tar.gz
# cd drbd-8.4.4
# yum install -y rpm-build kernel-devel flex gcc #解決軟件依賴性
# cp ~/drbd-8.4.4.tar.gz /root/rpmbuild/SOURCES/
# ./configure --with-km --enable-spec
# rpmbuild -bb drbd.spec #編譯生成 drbd rpm 包
...
Wrote: /root/rpmbuild/RPMS/x86_64/drbd-8.4.4-4.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/drbd-utils-8.4.4-4.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/drbd-xen-8.4.4-4.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/drbd-udev-8.4.4-4.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/drbd-pacemaker-8.4.4-4.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/drbd-heartbeat-8.4.4-4.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/drbd-bash-completion-8.4.4-4.el6.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.GCAk2C
...
# rpmbuild -bb drbd-km.spec #編譯 drbd 內核模塊
...
Wrote: /root/rpmbuild/RPMS/x86_64/drbd-km-2.6.32_431.el6.x86_64-8.4.4-4.el6.x86_64.rpm
...
# cd /root/rpmbuild/RPMS/x86_64/
# scp * 172.25.254.6:/root/ 拷貝生成的 rpm 包到另外一主機
# rpm -ivh drbd-*
# cd /etc/drbd.d/
# vim demo.res
resource mysqldata {
meta-disk internal;
device /dev/drbd1;
syncer {
verify-alg sha1;
}
on vm5.example.com {
disk /dev/vda;
address 172.25.254.5:7789;
}
on vm6.example.com {
disk /dev/vda;
address 172.25.254.6:7789;
}
}
# scp demo.res 172.25.254.6:/etc/drbd.d/
切換到vm6主機:
# rpm -ivh drbd-* #安裝drbd
在兩臺主機上分別執行如下命令:
# drbdadm create-md mysqldata
# /etc/init.d/drbd start
將 demo 設置爲 primary 節點,並同步數據:(在 demo 主機(vm5)執行如下命令)
# drbdsetup /dev/drbd1 primary --force
在兩臺主機上查看同步狀態:
# watch cat /proc/drbd
數據同步結束後建立文件系統:
# mkfs.ext4 /dev/drbd1
掛載文件系統:
# mount /dev/drbd1 /mnt/
存放數據:
[root@vm5 ~]# /etc/init.d/mysqld stop
[root@vm5 ~]# mv /var/lib/mysql/* /mnt/
[root@vm5 ~]# chown mysql.mysql /mnt/
卸載文件系統:
[root@vm5 ~]# umount /mnt
測試文件系統:
[root@vm5 ~]# mount /dev/drbd1 /var/lib/mysql/
[root@vm5 ~]# /etc/init.d/mysqld start
[root@vm5 ~]# mysql
...
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
[root@vm5 ~]# /etc/init.d/mysqld stop
[root@vm5 ~]# umount /var/lib/mysql/
將 demo (vm5)設置爲 secondary 節點:
drbdadm secondary mysqldata
將 remote 設置爲 primary 節點:(在 remote 主機(vm6)執行一下命令)
[root@vm6 ~]# drbdadm primary mysqldata
掛載文件系統,查看數據是否同步:
[root@vm6 ~]# mount /dev/drbd1 /var/lib/mysql/
[root@vm6 ~]# /etc/init.d/mysqld start
Starting mysqld: [ OK ]
[root@vm6 ~]# mysql
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
注意:兩臺主機上的/dev/drbd1 不能同時掛載,只有狀態爲 primary 時,才能被掛載使
用,而此時另外一方的狀態爲 secondary。
/dev/drbd1 存儲設備,讓集羣自動掛在到節點上去
[root@vm5 ha.d]# vim /etc/ha.d/haresources
vm5.example.com IPaddr::172.25.254.100/24/eth0 drbddisk::mysqldata Filesystem::/dev/drbd1::/var/lib/mysql::ext4 mysqld
[root@vm5 ha.d]# scp haresources 172.25.254.6:/etc/ha.d
mysql