言成言成啊 | Kit Chen's Blog

LVS以及KeepAlived实现故障转移<未完成>

发布于2025-03-23 10:59:07,更新于2025-04-01 22:59:22,标签:devops  文章会持续修订,转载请注明来源地址:https://meethigher.top/blog

我有多个 Backend,这些 Backend 通过 Nginx 作为 LoadBalancer。当 Nginx 节点出现故障时,整个系统的流量无法正确转发,导致服务不可用。为了确保系统的高可用性,可以引入一个备份 Nginx 节点,并使用 keepalived 来实现故障转移和流量切换。本文目的是学习 keepalived,顺便将其涉及的基础知识也进行了解。

本文按如下顺序,层层递进展开。

  1. IP 与子网掩码
  2. 网络基础
  3. LVS
  4. keepalived

针对 IP 与子网掩码的基础,此处不做记录。可以参考 IP 与 CentOS7 防火墙基础

一、网络基础

1.1 网络分层模型

计算机网络中,有三种常见的网络分层模型

  1. OSI 七层模型
    • 用途:理论标准
  2. TCP/IP 四层模型
    • 用途:实践标准
  3. 五层模型
    • 用途:教学标准

第一层从表格最下面开始,逐往上递增。

理解OSI 七层模型TCP/IP 四层模型五层模型
看到的内容:比如 HTTP 接口返回的数据内容应用层应用层应用层
数据的翻译官:加密、解码、压缩表示层
建立“会话”的门卫:登录、保持连接会话层
把内容切好、编号,保证顺序送达运输层运输层运输层
找路:确定从哪条线路送到对方网络层网络层网络层
把数据帧传到邻居,找 MAC 地址数据链路层网络接口层数据链路层
电、光、无线信号本身物理层物理层

交换机:用于局域网内部的设备互联,让同一网段内的主机能够通信。处于数据链路层。

路由器:连接不同子网,让不同网络之间的数据包能够互通。处于网络层。

1.2 路由器与网关

1.2.1 网关分类

路由器(Router) 是一个设备,用来连接不同子网,并根据 IP 地址进行数据包转发,工作在网络层。

网关(Gateway) 是一个概念,用来连接不同协议或网络,它不仅仅负责转发数据包,还能进行协议转换。可以工作在多个 OSI 层。常用网关如下

  • 网络通信网关
    • 代表:路由器(OSI 第三层网络层)。
    • 解释:路由器作为网关,用来连接不同子网,这包括局域网(LAN)和广域网(WAN)。
  • 负载均衡网关
    • 代表:负载均衡器,如 Nginx(OSI 第七层应用层)、LVS(OSI 第四层运输层)。
    • 解释:负载均衡器作为网关,将流量转发出去。

1.2.2 网络通信网关的触发时机

如果当前机器访问的目标 IP 在本地子网内,数据包就会直接传输,不经过默认网关。

如果当前机器访问的目标 IP 不在本地子网内,数据包就会发送给默认网关,由网关转发到其他子网。

将目标 IP 与子网掩码的二进制进行 AND 运算,如果当前 IP 与子网掩码的运算结果一致,那么就说明在同一个子网内。

就像生活中的送东西,如果近,就自己上门送;如果远,就甩给快递站。

1.3 两子网进行组网通信

1.3.1 环境安装

将以下环境在 Windows11 上按顺序进行安装。相关的内容在 B 站有很多免费的课程。参考

  1. eNSP 还不会安装?还算什么网工!
  2. 拜托三连了!这绝对是全 B 站最用心(没有之一)的 ensp 实验配置视频!持续更新中 ~ 建议收藏

1.3.2 实践

“我要模拟两个子网进行组网,使用 WIFI 即可实现,还有必要使用交换机吗?”

还是有必要的。简单对照两者的优劣,如下。

