操作环境说明
操作系统: Rocky Linux release 9.2
keepalive节点1 IP:172.30.87.181
keepalive节点2 IP:172.30.87.182
keepalive 虚拟VIP:172.30.87.183
nginx版本:nginx-1.20.1-20.el9.0.1.x86_64
keepalive版本:keepalived-2.2.8-3.el9.x86_64
环境准备
未特别说明,以下操作在2台主机上都要执行
1. 使用官方源安装keepalived和nginx
dnf -y install keepalived nginx
2. 启动nginx服务
systemctl start nginx
3. 测试访问nginx初始页面
curl -I 172.30.87.181
curl -I 172.30.87.182
返回 HTTP/1.1 200 OK 即可
4. 提前创建校验nginx程序存活脚本
校验脚本注意脚本执行完的退出码($?)
- 0:校验成功
- 不为0:校验失败
mkdir -p /opt/scripts/
cat << 'eof' > /opt/scripts/check_app.sh
#!/bin/bash
http_code=`curl -o /dev/null --connect-timeout 3 -s -w "%{http_code}" 127.0.0.1:80`
if [ $? -ne 0 ]; then
echo "curl failed"
exit 1
fi
if [ ! "$http_code" -eq 200 ]; then
echo "http_code is ${http_code} not 200"
exit 2
fi
exit 0
eof
chmod +x /opt/scripts/check_app.sh
5. 差异化nginx初始页面
在主节点(172.30.87.181)执行
echo 'node-1' > /usr/share/nginx/html/index.html
curl 172.30.87.181
# 返回 node-1
在从节点(172.30.87.182)执行
echo 'node-2' > /usr/share/nginx/html/index.html
curl 172.30.87.182
# 返回 node-2
方便后续通过观察返回值,判断实际请求到的节点。
配置及校验步骤
1. 使用 keepalived 抢占模式 preempt
即当高优先级的主机恢复在线后,会抢占低先级的主机的虚拟VIP, 这样会使虚拟VIP在主机中来回转移,可能会造成网络抖动。
主节点(高优先级)配置并启动
cat << eof > /etc/keepalived/keepalived.conf
global_defs {
# 每个keepalived主机唯一标识
router_id kp01
}
# 校验脚本
vrrp_script check_app {
script "/opt/scripts/check_app.sh"
# 执行间隔时间
interval 5
# 脚本执行超时时间
timeout 4
# 校验失败则扣除20优先级。确保主节点的priority值减去该值后小于从节点的priority值
weight -20
}
vrrp_instance VI_1 {
state MASTER
# 确认要绑定的网卡名
interface ens192
# 每个虚拟路由器惟一标识,范围:0-255, 一个集群内需要相同
virtual_router_id 50
# 高优先级设置
priority 100
# Keepalived发送VRRP通告的时间间隔
advert_int 1
# 同一个集群内密码需要相同
authentication {
auth_type PASS
auth_pass 1111
}
# 设置虚拟VIP
virtual_ipaddress {
172.30.87.183
}
# 追踪脚本,通常用于去执行上面的vrrp_script定义的脚本内容
track_script {
check_app
}
}
eof
systemctl restart keepalived
低优先级节点配置并启动
和高优先级节点不同的地方都加了注释
cat << eof > /etc/keepalived/keepalived.conf
global_defs {
# 每个keepalived主机唯一标识
router_id kp02
}
vrrp_script check_app {
script "/opt/scripts/check_app.sh"
interval 5
timeout 4
weight -20
}
vrrp_instance VI_1 {
# 改为 BACKUP
state BACKUP
interface ens192
virtual_router_id 50
# 低优先级,确保主节点的priority值减去该值后小于从节点的priority值
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.30.87.183
}
track_script {
check_app
}
}
eof
systemctl restart keepalived
校验VIP转移步骤
- 任意节点执行命令访问虚拟ip
curl 172.30.87.183
返回 node-1 ,表示目前虚拟VIP在主节点上。
- 查看主节点对应网卡上是否有虚拟VIP
[root@hytest-87-181 ~]# ip a | grep -C 5 172.30.87.183
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:50:56:a8:81:63 brd ff:ff:ff:ff:ff:ff
altname enp11s0
inet 172.30.87.181/24 brd 172.30.87.255 scope global noprefixroute ens192
valid_lft forever preferred_lft forever
inet 172.30.87.183/32 scope global ens192
valid_lft forever preferred_lft forever
inet6 fe80::250:56ff:fea8:8163/64 scope link noprefixroute
valid_lft forever preferred_lft forever
- 在主节点上停止nginx服务
systemctl stop nginx
- 在从节点上查看是否有虚拟VIP
[root@hytest-87-182 ~]# ip a | grep -C 5 172.30.87.183
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:50:56:a8:6e:d3 brd ff:ff:ff:ff:ff:ff
altname enp11s0
inet 172.30.87.182/24 brd 172.30.87.255 scope global noprefixroute ens192
valid_lft forever preferred_lft forever
inet 172.30.87.183/32 scope global ens192
valid_lft forever preferred_lft forever
inet6 fe80::250:56ff:fea8:6ed3/64 scope link noprefixroute
valid_lft forever preferred_lft forever
- 任意节点执行命令访问虚拟VIP
curl 172.30.87.183
返回 node-2 ,表示虚拟VIP成功转移至节点2上。
- 在主节点上启动nginx服务
systemctl start nginx
- 在主节点上查看是否有虚拟VIP
[root@hytest-87-181 ~]# ip a | grep -C 5 172.30.87.183
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:50:56:a8:81:63 brd ff:ff:ff:ff:ff:ff
altname enp11s0
inet 172.30.87.181/24 brd 172.30.87.255 scope global noprefixroute ens192
valid_lft forever preferred_lft forever
inet 172.30.87.183/32 scope global ens192
valid_lft forever preferred_lft forever
inet6 fe80::250:56ff:fea8:8163/64 scope link noprefixroute
valid_lft forever preferred_lft forever
- 任意节点执行命令访问虚拟VIP
curl 172.30.87.183
返回 node-1 ,表示目前虚拟VIP在主节点上,主节点抢回虚拟VIP
2. 使用 keepalived 非抢占模式 nopreempt
即优先级不再影响虚拟VIP的归属,谁先启动则获得虚拟VIP。
当执行校验脚本的失败次数达配置次数后,keepalived 进入FAULT状态,释放虚拟VIP,由其他正常状态的keepalived获取。
节点1(172.30.87.181)配置并启动
cat << eof > /etc/keepalived/keepalived.conf
global_defs {
# 每个keepalived主机唯一标识
router_id kp01
}
# 校验脚本
vrrp_script check_app {
script "/opt/scripts/check_app.sh"
# 执行间隔时间
interval 5
# 配置执行3次成功,则keepalived为正常状态
rise 3
# 脚本执行超时时间
timeout 4
# 配置执行3次失败,则keepalived为FAULT状态,释放虚拟VIP
fall 3
}
vrrp_instance VI_1 {
state BACKUP
# 确认要绑定的网卡名
interface ens192
# 每个虚拟路由器惟一标识,范围:0-255, 一个集群内需要相同
virtual_router_id 50
# 开启非抢占
nopreempt
# 非抢占模式下优先级值并不重要
priority 100
# Keepalived发送VRRP通告的时间间隔
advert_int 1
# 同一个集群内密码需要相同
authentication {
auth_type PASS
auth_pass 1111
}
# 设置虚拟VIP
virtual_ipaddress {
172.30.87.183
}
# 追踪脚本,通常用于去执行上面的vrrp_script定义的脚本内容
track_script {
check_app
}
}
eof
systemctl restart keepalived
节点2(172.30.87.182)配置并启动
和节点1不同的地方都加了注释
cat << eof > /etc/keepalived/keepalived.conf
global_defs {
# 每个keepalived主机唯一标识
router_id kp02
}
vrrp_script check_app {
script "/opt/scripts/check_app.sh"
interval 5
rise 3
timeout 4
fall 3
}
vrrp_instance VI_1 {
state BACKUP
interface ens192
virtual_router_id 50
nopreempt
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.30.87.183
}
track_script {
check_app
}
}
eof
systemctl restart keepalived
校验VIP转移步骤
- 任意节点执行命令访问虚拟VIP
curl 172.30.87.183
返回 node-1 ,表示目前虚拟VIP在节点1上(按文档操作的话,节点1的keepalived先启动)
- 查看节点1对应网卡上是否有虚拟VIP
[root@hytest-87-181 ~]# ip a | grep -C 5 172.30.87.183
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:50:56:a8:81:63 brd ff:ff:ff:ff:ff:ff
altname enp11s0
inet 172.30.87.181/24 brd 172.30.87.255 scope global noprefixroute ens192
valid_lft forever preferred_lft forever
inet 172.30.87.183/32 scope global ens192
valid_lft forever preferred_lft forever
inet6 fe80::250:56ff:fea8:8163/64 scope link noprefixroute
valid_lft forever preferred_lft forever
- 在节点1上停止nginx服务
systemctl stop nginx
- 在节点2上查看是否有虚拟VIP
[root@hytest-87-182 ~]# ip a | grep -C 5 172.30.87.183
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:50:56:a8:6e:d3 brd ff:ff:ff:ff:ff:ff
altname enp11s0
inet 172.30.87.182/24 brd 172.30.87.255 scope global noprefixroute ens192
valid_lft forever preferred_lft forever
inet 172.30.87.183/32 scope global ens192
valid_lft forever preferred_lft forever
inet6 fe80::250:56ff:fea8:6ed3/64 scope link noprefixroute
valid_lft forever preferred_lft forever
- 任意节点执行命令访问虚拟VIP
curl 172.30.87.183
返回 node-2 ,表示虚拟VIP成功转移至节点2上。
- 在节点1上启动nginx服务
systemctl start nginx
- 在节点1上查看是否有虚拟VIP
[root@hytest-87-181 ~]# ip a | grep -C 5 172.30.87.183
[root@hytest-87-181 ~]#
- 任意节点执行命令访问虚拟VIP
curl 172.30.87.183
返回 node-2 ,表示虚拟VIP仍在节点2上,节点1并没有抢回虚拟VIP。
其他
在校验VIP转移的步骤中可以配合以下命令查看keepalived日志更加清晰的了解当前主机的keepalived执行的动作以及所处的状态
systemctl status keepalived -l
journalctl -fxu keepalived