当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] Keepalived:在 CentOS/RHEL 上通过 IP 故障转移配置高可用性

作者:精品下载站 日期:2024-12-14 20:13:06 浏览:17 分类:玩电脑

Keepalived:在 CentOS/RHEL 上通过 IP 故障转移配置高可用性


在本文中,我们将考虑两个鱿鱼 (Linux) 代理服务器的高可用性故障转移配置,以从公司 LAN 访问互联网。为了构建故障转移配置,我们将使用 keepalived 创建一个 HA 集群。
HA 集群是一组具有嵌入式冗余的服务器,可以在组中任何服务器出现硬件或软件问题时最大限度地减少应用程序停机时间。根据此定义,为了使 HA 集群正确运行,必须实现以下几点:

  • 服务器状态检查;

  • 服务器故障时自动切换资源。

Keepalived 可以实现这两个功能。 Keepalived是Linux系统中的一个系统守护进程,可实现服务故障转移和负载平衡。如果主服务器发生故障,则通过将浮动 IP 地址切换到另一台服务器来提供故障转移。为了在服务器之间自动切换 IP 地址,keepalived 使用 VRRP(虚拟路由器冗余协议 - https://www.ietf.org/rfc/rfc2338.txt)。

VRRP原理

首先,让我们考虑一些理论和主要的 VRRP 定义。

VIP

— 虚拟IP,发生故障时能够在服务器之间自动切换的虚拟IP地址;

Master

— VIP 当前处于活动状态的服务器;

Backup

— 如果主服务器发生故障,VIP 将切换到的服务器;

VRID

— 虚拟路由器 ID,共享虚拟 IP (VIP) 的服务器形成所谓的虚拟路由器,其唯一标识符的值可以在 1 到 255 之间。一台服务器可以同时属于多个 VRID,但每个 VRID 必须有一个唯一的虚拟 IP 地址。

基本运算算法:

  • 主服务器以固定的时间间隔向特定的组播地址224.0.0.18发送VRRP报文(心跳),所有从服务器都会监听该地址。组播是指有一个发送者和多个接收者;

    提示。要使服务器工作在组播模式下,您的网络设备必须支持组播流量。

  • 如果Slave服务器没有收到任何心跳包,则启动Master选择过程。如果服务器优先成为Master,它将激活VIP并发送免费ARP。免费 ARP 是一种特殊类型的 ARP 响应,它更新网络交换机上的 MAC 表,以通知虚拟 IP 地址所有者和要将流量重定向到的 MAC 地址的更改。

在 CentOS 上安装和配置 keepalived

我们将在两台运行 CentOS 7 并安装了 Squid 的 Linux 服务器(proxy-serv01 和 proxy-serv02)上安装和配置 keepalived。在我们的方案中,我们将使用最简单的负载均衡方法——循环 DNS。这种方法建议单个 DNS 名称有多个注册的 IP 地址,客户端一一获取这些地址。因此,我们需要为一个 DNS 名称(代理服务器)注册两个虚拟 IP 地址。这是网络图:

[玩转系统] Keepalived:在 CentOS/RHEL 上通过 IP 故障转移配置高可用性

每个 Linux 服务器都有两个物理网络接口:具有公共(白色)IP 地址的 eth1 和本地网络中的 eth0

以下服务器IP地址为真实IP地址:

192.168.2.251 — for proxy-server01
192.168.2.252 — for proxy-server02

以下 IP 地址将用作虚拟地址,在发生故障时在服务器之间自动切换:

192.168.2.101
192.168.2.102

重要。配置 VRRP 时,切勿将真实服务器 IP 地址用作虚拟 IP 地址,因为如果服务器发生故障,其地址将移动到下一台服务器,并且故障恢复后,第一台服务器可能会与网络隔离。问题是,要取回 IP 地址,服务器必须向网络发送 VRRP 数据包,但它没有 IP 地址可以执行此操作。

您可以使用 yum 包管理器(或

dnf

在 CentOS 8 上):

# yum install keepalived

两台服务器上安装完成后,更改两台服务器上的keepalived配置文件:

# nano /etc/keepalived/keepalived.conf

具有不同参数的行突出显示:

代理serv01

[玩转系统] Keepalived:在 CentOS/RHEL 上通过 IP 故障转移配置高可用性

代理serv02

[玩转系统] Keepalived:在 CentOS/RHEL 上通过 IP 故障转移配置高可用性

让我们更详细地描述这些选项:

vrrp_instance <name>

— 是定义 VRRP 实例的部分;

state <MASTER|BACKUP>

— 是启动时的初始节点状态;

interface <interface name>

— 是 VRRP 运行的接口;

virtual_router_id <number from 0 to 255>

— 是唯一的VRRP实例标识符,在所有服务器上必须相同;

priority <number from 0 to 255>

— 设置服务器优先级,优先级较高的服务器成为MASTER;

virtual_ipaddress

— 是处于 MASTER 状态的服务器上活动的虚拟 IP 地址块。 VRRP 实例内的所有服务器上它们必须相同

注意。您可以找到许多在 VRRP 配置中使用身份验证选项的示例。然而,keepalived 文档提到,2004 年 RFC3768 规范 (https://tools.ietf.org/html/rfc3768) 中的 VRRPv2 中删除了身份验证,因为它没有提供真正的安全性。不建议使用此配置选项。

如果当前的网络配置不允许使用多播,keepalived 会提供单播选项,即e. VRRP心跳包将根据列表直接发送到服务器。要使用单播,您将需要以下选项:

unicast_src_ip

— 是 VRRP 数据包的源地址

unicast_peer

— 是 VRRP 数据包将发送到的服务器 IP 地址块。

因此,我们的配置定义了两个 VRRP 实例:proxy_ip1 和 proxy_ip2。在常规操作中,proxy-serv01 将成为虚拟 IP 192.168.2.101 的 MASTER 和 192.168.2.102 的 BACKUP,反之亦然,proxy-serv02 将成为虚拟 IP 192.168.2.102 的 MASTER 和 192.168.2.101 的 BACKUP。

如果服务器上激活了防火墙,则必须使用 iptables 添加多播流量和 VRRP 的允许规则:

# iptables -A INPUT -i eth0 -d 224.0.0.0/8 -j ACCEPT
# iptables -A INPUT -p vrrp -i eth0 -j ACCEPT

启用 keepalived 服务以在系统启动时自动启动,并在两台服务器上运行它

# systemctl enable keepalived
# systemctl start keepalived

keepalived 启动后,虚拟 IP 地址将从您的配置文件分配给接口。让我们查看服务器当前的 eth0 IP 地址:

# ip a show eth0

在 proxy-serv01 上:

[玩转系统] Keepalived:在 CentOS/RHEL 上通过 IP 故障转移配置高可用性

在 proxy-serv02 上:

[玩转系统] Keepalived:在 CentOS/RHEL 上通过 IP 故障转移配置高可用性

如何使用Keepalived对应用或界面进行健康检查?

VRRP协议提供服务器状态监控。例如,这在物理服务器或交换机/服务器 NIC 端口出现故障的情况下非常有用。但是,也可能会出现其他问题:

  • 代理服务器(或其他应用程序)错误 - 访问服务器虚拟地址的客户端将在浏览器中收到一条错误消息,指出代理服务器不可用;

  • 第二个接口无法上网——访问服务器虚拟地址的客户端会在浏览器中收到无法建立连接的错误消息。

要处理上述情况,请使用以下选项:

track_interface

— 监视接口状态,如果列出的接口之一处于 DOWN 状态,则为 VRRP 实例设置 FAULT 状态;

track_script

— 使用脚本执行 HA 应用程序的运行状况检查,如果检查成功则返回 0,如果检查失败则返回 1。

更新配置,添加eth1接口监控(默认情况下,VRRP实例将检查其绑定的接口:当前配置中为eth0)。

track_interface {
  eth1
}

track_script 指令运行一个脚本,其参数由 vrrp_script 块确定,格式如下:

vrrp_script <name> {
 script <"path to the executable file">
 interval <number, seconds> - the periodicity of running the script, 1 second by default
 fall <number> - the number of times when the script has returned a value different from zero to switch to the FAULT state
 rise <number> - the number of times when the script has returned a zero value to get out of the FAULT state (failback)
 timeout <number> - the time to wait till the script returns the result ( if time is up, the script returns a non-zero value_
 weight <number> - the value, by which the server priority will be decreased in case it gets the FAULT state. The default value is 0, which means that the server gets the FAULT state after the script has failed for a number of times set in the fall parameter
}

vrrp_script块的参数:

script

可执行文件的路径

interval <number, seconds>

- 运行脚本的周期,默认1秒

fall <number>

- 脚本返回非零值以切换到 FAULT 状态的次数

rise <number>

- 脚本返回零值以退出 FAULT 状态(故障恢复)的次数

timeout <number>

- 等待脚本返回结果的时间(如果时间到了,脚本返回一个非零值_

weight <number>

- 当服务器进入 FAULT 状态时,服务器优先级将降低的值。默认值为0,表示脚本失败达到fall参数中设置的次数后,服务器进入FAULT状态

让我们配置 Squid 代理健康检查。使用此命令,您可以检查squid进程是否处于活动状态:

# squid -k check

创建每 3 秒运行一次的 vrrp_script。该块在 vrrp_instance 块之外定义。

vrrp_script chk_squid_service {
 script "/usr/sbin/squid -k check"
 interval 3
}

将此脚本添加到两个 vrrp_instance 块的监控中:

track_script {
 chk_squid_service
}

如果Squid出现故障,虚拟IP地址将切换到另一台服务器。

您可以指定服务器状态发生变化时要执行的任何附加操作

如果 Squid 配置为接受来自任何接口的连接,i。 e.

http_port 0.0.0.0:3128

,切换虚拟IP地址时不会出现问题,Squid将接受到新地址的连接。但是,如果配置了特定的 IP 地址,例如: G。:

http_port 192.168.2.101:3128
http_port 192.168.2.102:3128

Squid 不会知道系统中出现了一个新地址来侦听客户端请求。为了处理虚拟 IP 地址切换时需要执行一些额外操作的情况,keepalived 允许在服务器状态发生变化时运行脚本,例如从 MASTER 更改为 BACKUP,反之亦然。它是使用此选项实现的:

notify "path to the executable file"

发生故障时测试 Keepalived 故障转移

配置虚拟 IP 后,请确保正确处理故障。第一个检查是服务器故障模拟。禁用proxy-serv01上的eth0,它将停止发送VRRP心跳包。 proxy-serv02 必须激活虚拟 IP 地址 192.168.2.101。使用以下命令检查它:

# ip a show eth0

在 proxy-serv01 上:

[玩转系统] Keepalived:在 CentOS/RHEL 上通过 IP 故障转移配置高可用性

在 proxy-serv02 上:

[玩转系统] Keepalived:在 CentOS/RHEL 上通过 IP 故障转移配置高可用性

正如预期的那样,proxy-serv02 激活了虚拟 IP 地址 192.168.2.101。让我们使用以下命令查看日志中写入的内容:

cat /var/log/messages | grep -i keepalived

在 proxy-serv01 上:

Keepalived_vrrp[xxxxx]:

Kernel is reporting: interface eth0 DOWN
Keepalived_vrrp[xxxxx]:
VRRP_Instance(proxy_ip1) Entering FAULT STATE
Keepalived_vrrp[xxxxx]:
VRRP_Instance(proxy_ip1) removing protocol VIPs.
Keepalived_vrrp[xxxxx]:
VRRP_Instance(proxy_ip1) Now in FAULT state

Keepalived 收到 eth0 处于 DOWN 状态的信号,并将 proxy_ip1 VRRP 实例设置为 FAULT 状态,从而释放虚拟 IP 地址。

在 proxy-serv02 上:

Keepalived_vrrp[xxxxx]:
VRRP_Instance(proxy_ip1) Transition to MASTER STATE

Keepalived 设置 proxy_ip1 VRRP 实例的 MASTER 状态,激活 eth0 上的 IP 地址 192.168.2.101 并发送免费 ARP。

[玩转系统] Keepalived:在 CentOS/RHEL 上通过 IP 故障转移配置高可用性

并确保再次在 proxy-serv01 上启用 eth0 时,虚拟 IP 地址 192.168.2.101 被切换回。

在 proxy-serv01 上:

Keepalived_vrrp[xxxxx]:
VRRP_Instance(proxy_ip1) forcing a new MASTER election
Keepalived_vrrp[xxxxx]:
VRRP_Instance(proxy_ip1) Transition to MASTER STATE
Keepalived_vrrp[xxxxx]:
VRRP_Instance(proxy_ip1) Entering MASTER STATE
Keepalived_vrrp[xxxxx]:
VRRP_Instance(proxy_ip1) setting protocol VIPs.
Keepalived_vrrp[xxxxx]:
Sending gratuitous ARP on eth0 for 192.168.2.101

Keepalived收到eth0回来的信号,开始为proxy_ip1 VRRP实例选择MASTER。获得MASTER状态后,服务器激活eth0中的IP地址192.168.2.101并发送免费ARP。

在 proxy-serv02 上:

Keepalived_vrrp[xxxxx]:
VRRP_Instance(proxy_ip1) Received advert with higher priority 255, ours 100
Keepalived_vrrp[xxxxx]:
VRRP_Instance(proxy_ip1) Entering BACKUP STATE
Keepalived_vrrp[xxxxx]:
VRRP_Instance(proxy_ip1) removing protocol VIPs.

Keepalived 获取 proxy_ip1 VRRP 实例优先级较高的数据包,将 proxy_ip1 切换到 BACKUP 状态并释放 IP 地址。

第二个检查是模拟外网接口故障。为此,请禁用 proxy-serv01 上的外部网络接口 eth1。查看日志中的结果。

在 proxy-serv01 上:

Keepalived_vrrp[xxxxx]:
Kernel is reporting: interface eth1 DOWN
Keepalived_vrrp[xxxxx]:
VRRP_Instance(proxy_ip1) Entering FAULT STATE
Keepalived_vrrp[xxxxx]:
VRRP_Instance(proxy_ip1) removing protocol VIPs.
Keepalived_vrrp[xxxxx]:
VRRP_Instance(proxy_ip1) Now in FAULT state

Keepalived 收到 eth1 已关闭的信号,并将 proxy_ip1 VRRP 实例设置为 FAULT 状态,从而释放虚拟 IP 地址。

在 proxy-serv02 上:

Keepalived_vrrp[xxxxx]:
VRRP_Instance(proxy_ip1) Transition to MASTER STATE
Keepalived_vrrp[xxxxx]:
VRRP_Instance(proxy_ip1) Entering MASTER STATE
Keepalived_vrrp[xxxxx]:
VRRP_Instance(proxy_ip1) setting protocol VIPs.
Keepalived_vrrp[xxxxx]:
Sending gratuitous ARP on eth0 for 192.168.2.101

Keepalived 设置 proxy_ip1 VRRP 实例的 MASTER 状态,激活 eth0 中的 IP 地址 192.168.2.101 并发送免费 ARP。

[玩转系统] Keepalived:在 CentOS/RHEL 上通过 IP 故障转移配置高可用性

第三个检查是模拟 Squid 故障。为此,请使用以下命令手动停止服务:

# systemctl stop squid

查看日志中的结果:

在 proxy-serv01 上:

Keepalived_vrrp[xxxxx]:
VRRP_Script(chk_squid_service) failed
Keepalived_vrrp[xxxxx]:
VRRP_Instance(proxy_ip1) Entering FAULT STATE
Keepalived_vrrp[xxxxx]:
VRRP_Instance(proxy_ip1) removing protocol VIPs.
Keepalived_vrrp[xxxxx]:
VRRP_Instance(proxy_ip1) Now in FAULT state

检查 Squid 代理服务活动的脚本返回错误。 Keepalived 将 proxy_ip1 VRRP 实例设置为 FAULT 状态,从而释放虚拟 IP 地址。

在 proxy-serv02 上:

Keepalived_vrrp[xxxxx]:
VRRP_Instance(proxy_ip1) Transition to MASTER STATE
Keepalived_vrrp[xxxxx]:
VRRP_Instance(proxy_ip1) Entering MASTER STATE
Keepalived_vrrp[xxxxx]:
VRRP_Instance(proxy_ip1) setting protocol VIPs.
Keepalived_vrrp[xxxxx]:
Sending gratuitous ARP on eth0 for 192.168.2.101

Keepalived 设置 proxy_ip1 VRRP 实例的 MASTER 状态,激活 eth0 中的 IP 地址 192.168.2.101 并发送免费 ARP。

所有三项检查均已成功通过,并且 keepalived 配置正确。稍后我们将使用 Pacemaker 配置 HA 集群并描述其功能。

proxy-serv01的最终配置文件/etc/keepalived/keepalived.conf

vrrp_script chk_squid_service {
 script "/usr/sbin/squid -k check"
 interval 3
}
 vrrp_instance proxy_ip1 {
 state MASTER
 interface eth0
 virtual_router_id 1
 priority 255
 virtual_ipaddress {
  192.168.2.101/24 dev eth0 label eth0:1
 }
 track_interface {
  eth1
 }
 track_script {
  chk_squid_service
 }
}
vrrp_instance proxy_ip2 {
 state BACKUP
 interface eth0
 virtual_router_id 2
 priority 100
 virtual_ipaddress {
  192.168.2.102/24 dev eth0 label eth0:2
 }
 track_interface {
  eth1
 }
 track_script {
  chk_squid_service
 }
}

proxy-serv02的最终配置文件/etc/keepalived/keepalived.conf

vrrp_script chk_squid_service {
 script "/usr/sbin/squid -k check"
 interval 3
}
vrrp_instance proxy_ip1 {
 state BACKUP
 interface eth0
 virtual_router_id 1
 priority 100
 virtual_ipaddress {
  192.168.2.101/24 dev eth0 label eth0:1
 }
 track_interface {
  eth1
 }
 track_script {
  chk_squid_service
 }
}
vrrp_instance proxy_ip2 {
 state MASTER
 interface eth0
 virtual_router_id 2
 priority 255
 virtual_ipaddress {
  192.168.2.102/24 dev eth0 label eth0:2
}
 track_interface {
  eth1
 }
 track_script {
  chk_squid_service
 }
}

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