对比点Wi-Fi有线交换机
灵活性无线连接,设备自由移动,适合动态环境有线固定,设备受限于网线长度与端口位置
带宽共享所有设备共享局域网带宽。你在下载东西我打游戏就会卡每个物理接口独立带宽,互不影响
延迟表现延迟较高,易受干扰与墙壁影响延迟低,稳定性强,适合高要求应用
信号范围信号覆盖有限,可能存在死角信号稳定,不受距离影响
成本初期投入低初期投入较高,需要交换机和网线
使用场景家庭、移动设备多、无缝漫游办公室、企业、固定设备多,需高速稳定网络

我通过 eNSP 这个网络拓扑模拟器,使用交换机和路由器,两者组合的方式,进行两个子网 10.0.0.0/8192.168.1.0/24 的组网。

如果你安装了其他的虚拟环境,比如 VMware、Docker、WSL、Qemu 之类的,底层虚拟化冲突,可能会出现启动设备失败的问题。

解决办法参考 ensp 启动设备失败代码 40 的解决方法 _ensp 启动 ar 失败代码 40-CSDN 博客

配置拓扑如下

源码示例可以访问 meethigher/ensp-repo: ensp examples 下载 net-test

下载用 ensp 打开后,针对路由器进行配置。

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
31
32
33
34
35
36
The device is running!

<Huawei>sys
Enter system view, return user view with Ctrl+Z.

[Huawei]in g 0/0/0

[Huawei-GigabitEthernet0/0/0]ip address 10.0.0.1 255.0.0.0
Mar 30 2025 15:27:30-08:00 Huawei %%01IFNET/4/LINK_STATE(l)[0]:The line protocol
IP on the interface GigabitEthernet0/0/0 has entered the UP state.

[Huawei-GigabitEthernet0/0/0]q

[Huawei]in g 0/0/1

[Huawei-GigabitEthernet0/0/1]ip address 192.168.1.1 255.255.255.0
Mar 30 2025 15:27:46-08:00 Huawei %%01IFNET/4/LINK_STATE(l)[1]:The line protocol
IP on the interface GigabitEthernet0/0/1 has entered the UP state.

[Huawei-GigabitEthernet0/0/1]q

[Huawei]dis ip in b
*down: administratively down
^down: standby
(l): loopback
(s): spoofing
The number of interface that is UP in Physical is 3
The number of interface that is DOWN in Physical is 1
The number of interface that is UP in Protocol is 3
The number of interface that is DOWN in Protocol is 1

Interface IP Address/Mask Physical Protocol
GigabitEthernet0/0/0 10.0.0.1/8 up up
GigabitEthernet0/0/1 192.168.1.1/24 up up
GigabitEthernet0/0/2 unassigned down down
NULL0 unassigned up up(s)

用 PC3 去访问 PC1,可以连通,证明组网成功!

1.3.3 理解原理

拓扑图如下,Server1 开启 HTTP 80 端口。

1.) 问题 1:通过 Client1 这台机器请求 Server1 的 80 端口,能否连通?

答:能。由于 Server1 不在 Client1 所处的 10.0.0.0/8 子网内,因此 Client1 会将数据包发送给网关 10.0.0.1,即路由器 1路由器 1 有两个接口,分别处于两个子网 10.0.0.0/8192.168.1.0/24,而 Server1 的 IP 属于子网 192.168.1.0/24,因此路由器 1 会将数据包发送给该子网对应的接口,最终到达 Server1。之后路由器 1 再次中转,将响应内容写回。

