所有节点的haresources文件相同,内容如下:
[root@node1 ~]# cat /usr/local/heartbeat/etc/ha.d/haresourcesnode1 IPaddr::172.16.1.101/24/ens32 drbddisk::mysql Filesystem::/dev/drbd0::/mnt::xfs mysqlnode1:主节点的主机名 。
IPaddr::172.16.1.101/24/ens32:用IPaddr脚本配置对外服务的浮动虚拟IP 。
drbddisk::mysql:用drbddisk脚本实现DRBD主从节点资源组的挂载和卸载 。该脚本文件为heartbeat自带,缺省安装在/etc/ha.d/resource.d/drbddisk 。
Filesystem::/dev/drbd0::/mnt::xfs:用Filesystem脚本实现磁盘挂载和卸载 。
mysql:MySQL启动脚本 。
(4)建立插件软连接
在两个节点执行以下命令:
cd /usr/local/heartbeat/etc/ha.dchmod 600 authkeysln -svf /usr/local/heartbeat/lib64/heartbeat/plugins/RAExec/* /usr/local/heartbeat/lib/heartbeat/plugins/RAExec/ln -svf /usr/local/heartbeat/lib64/heartbeat/plugins/* /usr/local/heartbeat/lib/heartbeat/plugins/(5)创建脚本文件
在两个节点的heartbeat资源目录下创建脚本文件:
创建drbddisk文件:
cp /etc/ha.d/resource.d/drbddisk /usr/local/heartbeat/etc/ha.d/resource.d/创建mysql文件,内容如下:
[root@node1 ~]# more /usr/local/heartbeat/etc/ha.d/resource.d/mysql chown -R mysql:mysql /mnt/service mysql start创建MySQL服务检测脚本文件,内容如下:
[root@node1 ~]# more /home/mysql/mysql_check.sh #!/bin/bash. /home/mysql/.bashrccount=1while truedomysql -uroot -p123456 -S /data/mysql.sock -e "show status;" > /dev/ 2>&1i=$?ps aux | grep mysqld | grep -v grep > /dev/ 2>&1j=$?if [ $i = 0 ] && [ $j = 0 ]thensleep 3elseif [ $i = 1 ] && [ $j = 0 ]thensleep 3elseif [ $count -gt 5 ]thenbreakfilet count++continuefifidone/etc/init.d/heartbeat stop(6)启动heartbeat
在两个节点上启动HeartBeat服务,先启动node1,再启动node2 。
systemctl start heartbeatsystemctl enable heartbeatsystemctl status heartbeat如下所示,此时VIP绑定在node1上:

文章插图
客户端通过VIP可以正常访问MySQL:
C:Userswxy>mysql -h172.16.1.101 -uroot -p123456 -e "select * from db1.t1"mysql: [Warning] Using a password on the command line interface can be insecure.+------+| a |+------+| 1 |+------+当启动heartbeat时同时启动ipfail来检测心跳,hacluster为启动heartbeat时的用户,也就是说ipfail和heartbeat都是用hacluster这个用户来运行 。heartbeat和ipfail进程如下所示:
文章插图
2. 测试
(1)停掉node1上的mysqld,查看服务是否切换到node2
# 首先启动mysql检测脚本,因为heartheat不检查服务的可用性,需要通过自定义脚本实现nohup /home/mysql/mysql_check.sh &# 停止mysqldservice mysql stopnode1的heartbeat进程停止,VIP和DRBD都切换到node2,客户端可以正常访问MySQL,自动切换成功 。(2)停掉node2的heartheat,查看服务是否切换回node1
# 先启动node1的heartheatsystemctl start heartbeat# 停止node2的heartheat,也可以使用 iptables -I INPUT -p icmp -j DROP 禁用 pingsystemctl stop heartbeatnode2的heartbeat进程停止,VIP和DRBD都切换回node1,客户端可以正常访问MySQL,自动切换成功 。(3)node1重启,查看服务是否切换到node2
# 先启动node2的heartheatsystemctl start heartbeat# node1重启rebootVIP和DRBD都切换到node2,客户端可以正常访问MySQL,自动切换成功 。(4)测试脑裂
# 停止node1的heartbeat服务systemctl stop heartbeat# 停止node2的heartbeat服务systemctl stop heartbeat# 在node1上添加防火墙策略,拒绝node2的广播包iptables -A INPUT -i ens32 -p udp -s 172.16.1.126 --dport 694 -j DROP# 在node2上添加防火墙策略,拒绝node1的广播包iptables -A INPUT -i ens32 -p udp -s 172.16.1.125 --dport 694 -j DROP# 启动node1的heartbeat服务systemctl start heartbeat# 启动node2的heartbeat服务systemctl start heartbeat在超过initdead定义的时间后,两个节点都绑定了同一个VIP,都挂载了DRDB盘,都启动了MySQL服务,都可以进行MySQL的读写 。它们之间各自为政,不知道对方的存在,出现的脑裂 。由于两节点之间在指定的时间内,无法互相检测到对方心跳而各自启动故障转移功能,取得了资源以及服务的所有权,此时的两节点都还活着并作正常运行,这样会导致资源冲突,最严重的就是两台主机同时占用一个VIP的地址,当用户写入数据的时候可能会分别写入到两端,这样可能会导致两节点数据不一致或造成数据丢失,这种情况被称为裂脑 。
推荐阅读
- mysql入门级,20分钟搞定
- like,%,_ Mysql 使用通配符进行模糊查询
- 允许远程连接MySQL数据库教程
- VPC是什么,VPC能做什么,VPC详解
- 音频压缩编码的基本原理详解
- PING命令详解,端到端的延时测试工具
- MySQL 导出数据 导入数据
- 如何提高思维逻辑深度?深度详解提高个人的能力,提高职场竞争力
- 航线、航班号、航空公司 一文读懂航空
- 每秒570000的写入,MySQL如何实现?
