在架构设计中,可以利用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 keepalived
global_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地址
}
}
}
启动服务后观察网卡信息
3、keepalived备(10.57.31.205)
# Configuration File for keepalived
global_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
}
}
}
启动服务后观察网卡信息
故障转移
引起keepalived vip漂移的几个常见因素
1、服务器宕机
2、监听网卡故障
3、某一服务或者其他事件触发 可以用脚本监听服务端口 服务 进程等
测试一:将主服务器宕机
测试步骤、
1、ping VIP
2、将主keepalived服务器宕机
3、观察ping情况和VIP飘移情况 同时坚持web服务
结果:
ping出现过丢包
2 VIP转移
VIP漂移成功,服务能正常访问 恢复主机后 接管备机的VIP
测试二、停止主节点的网络服务
备节点
出现脑裂情况找不到VIP
测试三 测试nginx服务不能正常工作时VIP漂移
#!/bin/bash
#检查nginx的pid文件是否存在 不存在时 killall keepalivedVIP漂移
NGINXPID="/usr/install/nginx/logs/nginx.pid"
if [ ! -f $NGINXPID ];then
killall keepalived
fi
配置文件已经在上面的模块中再不描述。
测试过程中遇到的问题:
1、virtual_router_id 配置为51 的时候漂移有问题 还是防火墙的问题,
2、漂移过程中 防火墙意外开启 导致网络无法访问
经过对比线上同事配置的环境和查阅资料,发现是一个默认参数的问题
vrrp_strict 是默认开启 严格执行VRRP协议 导致主机和备机间防火墙问题。
线上可以参考的配置:
! Configuration File for keepalived
vrrp_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
}
}
}
转载于:https://blog.51cto.com/dreamlinux/2154816