以上图为例,主机 1 向主机 2 发起请求,整体流程如下:

  1. 主机 1 的应用进程 AP1 向主机 2 的应用进程 AP2 传输数据。AP1 将数据交给本机的第 5 层(应用层)。
  2. 第 5 层(应用层)为数据添加必要的头信息(H5),如 HTTP 头部。
  3. 第 4 层(运输层)为数据添加 源/目端口 头部(H4)。
  4. 第 3 层(网络层)为数据添加 源/目IP 头部(H3)。
  5. 第 2 层(数据链路层)在数据首部加入 源/目 MAC (H2)、尾部加入 校验和 (T2)。
  6. 第 1 层(物理层)传输比特流时,不再添加控制信息。注意,比特流从首部开始传输。
  7. 当比特流离开主机 1,通过网络的物理传输介质到达路由器时:
    1. 路由器从第 1 层开始,逐层向上拆包,剥去控制信息后,将剩余数据传递给上一层。
    2. 到达第 3 层(网络层)时,路由器根据首部中的目的地址查找路由表,确定转发接口,然后将数据下传至第 2 层,加入新的首部和尾部,再传递至第 1 层,最终通过物理介质发送每一个比特。
  8. 比特流从路由器离开,抵达目的主机 2 时,数据依照相同流程从第 1 层开始逐层拆包,最终到达第 5 层。
  9. 最终,AP1 发送的数据交给主机 2 的应用进程 AP2。

ARP请求就是一种用于在局域网中查询MAC地址的广播请求。作用阶段是数据链路层。

如果源主机知道目标主机的IP地址,但不确定其MAC地址,它会广播一个ARP请求包。该请求包含了目标IP地址,并询问“谁拥有这个IP地址?请回复你的MAC地址”。

参考

  1. 同一网段与不同网段数据包传输过程
  2. 数据是如何一步一步到达目的地的?来看数据传输机制 封装与转发

2.) 问题 2:Client1 发起请求后,如果能连通,那么 Server1 收到的请求源 IP 是什么?

答:视情况而定。如果路由器启用 NAT(Network Address Translation),那么 Server1 收到的请求源 IP 为 192.168.1.1;如果未启用 NAT,则为 10.0.0.10

像我们 WIFI 连接的路由器,默认就是开启 NAT 的。

最直接的体现是,所有连接该 WIFI 的,对外出去的互联网 IP 都是同一个。

二、LVS

2.1 背景

LVS(Linux Virtual Server) 是由中国工程师章文嵩博士于 1998 年发起并开发的开源负载均衡项目。1999 年,LVS 代码被集成到 Linux 内核 2.4 版本中,成为 Linux 生态的重要组成部分。

随着互联网流量的快速增长,传统单台服务器的性能已无法满足大规模服务的需求。章文嵩博士提出通过集群技术将多台物理服务器组合成一个“虚拟服务器”,对外表现为单一入口,从而提升服务能力和可靠性。

2.2 工作模式

LVS(Linux Virtual Server)是一个基于 Linux 内核的负载均衡解决方案,是 Linux 内核层面的负载均衡实现,核心是 IPVS 模块(IP Virtual Server)。

ipvsadm 是 LVS 的用户空间管理工具,它用来配置和查看 LVS(IPVS)的运行状态。安装 ipvsadm

1
yum -y install ipvsadm

LVS 支持三种主要的工作模式,适应不同网络环境:

  • LVS-NAT模式
    • 全名:Network Address Translation
    • 原理:网络地址转换。Client 请求 LVS,LVS 通过 DNAT 将目标地址修改为真实地址,将请求转给 RealServer 并获取响应后,LVS 通过 SNAT 将源地址修改为自己的 VIP,再转发给 Client。
    • 特点:LVS 对请求和响应双向都参与处理,压力较大。
    • 适用场景:要求 RealServer 与 LVS 在同一局域网;性能略差。
  • LVS-DR模式
    • 全名:Direct Routing
    • 原理:直接路由模式。Client 请求 LVS,LVS 只修改 MAC 地址,将数据包通过数据链路层直接发给 RealServer,RealServer 不经过 LVS 直接将响应返回给 Client。
    • 特点:LVS 仅负责请求方向,响应绕过,减少 LVS 负载。
    • 适用场景:要求 RealServer 与 LVS 在同一局域网;要求禁用ARP;性能较高。
  • LVS-TUN模式
    • 全名:IP Tunneling
    • 原理:IP 隧道模式。Client 请求 LVS,LVS 将请求封装成 IP 隧道包(使用 IPIP 协议)转发给 RealServer,RealServer 解封装后处理请求,直接将响应返回给 Cilent。
    • 特点:LVS 只负责请求方向,且不要求与 RealServer 在同一局域网。
    • 适用场景:允许后端服务器分布在不同物理网络;要求支持隧道;性能较高。

