1、在生产应用中,某台“Nginx+PHP+MySQL”接口数据服务器,扮演的角色十分重要,如果服务器硬件或 Nginx、MySQL 发生故障,而短时间内无法恢复,后果将非常严重。为了避免单点故障,我设计了此套方案,编写了 failover.sh 脚本,实现了双机互备、全自动切换,故障转移时间只需几十秒。一、双机互备、全自动切换方案:1、拓扑图:2、解释:(1)、假设外网域名 解析到外网虚拟 IP 72.249.146.214 上,内网 hosts 设置 db10 对应内网虚拟 IP 192.168.146.214(2)、默认情况下,由主机绑定内、外网虚拟 IP,备机作为备份,当主机的 MySQ
2、L、Nginx 或服务器出现故障无法访问时,备机会自动接管内、外网虚拟 IP。两台服务器都启动负责监控、自动切换虚拟 IP的守护进程/usr/bin/nohup /bin/sh /usr/local/webserver/failover/failover.sh 2 grep “Master_Host“ awk -F : printf $2)#如果内网 VIP=主机内网 IP(主机 MySQL 中的 Master_Host 显示的是备机的域名或 IP),且本机为主机if “$eth0_active_server“ = “$rip_eth0_slave“ grep “Seconds_Behind_
3、Master: 0“ /dev/null 2&1)then#如果主机能够访问,数据库同步无延迟,且本机就是主机,那么由本机绑定虚拟 IPif “$type“ = “master“ then#如果本机为主机function_bind_vipfunction_vip_arpingecho “$date 主机已绑定虚拟 IP!(Type:1)“ $logfileelse#如果本机为备机function_remove_vipecho “$date 备机已去除虚拟 IP!(Type:2)“ $logfilefielseif “$type“ = “slave“ then#如果本机为备机function_r
4、sync_slave_to_master function_vip_arpingfi fifielse#虚拟 IP 无法访问时,判断主机能否访问if (curl -m 30 -G http:/$rip_eth1_master/ /dev/null 2&1) & ($mysql_bin -u“$mysql_username“ -p“$mysql_password“ -P“$mysql_port“ -h“$rip_eth0_master“ -e“show slave statusG“ /dev/null 2&1)then#如果主机能够访问,且本机就是主机,那么由本机绑定虚拟 IPif “$type
5、“ = “master“ thenfunction_bind_vipfunction_vip_arpingecho “$date 主机已绑定虚拟 IP!(Type:3)“ $logfileelsefunction_remove_vipecho “$date 备机已去除虚拟 IP!(Type:4)“ $logfilefielif (curl -m 30 -G http:/$rip_eth1_slave/ /dev/null 2&1) & ($mysql_bin -u“$mysql_username“ -p“$mysql_password“ -P“$mysql_port“ -h“$rip_eth0
6、_slave“ -e“show slave statusG“ /dev/null 2&1)then#如果主机不能访问而备机能够访问,且本机就是备机,那么由备机绑定虚拟 IPif “$type“ = “slave“ thenfunction_bind_vipfunction_vip_arpingecho “$date 备机已绑定虚拟 IP!(Type:5)“ $logfileelsefunction_remove_vipecho “$date 主机已去除虚拟 IP!(Type:6)“ $logfilefielseecho “$date 主机、备机全部无法访问!(Type:7)“ $logfilefifi#每次循环暂停 20 秒(即间隔 20 秒检测一次)sleep 20done