双机热备:主机工作,备机备用,主机出现故障,自动切换到备机,由于用户访问的是vip,故不会感知到。
1.两台机器nginx-master,nginx-backup
2.在两台nginx服务期上分别安装keepalived
yum install -y keepalived
3.在nginx-master上修改keepalived.conf
cd /etc/keepalived vi keepalived.conf #保留下面的内容 ! Configuration File for keepalived global_defs { router_id nginx1 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 61 #注意,如果主机的优先级没有备机的大,则vip会绑定到优先级大的机器上,优先级相同时会先绑到主机上 priority 100 #主备之间同步检查的时间间隔,默认1s advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.26.102 } }
4.在nginx-backup上修改keepalived.conf
! Configuration File for keepalived global_defs { router_id nginx2 } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 61 priority 50 #主备之间同步检查的时间间隔,默认1s advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.26.102 } }
5.分别主机和备机的keepalived
systemctl start keepalived
6.用"ip addr"命令验证vip 192.168.26.102是否已绑到主机ens33网卡上
存在的问题:
keepalived只有在nginx-master这整个节点挂掉时才会自动切换到备用节点,如果只有主节点的ngixn挂掉了,keepalived是无法感知到的,这时候vip仍然绑定在master上,无法完成ip漂移,如果这时候客户访问vip的时候,会显示“无法访问此网站”,相当于服务整个就瘫痪了。
解决方案:
为了保证全天候的为用户提供不间断的服务,我们得让keepalived定时去检测nginx软件是否正常,如果nginx出现了问题,这时候,keepalived要尝试重启nginx,使得服务能够自动恢复到正常状态,如果说实在重启不了,那就切换到备用nginx服务器。
1.在nginx-master服务器上编写脚本,手动停止master上的nginx
#测试是否安装了killall命令,执行完若出来版本号则证明已安装 killall -V #若没出来版本号,显示无此命令,则先安装 yum install -y psmisc
cd /etc/keepalived vi check_nginx_status.sh #保存下面内容,注意,一个空格都不能错 #!/bin/sh A=`ps -C nginx --no-header |wc -l` if [ $A -eq 0 ];then /usr/local/nginx/sbin/nginx sleep 3 if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then killall keepalived fi fi #保存退出,并赋执行权限 chmod 775 check_nginx_status.sh #尝试着运行一下,不报错则说明脚本没问题 ./check_nginx_status.sh
2.进入nginx-master,在keepalived的配置文件中调用此脚本,重点加上紫色部分的代码
cd /etc/keepalived vi keepalived.conf #保存下面的配置 ! Configuration File for keepalived global_defs { router_id nginx1 } vrrp_script check_nginx_status { script "/etc/keepalived/check_nginx_status.sh" # 每隔2秒运行一下上一行脚本 interval 2 # 如果脚本运行成功,则升级权重+10 weight 10 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 61 priority 100 #主备之间同步检查的时间间隔,默认1s advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { #追踪nginx脚本 check_nginx_status } virtual_ipaddress { 192.168.26.102 } }
3.重启keepalived
systemctl restart keepalived
4.测试,若此时访问虚拟ip是通的,并且vip是绑定在master上的,则大功告成!
5.在backup节点上,重新执行1-4步骤即可。