keepalived+nginx 高可用

一、背景:

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、环境说明:

keepalived+nginx 高可用

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已绑定成功:
keepalived+nginx 高可用

  • backup主机日志如下,显示未绑定VIP:
    keepalived+nginx 高可用

2、在master主机上停掉nginx,备机接管、抢占VIP:

[root@node1 ~]# systemctl stop nginx

192.168.10.134 master 日志,priority 从100降为80,状态变成backup:
keepalived+nginx 高可用
192.168.10.135 备机抢占VIP,切换为master:
keepalived+nginx 高可用

3、在192.168.10.134主机启动恢复nginx,再次抢占VIP:

192.168.10.134 master 日志,priority 从80升到100,状态变成master:
keepalived+nginx 高可用
192.168.10.135 priority是90,故又切回了backup状态:
keepalived+nginx 高可用
再次绑定VIP:
keepalived+nginx 高可用

上一篇:iOS之Core Data及其线程安全


下一篇:[蓝桥杯][算法提高VIP]递推求值