参考

2.3 实践(一知半解,该内容暂留,以后填坑)

2.3.1 LVS-NAT模式

三个核心角色

  1. Client(客户端)
    • 含义:发起请求的主机
    • 流程:访问虚拟服务地址 VIP
  2. Director(LVS 调度器)
    • 含义:安装有 LVS(通过 ipvsadm 配置)并对外开放 VIP 作为流量入口
    • 流程:接收来自 Client 请求,并转发给 RealServer
  3. RealServer(真实服务器)
    • 含义:提供服务的主机
    • 流程:与 Director 处于同一局域网内,并将默认网关设置为 Director 的内网 IP(DIP),保证响应正确返回给 LVS

三个 IP

名称所属角色含义
VIPDirectorVirtual IP,对外暴露,Client 访问这个地址
DIPDirectorDirector IP,LVS 的内网地址,RealServer 的网关应设为此
RIPRealServerRealServer IP,真实服务器的地址,仅 LVS 与之通信

我有四台机器,这四台机器在同一个局域网内。

  • 10.0.0.10
    • 用途:Client
  • 10.0.0.101
    • 用途:Director
  • 10.0.0.102
    • 用途:RealServer。部署 Nginx,开启 80 端口。
  • 10.0.0.103
    • 用途:RealServer。部署 Nginx,开启 80 端口。

Director 配置

1.) 开启 IP 转发。该内容仅需要针对 Director 开启即可。

验证是否开启 ipv4

1
2
3
4
# 方式一
sysctl net.ipv4.ip_forward
# 方式二
cat /proc/sys/net/ipv4/ip_forward

临时修改,服务器重启后失效

1
2
3
4
# 方式一
sysctl -w net.ipv4.ip_forward=1
# 方式二
echo 1 > /proc/sys/net/ipv4/ip_forward

永久修改

1
2
3
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
# 重新加载内核参数
sysctl -p

2.) 配置负载均衡规则。并开启一个虚拟 IP。

1
2
3
4
5
6
7
8
9
# 添加虚拟 IP(VIP),dev 是 device 的缩写,ens33 表示网络接口
ip addr add 10.0.0.200/32 dev ens33

# 使用 ipvsadm 配置负载均衡规则,并不会开启实际 80 端口,-s rr 表示使用轮询调度
ipvsadm -A -t 10.0.0.200:80 -s rr

# 将真实服务器添加到负载均衡池,-m 表示 NAT 模式
ipvsadm -a -t 10.0.0.200:80 -r 10.0.0.102:80 -m
ipvsadm -a -t 10.0.0.200:80 -r 10.0.0.103:80 -m

其他常用命令

1
2
3
4
5
6
7
8
# 若需要删除
ip addr del 10.0.0.200/32 dev ens33

# 查看规则,-L默认情况是以主机名展示,-n表示以IP形式展示。
ipvsadm -Ln

# 清除所有规则
ipvsadm -C

RealServer 配置

1.) 安装 Nginx, 开启 http 80 端口。一键安装 Nginx 脚本参考那些年,我玩过的Bash脚本

2.) 分别修改默认 index.html,返回当前的 IP 地址

1
echo "<h1>10.0.0.102</h1>" >/usr/local/nginx/html/index.html

3.) 最关键的一步,需要将首选网关配置为 Director,并设置较高的优先级。metric 值越小,优先级越高。

1
2
3
4
5
6
7
8
9
10
# 查看当前路由
ip route

# 添加优先级较高的默认路由(metric = 50,metric值越小,优先级越高)
ip route add default via 10.0.0.101 dev ens33 metric 50

