一、背景:
nginx可实现应用的负载均衡、反向代理,但当nginx服务或服务器不可用时,后端应用也将无法访问,为解决nginx的单点故障问题,故引入VIP、keepalived,真正实现应用架构的高可用
二、基本原理
引入的VIP即虚拟ip,不是nginx服务器的真实IP,而是一个虚拟的“漂移的”IP,为实现nginx服务的高可用,nginx将存在多台服务器(>=2),每台对应的后端应用服务器集群的配置应保持一致,为保障nginx能7*24的提供负载均衡或反向代理的服务,在多台nginx服务器中选择1台进行服务,那么怎么选择这台呢?这就是VIP的意义,根据keepalived中配置的规则(优先级排序),priority最高的那个将绑定VIP,成为mater,其余主机成为BACKUP,master将一直发送组播信息,而当master挂或者由于priority降低将导致它推出master的角色,backup收不到组播信息后就认为master已挂,这时他们之间会进行抢占、选举,再根据priority选出master。
三、配置实现
1、环境说明:
2、master 配置
192.168.10.134 安装nginx、keepalived
yum install keepalived
修改keepalived配置文件:
[root@node1 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id node1 #标识本节点的名称,通常为hostname
}
vrrp_script chk_nginx {
script "/data/sh/check_nginx.sh" #定义检查脚本
interval 2 #每2s检查一次
weight -20 #若脚本执行失败则将priority-20
}
vrrp_instance VI_1 { #定义第一个示例
state MASTER #标识角色为master
interface ens33 #定义接口名称、即本机的网卡名称、通过 ifconfig得到
virtual_router_id 51 #定义房间号,主备必须保持一致
priority 100 #定义本机的优先级,master要比backup高
advert_int 1 #组播信息发送时间间隔,两个节点必须设置一样,默认为1秒
# 设置验证信息,两个节点必须一致
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.16 #设置VIP
}
track_script { #设置nginx的检查脚本,必须在vrrp_script中有定义
chk_nginx
}
}
检查脚本的内容:
[root@node1 ~]# cat /data/sh/check_nginx.sh
#!/bin/sh
killall -0 nginx &>/dev/null
if [[ $? -ne 0 ]];then
exit 1
fi
- 授予脚本执行权限 chmod +x /data/sh/check_nginx.sh
3、backup 主机 配置
192.168.10.135 主机:
- 安装keepalived
yum install keepalived - 修改keepalived的配置文件:
[root@node2 etc]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id node1
}
vrrp_script chk_nginx {
script "/data/sh/check_nginx.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP #标识本机是backup角色
interface ens33
virtual_router_id 51
priority 90 #优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.16
}
track_script {
chk_nginx
}
}
- 检查脚本与master一致;
- 授予脚本执行权限 chmod +x /data/sh/check_nginx.sh
四、测试:
1、主备均启动nginx、keepalived后,查看对应日志
- master日志如下,显示已绑定VIP:
[root@node1 init.d]# tail -f /var/log/keepalived.log
Apr 10 23:11:17 test_kubeadm_web Keepalived_vrrp[22117]: Sending gratuitous ARP on ens33 for 192.168.200.16
Apr 10 23:11:17 test_kubeadm_web Keepalived_vrrp[22117]: Sending gratuitous ARP on ens33 for 192.168.200.16
Apr 10 23:11:17 test_kubeadm_web Keepalived_vrrp[22117]: Sending gratuitous ARP on ens33 for 192.168.200.16
Apr 10 23:11:17 test_kubeadm_web Keepalived_vrrp[22117]: Sending gratuitous ARP on ens33 for 192.168.200.16
查看vip已绑定成功:
- backup主机日志如下,显示未绑定VIP:
2、在master主机上停掉nginx,备机接管、抢占VIP:
[root@node1 ~]# systemctl stop nginx
192.168.10.134 master 日志,priority 从100降为80,状态变成backup:
192.168.10.135 备机抢占VIP,切换为master:
3、在192.168.10.134主机启动恢复nginx,再次抢占VIP:
192.168.10.134 master 日志,priority 从80升到100,状态变成master:
192.168.10.135 priority是90,故又切回了backup状态:
再次绑定VIP: