一、环境准备
两台装有 nginx 的 CentOS 虚拟机。

bash
[root@nginx1 ~]# echo "192.168.40.81 say Hello" > /usr/local/nginx/html/index.html
[root@nginx2 ~]# echo "192.168.40.82 say Hello" > /usr/local/nginx/html/index.html
二、原理

Keepalived 为我们后端服务器组虚拟出一组 VIP,该 VIP 只能由优先级最高的一台服务器持有。客户端访问,就只访问 VIP。

当主服务器挂掉之后,Keepalived 自动帮我们把 VIP 漂移到 BACKUP 服务器。以此来保证服务的高可用。
Keepalived 通过检测服务器上的 Keepalived 进程的存活状态,来判断服务器是否存活。
三、安装
1)安装 keepalived
bash
# 在 nginx1 安装 keepalived
[root@nginx1 ~]# yum install -y keepalived
# 在 nginx2 安装 keepalived
[root@nginx2 ~]# yum install -y keepalived
2)配置
使用 yum 安装后配置文件在 /etc/keepalived/keepalived.conf
bash
# 备份 nginx1 keepalived 配置文件
[root@nginx1 keepalived]# cp keepalived.conf keepalived.conf.bak
# 备份 nginx2 keepalived 配置文件
[root@nginx2 keepalived]# cp keepalived.conf keepalived.conf.bak
- nginx1 上 keepalived.conf:
javascript
! Configuration File for keepalived
global_defs {
router_id lb1
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.40.80
}
}
- global_defs:全局配置标识。
- router_id:路由器标识,一般不用改,也可以写成每个主机自己的主机名。
- vrrp_instance:一个 vrrp_instance 就是定义一个虚拟路由器的,VI_1 是实例名称。
- state:指定 keepalived 的角色,MASTER 表示此主机是主服务器,BACKUP 表示此主机是备服务器。
- interface:指定检测网络的网卡接口。就比如下图的 ens33。
- virtual_router_id:虚拟路由标识,数字形式,同一个 VRRP 实例使用唯一的标识,即在同一个 vrrp_instance下,master 和 backup 必须一致。
- priority:节点优先级,数字越大表示节点的优先级越高,在一个 VRRP 实例下,MASTER 的优先级必须要比 BACKUP 高,不然就会切换角色。
- advert_int:用于设定 MASTER 与 BACKUP 之间同步检查的时间间隔,单位为秒。
- auth_type:预共享密钥认证,同一个虚拟路由器的 keepalived 节点必须一样。
- auth_pass:设置密钥。
- virtual_ipaddress:设置虚拟IP地址,可以设置多种形式:
- 10.0.0.100 不指定网卡,默认为 eth0,注意:不指定/prefix,默认为/32;
- 10.0.0.101/24 dev eth1 指定 VIP 的网卡;
- 10.0.0.102/24 dev eth2 label eth2:1 指定 VIP 的网卡 label。
- nginx2 上 keepalived.conf:
javascript
! Configuration File for keepalived
global_defs {
router_id lb2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.40.80
}
}
3)启动
bash
# 启动 MASTER 服务器 keepalived 并设置为开机自启动
[root@nginx1 keepalived]# systemctl enable keepalived --now
[root@nginx1 keepalived]# systemctl status keepalived
[root@nginx1 keepalived]# ip a

会发现 MASTER 服务器多出了 192.168.40.80 这个IP。
bash
# 启动 BACKUP 服务器 keepalived 并设置为开机自启动
[root@nginx2 keepalived]# systemctl enable keepalived --now
[root@nginx2 keepalived]# systemctl status keepalived
[root@nginx2 keepalived]# ip a

备份服务器并不持有 VIP。
4)访问
此时访问 VIP,请求都是被打到 MASTER 上的 nginx。
5)故障测试
bash
# 停掉 MASTER
[root@nginx1 ~]# init 0


此时 VIP 飘移到 BACKUP。
6)重启 MASTER
此时 VIP 又漂移回来了。

四、定制脚本
Keepalived 通过检测服务器上的 Keepalived 进程的存活状态,来判断服务器是否存活。
但如果此时,我们的服务器没有挂,但是我们希望 Keepalived 保活的服务(比如 nginx)挂了,由于 Keepalived 进程没有挂,这个时候,Keepalived 是不会帮我们主备切换的。
bash
# 停掉 MASTER
[root@nginx1 ~]# systemctl stop nginx

这个时候 VIP 并没有迁移走。这个时候,我们就得自己写一个脚本,去检测 nginx 存活状态,如果 nginx 挂了,人为杀死 keepalived 进程,让 keepalived 帮我们主备切换。
先重新启动 nginx
bash[root@nginx1 ~]# systemctl start nginx
1)修改 keepalived.conf
- nginx1 上 keepalived.onf:
bash
! Configuration File for keepalived
global_defs {
router_id lb1
}
vrrp_script check_nginx {
script "pgrep nginx"
interval 2
weight 50 # 当检查失败时,优先级会减去这个值
fall 2
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.40.80
}
track_script {
check_nginx
}
}
- nginx2 上 keepalived.conf:
bash
! Configuration File for keepalived
global_defs {
router_id lb2
}
vrrp_script check_nginx {
script "pgrep nginx"
interval 2
weight 50 # 当检查失败时,优先级会减去这个值
fall 2
rise 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.40.80
}
track_script {
check_nginx
}
}
2)重启 keepalived
bash
[root@nginx1 keepalived]# sudo systemctl restart keepalived
[root@nginx2 keepalived]# sudo systemctl restart keepalived
3)停掉 MASTER
bash
# 停掉 MASTER
[root@nginx1 ~]# systemctl stop nginx


VIP 这次终于被迁移到 BACKUP。
五、应用场景
Keepalived + Nginx 的组合有很多应用场景:
- 搭建 Nacos 高可用集群
- 搭建 K8S Ingress 入口