# 删除路由,将查询到的内容,放置到ip route del后面即可
# scope link 表示只在同子网本地链路(不经过网关时)生效
# 该路由需要删除。该路由的作用是告诉Linux内核,如果目标IP是在子网10.0.0.0/8范围内时,直接通过ens33以源IP为10.0.0.102发出请求
ip route del 10.0.0.0/8 dev ens33 proto kernel scope link src 10.0.0.102 metric 100

运行结果

修改了网关后,要等一会。不会立马生效。

2.3.2 LVS-DR模式

同样是三个角色,Director、RealServer、Client,也同样是上述四台机器。具体含义可以参考上述说明。

Director 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 为 Director(负载均衡器)上的 ens33 网络接口添加 IP 地址 10.0.0.200,/32 表示这是一个单一的 IP 地址
ip addr add 10.0.0.200/32 dev ens33

# 设置回环接口 lo 的 ARP 忽略模式为 1,表示不响应对本机地址的 ARP 请求
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

# 设置回环接口 lo 的 ARP 公告模式为 2,表示仅在路由表没有默认路由的情况下才会公告
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

# 设置所有接口的 ARP 忽略模式为 1,表示不响应对本机地址的 ARP 请求
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

# 设置所有接口的 ARP 公告模式为 2,表示仅在路由表没有默认路由的情况下才会公告
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

# 使用 ipvsadm 工具创建一个虚拟服务,监听 10.0.0.200:80,负载均衡算法使用轮询(rr, round-robin)
ipvsadm -A -t 10.0.0.200:80 -s rr

# 将 10.0.0.102 添加为 10.0.0.200:80 虚拟服务的一个真实服务器,采用 Gateway 模式(-g)
ipvsadm -a -t 10.0.0.200:80 -r 10.0.0.102 -g

# 将 10.0.0.103 添加为 10.0.0.200:80 虚拟服务的另一个真实服务器,采用 Gateway 模式(-g)
ipvsadm -a -t 10.0.0.200:80 -r 10.0.0.103 -g

RealServer 配置

1.) 安装 Nginx, 开启 http 80 端口。一键安装 Nginx 脚本参考那些年,我玩过的Bash脚本

2.) 分别修改默认 index.html,返回当前的 IP 地址

1
echo "<h1>10.0.0.102</h1>" >/usr/local/nginx/html/index.html

3.) 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 为 RealServer 上的 lo 网络接口添加 Director 的虚拟 IP 地址 10.0.0.200,确保其能够与 Director 进行 ARP 通信
ip addr add 10.0.0.200/32 dev lo

# 设置回环接口 lo 的 ARP 忽略模式为 1,表示不响应对本机地址的 ARP 请求
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

# 设置回环接口 lo 的 ARP 公告模式为 2,表示仅在路由表没有默认路由的情况下才会公告
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

# 设置所有接口的 ARP 忽略模式为 1,表示不响应对本机地址的 ARP 请求
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

# 设置所有接口的 ARP 公告模式为 2,表示仅在路由表没有默认路由的情况下才会公告
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

2.3.3 LVS-TUN模式

同样是三个角色,Director、RealServer、Client,也同样是上述四台机器。具体含义可以参考上述说明。

问题1:Director与Realserver之间,只需要开启一个IP隧道吗?那怎么负载均衡?

问题2:如果只需要开启一个IP隧道是正确的,那么不配置ip隧道是不是也可以?

Director 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 启用IP转发,允许流量转发到真实服务器
echo 1 > /proc/sys/net/ipv4/ip_forward

# 配置Director的虚拟IP(VIP),虚拟IP是用来接收外部请求的
ip addr add 10.0.0.200/32 dev ens33

# 配置虚拟服务器,设置VIP(10.0.0.200)和监听端口(80),并选择负载均衡策略(round robin)
ipvsadm -A -t 10.0.0.200:80 -s rr

