HeartBeat
HeartBeat 是 Linux-HA 的高可用性集群软件,它的主要作用是:
• 安装在 Load Balancer 和 Backup 上,运行于 active/standby 模式。
当 Load Balancer 失效时,Backup 自动激活,成为实际的 Load Balancer。
• 切换到 active 模式时,按顺序启动 Virtual IP、IPVS 和 Ldirectord。
切换到 standby 模式时,按顺序关闭 Ldirectord、IPVS 和 Virtual IP
实验环境: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