0%

Keepalived 配置 Nginx 高可用

Keepalived 配置 Nginx 高可用


前言

通过Keepalived服务vip漂移的方式配置Nginx的高可用;当vip所在节点的Nginx服务宕掉后,会将vip漂移到另外一个节点。而在配置Nginx的配置时,分别在两个节点配置Nginx服务,然后两个Nginx服务配置相同的负载均衡等配置;在配置连接时不使用两个Nginx节点的ip,而是使用vip; 以这样的方式实现Nginx的高可用

Nginx 安装

在两个节点同时安装Nginx, 此处展示一个节点

默认情况Centos7中无Nginx的源,yum 安装方式参考自宋兴柱-Sindrol 的[CentOS7中使用yum安装Nginx的方法

Nginx官网提供了Centos的源地址。因此可以如下执行命令添加源

1
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

安装Nginx

通过yum search nginx看看是否已经添加源成功。如果成功则执行yum -y install nginx命令安装 Nginx

此处修改端口为8089,默认端口为80、配置文件默认在/etc/nginx/conf.d/default.conf

为什么是修改default.conf文件呢?从/etc/nginx/nginx.conf看到是指向了``/etc/nginx/conf.d`目录下

启动Nginx并设置开机自动运行

1
2
3
systemctl start nginx
systemctl enable nginx
systemctl status nginx

启动成功

安装 Keepalived

两个节点都安装 yum -y install keepalived

添加到开机自启动

1
systemctl enable keepalived

配置 HA

两个节点同时配置

编辑脚本/etc/keepalived/nginx_check.sh,脚本内容如下(nginx _check.sh)

1
2
3
4
5
6
#!/bin/bash
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ]; then
echo `date`': nginx is not healthy, try to killall keepalived' >> /etc/keepalived/keepalived.log
killall keepalived
fi

增加执行权限

1
chmod +x /etc/keepalived/nginx_check.sh

修改配置文件/etc/keepalived/keepalived.conf

master 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
! Configuration File for keepalived

global_defs {
}

vrrp_script check_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2 # 每2秒检测一次nginx的运行状态
}

vrrp_instance VI_1 {
state MASTER # 状态,主节点为MASTER,备份节点为BACKUP
interface ens33 # 绑定VIP的网络接口,通过ifconfig查看自己的网络接口
virtual_router_id 51 # 虚拟路由的ID号,两个节点设置必须一样,可选IP最后一段使用,相同的VRID为一个组,他将决定多播的MAC地址
priority 120 # 节点优先级,值范围0~254,MASTER要比BACKUP高,最好高51以上
advert_int 1 # 组播信息发送时间间隔,两个节点必须设置一样,默认为1秒
# 设置验证信息,两个节点必须一致
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟IP,两个节点设置必须一样。可以设置多个,一行写一个
virtual_ipaddress {
192.168.1.225
}

track_script {
check_nginx # nginx存活状态检测脚本
}
}

slave 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
! Configuration File for keepalived

global_defs {
}

vrrp_script check_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
}

vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.225
}

track_script {
check_nginx
}
}

启动Keepalived服务 systemctl start keepalived

vip已绑定成功

验证高可用

不管是keepalived宕机还是nginx宕机

都会切换到BACKUP节点上

非抢占模式

keepalived的HA分为抢占模式和非抢占模式,抢占模式即MASTER从故障中恢复后,会将VIP从BACKUP节点中抢占过来。非抢占模式即MASTER恢复后不抢占BACKUP升级为MASTER后的VIP。

之前的配置都是抢占模式的,如果想配置非抢占模式只改了两个地方:
1> 在vrrp_instance块下两个节点各增加了nopreempt指令,表示不争抢vip
2> 节点的state都为BACKUP

两个keepalived节点都启动后,默认都是BACKUP状态,双方在发送组播信息后,会根据优先级来选举一个MASTER出来。由于两者都配置了nopreempt,所以MASTER从故障中恢复后,不会抢占vip。这样会避免VIP切换可能造成的服务延迟。


参考链接