keepalived 实现nginx 负载均衡+主备高可用
概述
nginx作为负载均衡器,所有请求都到nginx,可见nginx处于非常重点的位置,如果nginx服务器宕机,后端web服务将无法提供服务,影响严重。
所以在架构设计中,可以利用nginx的反向代理和负载均衡实现后端应用的负载均衡和高可用性,同时我们还需要考虑Nginx的单点故障。真正做到架构高可用性。
主要考虑以下几点:
1、Nginx服务因为意外现象挂掉
2、服务器宕机导致nginx不可用
目前主流的解决方案就是keepalived+nginx 实现nginx的故障转移,同时做好监控报警。在自动故障转移的同时能通知到相关的应用负责人检查相关应用,排查隐患,彻底解决问题。
keepalived的HA分为抢占模式和非抢占模式,抢占模式即MASTER从故障中恢复后,会将VIP从BACKUP节点中抢占过来。非抢占模式即MASTER恢复后不抢占BACKUP升级为MASTER后的VIP。
使用阿里云epel镜像
两台虚拟机都安装
[root@nginx01 ~]# wget -O /etc/yum.repos.d/epel.repo /repo/epel-7.repo
[root@nginx01 ~]# yum -y install nginx
启动服务和开机自启
[root@nginx01 ~]# systemctl start nginx
[root@nginx01 ~]# systemctl enable nginx
安装keepalived
用刚才实验的俩台虚拟机,暂时不用安装,没有的话按之前安装下
修改keepalived.conf配置文件
nginx-01主机上的keepalived.conf文件的修改
[root@nginx01 ~]# vim /etc/keepalived/keepalived.conf
keepalived.conf配置文件完整内容如下所示:
! Configuration File for keepalivedglobal_defs {router_id nginx01}vrrp_script chk_nginx{script "/etc/keepalived/nginx_check.sh"interval 2weight -20}vrrp_instance nginx {state MASTERinterface ens33virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.10.100}track_script{chk_nginx}}
重启服务
[root@nginx01 ~]# systemctl restart nginx
把配置文件传给nginx02
[root@nginx01 ~]# scp /etc/keepalived/keepalived.conf 192.168.10.7:/etc/keepalived/
[root@nginx02 ~]#vim /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {router_id nginx02}vrrp_script chk_nginx{script "/etc/keepalived/nginx_check.sh"interval 2weight -20}vrrp_instance nginx {state MASTERinterface ens33virtual_router_id 51priority 99advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.10.100}track_script{chk_nginx}}
重启服务
[root@nginx02 ~]# systemctl restart nginx
创建nginx服务检测脚本
分别在nginx-01和nginx-02服务器的/etc/keepalived
目录下创建nginx_check.sh
脚本,并为其添加执行权限。用于keepalived定时检测nginx的服务状态,如果nginx停止了,会尝试重新启动nginx,如果启动失败,会将keepalived进程杀死,将vip漂移到备用机器上。
[root@nginx01~]# vim /etc/keepalived/nginx_check.sh
#!/bin/bashnum=$(ps -C nginx --no-header | wc -l)if [ $num -eq 0 ];thensystemctl start nginx #尝试重新启动nginxsleep 1 #睡眠1秒if [ $(ps -C nginx --no-header | wc -l) -eq 0 ];thenkillall keepalived #若nginx启动失败,将keepalived服务杀死。将vip漂移到其它备份节点fifi
说明:
ps -C nginx --no-header | wc -l一般用于shell脚步编写用
-C <指令名称> 选项用来指定程序的名称
--no-header选项去掉头部
killall命令由软件包psmisc提供,确保两台主机要安装psmisc
[root@nginx-01 ~]# chmod +x /etc/keepalived/nginx_check.sh
[root@nginx01 ~]# scp /etc/keepalived/nginx_check.sh 192.168.10.7:/etc/keepalived/
[root@nginx02~]#chmod +x /etc/keepalived/nginx_check.sh
查看进程
[root@nginx01]#ps -ef | grep keepalived
查看进程
[root@nginx02]#ps -ef | grep keepalived
看到如上进程信息,表示keepalived已经启动成功。下面用ip addr
命令查看vip绑定的情况,如下所示:
[root@nginx01 ~]# ip addr show dev ens33
[root@nginx02 ~]# ip addr show dev ens33
vip地址192.168.10.100绑定在nginx01的ens33网卡上。
测试
抢占模式
将nginx-01的keepalived服务和nginx服务停掉,查看vip是否漂移到nginx-02
[root@nginx01 ~]# systemctl stop keepalived
[root@nginx01 ~]# nginx -s stop
下面用ip addr
命令查看vip绑定的情况,如下所示:
[root@nginx01 ~]# ip addr show dev ens33
[root@nginx02 ~]# ip addr show dev ens33
从上面显示可以看出,vip已经成功从nginx-01漂移到了nginx-02。
将nginx-01的nginx服务和keepalived服务启动,查看抢占模式的效果。
[root@nginx01 ~]# nginx
[root@nginx01 ~]# systemctl start keepalived
[root@nginx01 ~]# ip addr show dev ens33
此时再将nginx-01的nginx服务和keepalived服务启动后,由于nginx-01是MASTER且优先级高,所以会将nginx-02的VIP抢占过来。从上面的显示结果可以看到,VIP又漂移到了nginx-01主机。
非抢占模式
和抢占模式的配置相比,只改了两个地方:
在vrrp_instance块下,两个节点各增加了nopreempt指令,表示不争抢vip。
两个节点的state都为BACKUP。
在非抢占模式下,两个keepalived节点都启动后,默认都是BACKUP状态,双方在发送组播信息后,会根据优先级来选举一个MASTER出来。由于两者都配置了nopreempt,所以MASTER从故障中恢复后,不会抢占vip。这样会避免VIP切换可能造成的服务延迟。
改nginx-01和nginx-02的keepalived.conf内容(标红色部分):
重启keepalived systemctl restart keepalived
[root@nginx01 ~]# ip addr show dev ens33
[root@nginx02 ~]# ip addr show dev ens33
停掉nginx01上服务后在查看
[root@nginx01 ~]# ip addr show dev ens33
[root@nginx02 ~]# ip addr show dev ens33
VIP地址漂移到了nginx-02上
再将nginx-01的keepalived服务启动,查看是否抢占VIP
[root@nginx01 ~]# ip addr show dev ens33
[root@nginx02 ~]# ip addr show dev ens33
VIP还在nginx02上面说明没抢占VIP