# 将真实服务器(192.168.1.10 和 192.168.1.20)添加到负载均衡池中,-g表示使用隧道模式
ipvsadm -a -t 10.0.0.200:80 -r 10.0.0.102:80 -g
ipvsadm -a -t 10.0.0.200:80 -r 10.0.0.103:80 -g

# 配置IP隧道,将流量封装后转发给后端的真实服务器(192.168.1.10),并指定本地IP(10.0.0.200)
ip tunnel add tun0 mode ipip remote 192.168.1.10 local 10.0.0.200
ip link set tun0 up

# 配置防火墙,允许通过隧道接口的流量
iptables -A INPUT -i tun0 -j ACCEPT

RealServer 配置

三、keepalived

3.1 工作原理

keepalived 用于应用服务的高可用,当应用服务出现故障时,可以将请求转移到正常的服务上面。

keepalived 由以下部分组成:

  • VRRP(Virtual Router Redundancy Protocol)
    • 负责虚拟 IP(VIP)的主备切换,保证服务高可用。
  • 健康检查(Health Check)
    • 支持编写自定义脚本,检测服务的存活状态,避免流量转发到故障节点。

VRRP 主备切换,其核心原理如下:

  1. 角色划分
    • Master(主):持有 VIP,负责对外提供服务,并定期发送 VRRP 广播
    • Backup(备):监听 Master 的心跳消息,在 Master 故障时接管 VIP。
  2. 选举机制
    • VRRP 采用 优先级(Priority) 进行主备选举,默认范围 1-255,值越大优先级越高。
    • 默认情况下,优先级高的节点成为 Master
    • Master 会 周期性发送 VRRP 广播包,告诉 Backup “我还活着”。
    • Backup 监听 Master 的 VRRP 包,如果一定时间内收不到心跳,则触发故障转移(Failover)
      1. 最高优先级的 Backup 变为 Master,接管 VIP。
      2. 旧的 Master 恢复后,如果优先级较低,则作为 Backup。

问:当 VIP 进行故障转移时,局域网内其他机器如何知道这个 VIP 被哪台机器接管了?

答:局域网内其他机器,在访问这个 IP 时,如果当前 arp -a 缓存里面不存在该 IP 对应 MAC 地址。则会发送 ARP 请求,询问同一子网内的机器:拥有这个 IP 地址的机器需要将 MAC 地址返回。

3.2 安装

直接运行 i-keepalived.sh

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#!/usr/bin/env bash
set -e

# 日志打印函数
function log() {
echo "$(date +"%Y-%m-%d %H:%M:%S"): $1"
}

function download() {
log "keepalived 下载中..."
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
yum -y install libnl libnl-devel libnfnetlink-devel
curl -k -L "https://www.keepalived.org/software/keepalived-1.4.5.tar.gz" -o keepalived.tgz
log "keepalived 下载完成"
}

function decompress() {
if [! -f "$1"]; then
log "错误:未找到 $1 文件"
exit 1
fi
log "keepalived 正在解压中..."
mkdir keepalived
tar -zxvf "$1" --strip-components=1 -C keepalived
log "keepalived 解压完成"
}

function makef() {
if [! -d "$1"]; then
log "错误:未找到 $1 目录"
exit 1
fi

cd "$1"
log "keepalived 编译中..."
# 若不指定 prefix,就是安装至 /usr/local,相当于./configure --prefix=/usr/local
./configure --prefix=/usr/local/keepalived
# make 是单线程编译。make -j$(nproc) 是多线程编译。
make -j$(nproc)
make install
log "keepalived 编译成功"
}

