解决高可用服务器只针对物理服务器的问题
默认情况下 Keepalived软件仅仅在对方机器宕机或 Keepalived停掉的时候才会接管业务。但在实际工作中,有业务服务停止而Keepalived服务还在工作的情况,这就会导致用户访问的VIP无法找到对应的服务,那么,如何解决业务服务宕机可以将IP漂移到备节点使之接管提供服务呢?
第一个方法:可以写守护进程脚本来处理。当 Nginx业务有问题时,就停掉本地的Keepalived服务,实现P漂移到对端继续提供服务。实际工作中部署及开发的示例脚本如下:
[root@lb01 shell]# cat check_nginx.sh #!/bin/bash #Author:Mr.Ding #Created Time:2018-10-05 15:51:54 #Name:check_nginx.sh #Description: while true do if [ `netstat -lntup|grep nginx|wc -l` -ne 1 ];then systemctl stop keepalived.service fi sleep 5 done
此脚本的思路是若没有80端口存在,就停掉keepalived服务实现释放本地VIP。在后台执行上述脚本检查,也可加入计划任务中。
[root@lb01 shell]# sh check_nginx.sh & [1] 1428 [root@lb01 shell]# ps -ef |grep check |grep -v grep root 1428 1320 0 15:56 pts/0 00:00:00 sh check_nginx.sh
停掉nginx服务,看IP是否发生切换
[root@lb01 shell]# systemctl stop nginx.service [root@lb01 shell]# netstat -lntup|grep nginx [root@lb01 shell]# ip add|grep 192.168.200.16 查看备节点是否已接管 [root@lb02 ~]# ip add|grep 192.168.200.16 inet 192.168.200.16/24 scope global secondary ens33
第二个方法:可以使用keepalived的配置文件参数触发写好的服务检测脚本。
[root@lb01 shell]# cat chk_nginx_proxy.sh #!/bin/bash #Author:Mr.Ding #Created Time:2018-10-05 16:09:27 #Name:chk_nginx_proxy.sh #Description: if [ `netstat -lntup|grep nginx|wc -l` -ne 1 ];then systemctl stop keepalived.service fi [root@lb01 shell]# chmod +x chk_nginx_proxy.sh [root@lb01 shell]# ls -l chk_nginx_proxy.sh -rwxr-xr-x 1 root root 192 10月 5 16:10 chk_nginx_proxy.sh
在keepalived.conf文件中配置如下:
[root@lb01 shell]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id lb01 } vrrp_script chk_nginx_proxy { #定义vrrp脚本,检测http端口 script "/server/scripts/shell/chk_nginx_proxy.sh" #执行脚本,当nginx服务有问题,就停掉keepalived服务 interval 2 #间隔2秒 weight 2 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 55 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.200.16/24 dev ens33 lable ens33:1 } track_script { chk_nginx_proxy #触发检查 } }
测试接管结果
[root@lb01 shell]# systemctl stop nginx [root@lb01 shell]# ip add|grep 192.168.200.16 在备服务器上查看接管结果 [root@lb02 ~]# ip add|grep 192.168.200.16 inet 192.168.200.16/24 scope global secondary ens33
当停掉nginx的时候,keepalived会在2秒钟内自动停掉,VIP被释放,由备用端接管,这样就实现了即服务宕机也会进行IP漂移,业务切换。
******************************我也想难过的时候到海边走走,可是我的城市没有海。******************************