在架构设计中,可以利用NGINX的反向代理和负载均衡实现后端应用的高可用性,同时我们还需要考虑Nginx的单点故障。真正做到架构高可用性。

主要考虑以下几点:

 1、Nginx服务因为意外现象挂掉

 2、服务器宕机导致NGINX不可用

 目前主流的解决方案就是keepalived+nginx 实现nginx的故障转移,同时做好监控报警。在自动故障转移的同时能通知到相关的应用负责人检查相关应用,排查隐患,彻底解决问题。

模拟环境:

序号 环境名称 IP地址 环境介绍
1 访问客户端1 10.57.3.29 mac  有Chrome等浏览器
2 nginx备+keepalived备 10.57.31.205 反向代理 nginx高可用备
3 nginx主+keepalived主 10.57.31.206 反向代理 nginx高可用主
4 web应用服务器 10.57.27.20 web应用
5 VIP 10.57.31.230

nginx服务和web应用是已经配置好的环境,这里就不介绍相关的配置。强烈建议关闭Firewalld和selinux服务 

1、keepalived的安装

yum install -y  keepalived

  2、keepalived主(10.57.31.206)

[root@linuxceph2 ~]# cat  /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs {   notification_email {     acassen@firewall.loc     failover@firewall.loc     sysadmin@firewall.loc   }   notification_email_from Alexandre.Cassen@firewall.loc   smtp_server 192.168.200.1   smtp_connect_timeout 30   router_id nginx02  # router_id  唯一标识符   vrrp_skip_check_adv_addr   vrrp_stricti   vrrp_garp_interval 0   vrrp_gna_interval 0}vrrp_script check_nginx {  	script "/etc/keepalived/nginx_check.sh"   #nginx服务检查脚本	interval 1	weight -2}vrrp_instance VI_1 {    state MASTER    interface eth0  #网卡      virtual_router_id 52  #默认为51  配置完发现主备切换有问题 更改为52 发现好了  原因未知    priority 150     #主备的优先级priority     advert_int 1     #检查时间1秒    authentication {        auth_type PASS        auth_pass 1111    }    track_script  {	check_nginx	}    virtual_ipaddress {        10.57.31.230/24    #vip地址     }}}

启动服务后观察网卡信息

image.png

3、keepalived备(10.57.31.205)

# Configuration File for keepalivedglobal_defs {   notification_email {     acassen@firewall.loc     failover@firewall.loc     sysadmin@firewall.loc   }   notification_email_from Alexandre.Cassen@firewall.loc   smtp_server 192.168.200.1   smtp_connect_timeout 30   router_id nginx01   vrrp_skip_check_adv_addr   vrrp_strict   vrrp_garp_interval 0   vrrp_gna_interval 0}vrrp_instance VI_1 {    state BACKUP    interface eth0    virtual_router_id 52    priority 50    advert_int 1    authentication {        auth_type PASS        auth_pass 1111    }    virtual_ipaddress {        10.57.31.230/24    }}}

启动服务后观察网卡信息

image.png

故障转移

引起keepalived vip漂移的几个常见因素

1、服务器宕机 

2、监听网卡故障  

3、某一服务或者其他事件触发 可以用脚本监听服务端口 服务 进程等

测试一:将主服务器宕机

  测试步骤、

    1、ping VIP 

   2、将主keepalived服务器宕机

   3、观察ping情况和VIP飘移情况 同时坚持web服务

   结果:

 ping出现过丢包

image.png

2 VIP转移

image.png

VIP漂移成功,服务能正常访问 恢复主机后 接管备机的VIP

image.png

测试二、停止主节点的网络服务

image.png

备节点

image.png

出现脑裂情况找不到VIP

测试三  测试nginx服务不能正常工作时VIP漂移

#!/bin/bash#检查nginx的pid文件是否存在 不存在时 killall  keepalivedVIP漂移NGINXPID="/usr/install/nginx/logs/nginx.pid"if  [ ! -f  $NGINXPID  ];then	killall keepalivedfi

配置文件已经在上面的模块中再不描述。

测试过程中遇到的问题:

1、virtual_router_id 配置为51 的时候漂移有问题 还是防火墙的问题,

2、漂移过程中 防火墙意外开启 导致网络无法访问 

image.png

经过对比线上同事配置的环境和查阅资料,发现是一个默认参数的问题

vrrp_strict 是默认开启  严格执行VRRP协议 导致主机和备机间防火墙问题。

image.png

线上可以参考的配置:

! Configuration File for keepalivedvrrp_instance ka_192_168_128_204 {    state BACKUP    interface eth0    virtual_router_id 204    priority 99    advert_int 1    authentication {        auth_type PASS        auth_pass 128204    }    virtual_ipaddress {        192.168.128.204/24 brd 192.168.128.255 dev eth0 label eth0:1    }}virtual_server 192.168.128.204 80 {    delay_loop 6    lb_algo wrr    lb_kind DR    nat_mask 255.255.255.0    persistence_timeout 50    protocol TCP    real_server 192.168.128.119 80 {        weight 3        TCP_CHECK {            connect_timeout 3            nb_get_retry 3            delay_before_retry 3        }    }    real_server 192.168.128.120 80 {        weight 3        TCP_CHECK {            connect_timeout 3            nb_get_retry 3            delay_before_retry 3        }    }    real_server 192.168.128.121 80 {        weight 3        TCP_CHECK {            connect_timeout 3            nb_get_retry 3            delay_before_retry 3        }    }    real_server 192.168.128.122 80 {       	 weight 3       	 TCP_CHECK {            connect_timeout 3            nb_get_retry 3            delay_before_retry 3        }    }}