Rocky Linux 9.2 配置 Web 高可用(Keepalived + Nginx)

操作环境说明

操作系统: 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转移步骤

  1. 任意节点执行命令访问虚拟ip
curl 172.30.87.183

返回 node-1 ,表示目前虚拟VIP在主节点上。

  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
  1. 在从节点上查看是否有虚拟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
  1. 任意节点执行命令访问虚拟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
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. 任意节点执行命令访问虚拟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转移步骤

  1. 任意节点执行命令访问虚拟VIP
curl 172.30.87.183

返回 node-1 ,表示目前虚拟VIP在节点1上(按文档操作的话,节点1的keepalived先启动)

  1. 查看节点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. 在节点1上停止nginx服务
systemctl stop nginx
  1. 在节点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
  1. 任意节点执行命令访问虚拟VIP
curl 172.30.87.183

返回 node-2 ,表示虚拟VIP成功转移至节点2上。

  1. 在节点1上启动nginx服务
systemctl start nginx
  1. 在节点1上查看是否有虚拟VIP
[root@hytest-87-181 ~]# ip a | grep -C 5 172.30.87.183
[root@hytest-87-181 ~]#
  1. 任意节点执行命令访问虚拟VIP
curl 172.30.87.183

返回 node-2 ,表示虚拟VIP仍在节点2上,节点1并没有抢回虚拟VIP。

其他

在校验VIP转移的步骤中可以配合以下命令查看keepalived日志更加清晰的了解当前主机的keepalived执行的动作以及所处的状态

systemctl status keepalived -l

journalctl -fxu keepalived

文档参考

用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