function configf() {
log "keepalived 配置中..."
mkdir -p /etc/keepalived
cat >/etc/keepalived/keepalived.conf <<EOF
# 全局定义配置
global_defs {
# 脚本执行默认用户
script_user root
enable_script_security
# 设置路由器的 ID,标识 keepalived 实例
router_id LVS_DEVEL
# 跳过 VRRP 广告包地址的检查,允许不匹配的地址通过。
vrrp_skip_check_adv_addr
}

# 监测程序是否健康运行
vrrp_script check_keepalived {
# 返回0表示正常,返回1表示异常
script "/usr/bin/curl -s -f http://127.0.0.1:80 || exit 1"
# 每2秒进行检查
interval 2
# 增加或减少节点的优先级值。如果检查失败,当前节点优先级会下降
weight 2
# 连续 2 次失败后,节点会被判定为不可用
fall 2
# 连续 2 次成功后,节点会恢复。并根据优先级决定是否调整为master
rise 2
# 健康检查脚本超时为 5 秒
timeout 5
}

# 配置 VRRP 实例(虚拟路由器冗余协议实例)
vrrp_instance VI_1 {
# 设置实例状态为 MASTER,表示当前节点是主节点。
# 可选有 MASTER 主节点、BACKUP 备份节点、DISABLED 禁用
state MASTER
# 配置该实例使用的网络接口
interface ens33
# 设置虚拟路由器 ID,用于区分不同的 VRRP 实例
virtual_router_id 51
# 设置该节点的优先级,值越大,优先级越高,越有可能成为主节点
priority 100
# 设置 VRRP 广告包发送的间隔时间,单位为秒
advert_int 1
# 配置 VRRP 实例的认证方式和密码,确保只有认证通过的节点能加入集群
authentication {
# 使用 PASS 方式进行简单的密码认证
auth_type PASS
# 配置认证密码
auth_pass 1111
}
# 配置虚拟 IP 地址列表,这些 IP 将在主备节点之间漂移
virtual_ipaddress {
# 支持配置多个虚拟 IP 地址
10.0.0.200
10.0.0.201
}

track_script {
check_keepalived
}
}
EOF
systemctl daemon-reload
log "keepalived 配置完成"
echo "================="
echo "systemctl status keepalived"
}


download
decompress keepalived.tgz
makef keepalived
configf

运行日志查看

1
journalctl -u keepalived -f

3.3 实践

我有四台机器,这四台机器在同一个局域网内。

  • 10.0.0.10
    • 用途:Client
  • 10.0.0.101
    • 用途:Keepalived + Nginx (HTTP 80)
    • 主机名:node1
  • 10.0.0.102
    • 用途:Keepalived + Nginx (HTTP 80)
    • 主机名:node2
  • 10.0.0.103
    • 用途:Keepalived + Nginx (HTTP 80)
    • 主机名:node3

我现在要实现将 node1、node2、node3 组建成一个支持故障转移的高可用集群,要点如下。

  1. 对外的 VIP 为 10.0.0.200。
  2. node1 为 master 节点,其他的为 backup 节点,并且 node1、node2、node3 的优先级分别为 100、99、98。

node1 的 /etc/keepalived/keepalived.conf 完整配置如下

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
31
32
33
34
global_defs {
script_user root
enable_script_security
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
}

vrrp_script check_keepalived {
script "/usr/bin/curl -s -f http://127.0.0.1:80 || exit 1"
interval 2
weight 2
fall 2
rise 2
timeout 5
}

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 {
10.0.0.200
}

track_script {
check_keepalived
}
}

在此基础上,针对 node2 进行配置调整。

  • state 调整为 BACKUP
  • priority 调整为 99

针对 node3 进行配置调整。

  • state 调整为 BACKUP
  • priority 调整为 98

依次在 node1、node2、node3 机器上进行 keepalived的服务启动。关闭 nginx 进行验证即可。

  1. 验证脚本执行:查看 nginx 访问日志
  2. 验证 VIP 漂移:查看 keepalived 日志,或者,执行 ip addr 查看
发布:2025-03-23 10:59:07
修改:2025-04-01 22:59:22
链接:https://meethigher.top/blog/2025/keepalived/
标签:devops 
付款码 打赏 分享
Shift+Ctrl+1 可控制工具栏