Keepalived + Nginx 主备容灾方案介绍
服务器 | IP地址 | 角色 |
---|---|---|
Srv01 | 192.168.249.100 VIP: 192.168.249.110 | Nginx+Keepalive |
Srv02 | 192.168.249.101 | Nginx+Keepalive |
概述
Keepalived 和 Nginx 的组合是一个常见的高可用性(HA)方案,尤其适用于 Web 服务。通过 Keepalived 实现的虚拟 IP 地址(VIP)在主从服务器之间的切换,可以确保当主服务器(Master)出现故障时,从服务器(Backup)能够迅速接管服务,从而达到业务的高可用性和容灾目的。
方案架构
-
主服务器(Srv01):
- IP 地址:192.168.249.100
- VIP 地址:192.168.249.110
- 角色:Nginx + Keepalived(Master)
-
备服务器(Srv02):
- IP 地址:192.168.249.101
- 角色:Nginx + Keepalived(Backup)
关键组件
- Nginx Nginx 作为一个高性能的反向代理服务器,可以处理大量的 HTTP 请求。它在这个架构中负责处理客户端的请求,并将其转发到后端的应用服务器。
- Keepalived Keepalived 是一个用于实现高可用性和故障转移的服务。它通过 VRRP(虚拟路由冗余协议)来管理虚拟 IP 地址,并检测主服务器的健康状态。一旦检测到主服务器出现故障,Keepalived 会自动将 VIP 切换到备服务器上。
工作流程
-
正常运行状态:
- 在正常情况下,VIP 地址(192.168.249.110)绑定在主服务器(Srv01)上。
- 客户端请求通过 VIP 地址到达 Srv01,Nginx 处理这些请求。
-
故障切换:
- 如果 Keepalived 检测到 Srv01 不可用(例如由于硬件故障或网络问题),它会自动将 VIP 地址切换到备服务器(Srv02)。
- Srv02 上的 Nginx 接管请求,确保服务不中断。
-
恢复:
- 当 Srv01 恢复正常运行时,Keepalived 可以将 VIP 地址切回 Srv01,或者继续由 Srv02 处理请求,视配置而定。
Nginx 配置 Nginx 的配置通常不会因为 Keepalived 而有所不同,但是你可以配置一个简单的 HTTP 服务来测试高可用性。
测试步骤
- 确保两台服务器上 Nginx 和 Keepalived 均正常启动。
- 通过 VIP 地址(192.168.249.110)访问 Web 服务,确认能够正常访问。
- 模拟主服务器(Srv01)故障,观察 VIP 地址是否切换到备服务器(Srv02),并继续访问 Web 服务,确认服务不中断。
结论 这种主备架构提供了一个简单而有效的高可用性方案,适用于对服务可靠性有较高要求的场景。在实际生产环境中,还可以进一步优化配置,如使用更复杂的健康检查脚本、设置自动恢复策略等。
Server01,Server02前期配置
禁用 SELinux
-
编辑 SELinux 配置文件:
arduinovim /etc/selinux/config
-
找到
SELINUX=enforcing
并将其改为SELINUX=disabled
:iniSELINUX=disabled
-
保存并退出,然后重启系统以使更改生效:
reboot
清除 iptables 规则
-
清除所有 iptables 规则:
riptables -F iptables -X iptables -t nat -F iptables -t nat -X iptables -t mangle -F iptables -t mangle -X iptables -t raw -F iptables -t raw -X
-
保存规则以确保重启后仍保持清除状态:
service iptables save
关闭防火墙
- 停止防火墙服务:
arduino
systemctl stop firewalld
- 禁用防火墙开机自启:
bash
systemctl disable firewalld
- 查看防火墙状态:
lua
systemctl status firewalld
各个节点时间同步,启用时间同步服务
-
确保安装了
chrony
:yum install chrony -y
-
启动并启用
chronyd
服务:bashsystemctl start chronyd systemctl enable chronyd
-
查看
chronyd
服务状态:
-
检查时间同步状态:
chronyc tracking
启用多播功能
首先,确保网络接口启用了多播功能。
检查多播设置
使用以下命令检查多播是否启用:
bash
ip link show ens33
如果输出中没有 MULTICAST
标志,则需要启用多播。
启用多播
使用以下命令启用多播:
bash
ip link set ens33 multicast on
Server01,Server02安装 Nginx
添加 Nginx 仓库
首先,添加官方 Nginx 仓库:
arduino
yum install -y epel-release
安装 Nginx
yum install nginx -y
启动 Nginx 服务
启动并启用 Nginx 服务:
bash
systemctl start nginx
systemctl enable nginx
检查 Nginx 状态
检查 Nginx 服务状态:
lua
systemctl status nginx
安装配置Keepalived集群
所有节点安装 keepalived
yum install -y curl gcc openssl-devel libnl3-devel net-snmp-devel
yum install -y keepalived
配置 keepalived
主节点(Server01)配置
-
编辑
keepalived
配置文件:bashvi /etc/keepalived/keepalived.conf
-
bash
#!/bin/bash #检测nginx是否正常运行 if /usr/sbin/pidof nginx &>/dev/null ;then exit 0 else exit 1 fi
这个脚本的主要功能是检测 Nginx 服务是否正常运行,并通过返回状态码来指示检测结果。以下是对脚本各部分的详细介绍:
脚本解析
bash#!/bin/bash
#!/bin/bash
: 这是一个 shebang 行,用于指定解释器的路径。在这个例子中,脚本将使用/bin/bash
作为解释器来执行。
bash#检测nginx是否正常运行
- 注释行 : 以
#
开头的行是注释,不会被脚本执行。在这里,它说明了脚本的目的,即检测 Nginx 是否正常运行。
bashif /usr/sbin/pidof nginx &>/dev/null ;then exit 0 else exit 1 fi
-
/usr/sbin/pidof nginx
:pidof
是一个 Linux 命令,用于查找指定程序的进程 ID (PID)。在这个例子中,它查找的是nginx
进程。- 如果
nginx
正在运行,那么pidof
会返回一个或多个进程 ID。
-
&>/dev/null
:- 这是一个重定向操作符,表示将标准输出 (
stdout
) 和标准错误 (stderr
) 都重定向到/dev/null
,即忽略输出。 - 这意味着无论
pidof
返回什么信息,都不会在终端上显示出来。
- 这是一个重定向操作符,表示将标准输出 (
-
if
语句:if /usr/sbin/pidof nginx &>/dev/null ;then
:这个语句用于检查pidof nginx
命令的返回值。- 如果
pidof
成功找到nginx
进程(返回值为0
),则执行then
块中的命令(即exit 0
)。 - 如果
pidof
没有找到nginx
进程(返回值为非0
),则执行else
块中的命令(即exit 1
)。
-
exit 0
:exit
命令用于终止脚本的执行,并返回一个状态码。exit 0
表示脚本成功执行,意味着 Nginx 正在运行。
-
exit 1
:exit 1
表示脚本执行失败,意味着 Nginx 未运行。
-
fi
:fi
用于结束if
语句块。
脚本的作用
这个脚本的作用是检查 Nginx 服务是否正在运行。它通过
pidof
查找 Nginx 进程,如果找到,则返回状态码0
,表示正常运行;如果找不到,则返回状态码1
,表示 Nginx 未运行或已经停止。使用场景
-
Keepalived 健康检查: 在 Keepalived 的配置中,这个脚本可以用作健康检查脚本。Keepalived 定期运行这个脚本,并根据返回值决定是否将 VIP 切换到另一台服务器。
-
自动化监控: 这个脚本可以集成到自动化监控系统中,用于检测 Nginx 的健康状况。如果 Nginx 停止运行,监控系统可以触发报警或尝试重新启动服务。
-
定期巡检: 在定期的服务器健康检查中,这个脚本可以帮助管理员快速验证 Nginx 是否处于运行状态。
-
配置文件内容示例:
perlglobal_defs { router_id lvs-nginx01 } vrrp_script chknginx { script "/etc/keepalived/chknginx.sh" interval 1 weight -30 } 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.249.110 # 虚拟IP地址 } track_script { chknginx } }
这个配置文件是 Keepalived 的配置示例,配置文件定义了使用 VRRP(虚拟路由冗余协议)来管理高可用性的设置。在这个示例中,Keepalived 被配置为与 Nginx 一起使用,以确保 Nginx 服务的高可用性。以下是对配置文件各部分的详细介绍。
配置文件解析
global_defs
块
global_defs {
router_id lvs-nginx01
}
-
global_defs
:这是 Keepalived 的全局配置块。 -
router_id lvs-nginx01
:router_id
用于标识运行 Keepalived 的路由器或服务器的唯一标识符。lvs-nginx01
是一个自定义名称,用来唯一标识这台服务器在 VRRP 集群中的身份。
vrrp_script
块
sql
vrrp_script chknginx
{
script "/etc/keepalived/chknginx.sh"
interval 1
weight -30
}
-
vrrp_script chknginx
:定义了一个 VRRP 跟踪脚本,名字为chknginx
。 -
script "/etc/keepalived/chknginx.sh"
:- 指定要执行的脚本路径。在这个示例中,
/etc/keepalived/chknginx.sh
是用于检测 Nginx 服务是否运行的脚本。 - 这个脚本的返回值将影响 Keepalived 的行为。
- 指定要执行的脚本路径。在这个示例中,
-
interval 1
:- 设置脚本的执行间隔时间,单位为秒。在这里,Keepalived 每 1 秒执行一次该脚本。
-
weight -30
:weight
表示优先级的增量或减量。如果脚本检测失败,Keepalived 会减少30
点的优先级。这种配置可以确保主服务器在 Nginx 服务失败时降低其优先级,从而让备服务器接管。
vrrp_instance
块
kotlin
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.249.110
}
track_script {
chknginx
}
}
-
vrrp_instance VI_1
:- 定义了一个 VRRP 实例,名称为
VI_1
。该实例负责管理虚拟 IP 地址的分配。
- 定义了一个 VRRP 实例,名称为
-
state MASTER
:- 定义了当前节点的状态为
MASTER
。在主备模式下,MASTER
节点是默认持有虚拟 IP 地址的节点。
- 定义了当前节点的状态为
-
interface ens33
:- 指定用于 VRRP 通信的网络接口。在这个示例中,
ens33
是该服务器的网络接口名。
- 指定用于 VRRP 通信的网络接口。在这个示例中,
-
virtual_router_id 51
:virtual_router_id
是一个标识 VRRP 路由器实例的 ID。该值在主备节点间必须一致。
-
priority 100
:- 定义该节点的优先级。优先级数值越高,该节点越有可能成为
MASTER
。在主备模式中,主节点通常设置较高的优先级(这里为100
),备节点优先级应低一些。
- 定义该节点的优先级。优先级数值越高,该节点越有可能成为
-
advert_int 1
:advert_int
是 VRRP 广播间隔时间,单位为秒。这里设置为每秒发送一次 VRRP 广播包。
-
authentication
块:auth_type PASS
:指定认证方式为简单密码验证。auth_pass 1111
:指定密码为1111
。这个密码必须在主备节点间保持一致,以确保安全通信。
-
virtual_ipaddress
:192.168.249.110
:定义了虚拟 IP 地址(VIP),该 IP 地址将在MASTER
节点和BACKUP
节点之间进行切换。客户端通过访问这个 VIP 来获得服务。
-
track_script
块:chknginx
:指定跟踪脚本为上面定义的chknginx
。如果该脚本检测到 Nginx 服务不可用,Keepalived 会降低当前节点的优先级,触发故障转移。
工作原理
- 正常情况下 : 在
MASTER
节点正常运行时,它持有虚拟 IP 地址,并处理所有客户端请求。如果chknginx.sh
脚本检测到 Nginx 正常运行,MASTER
节点将继续保持现状。 - Nginx 服务异常时 : 如果
chknginx.sh
脚本检测到 Nginx 服务未运行,Keepalived 会根据weight -30
的设置降低当前节点的优先级。假设优先级降低后低于备节点,则备节点将接管 VIP,成为新的MASTER
,从而保证服务的持续可用性。
使用场景
- 高可用性 Nginx 集群: 该配置适用于需要高可用性的 Nginx 服务器集群,通过 Keepalived 实现主备故障切换,确保在主服务器出现问题时,备服务器可以快速接管,避免服务中断。
- 关键业务系统: 在金融、医疗、电子商务等对业务连续性要求极高的场景中,这种高可用性架构能够显著提升系统的可靠性。
备份节点(Server02)配置
-
编辑
keepalived
配置文件:bashvi /etc/keepalived/keepalived.conf
-
配置文件内容示例:
perlglobal_defs { router_id lvs-nginx02 } vrrp_script chknginx { script "/etc/keepalived/chknginx.sh" interval 1 weight -30 } 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.249.110 # 虚拟IP地址 } track_script { chknginx } }
bash
#!/bin/bash
#检测nginx是否正常运行
if /usr/sbin/pidof nginx &>/dev/null ;then
exit 0
else
exit 1
fi
启动 keepalived
服务
在所有节点上启动并启用 keepalived
服务:
bash
systemctl start keepalived
systemctl enable keepalived
验证配置
在所有节点上检查 keepalived
服务状态:
lua
systemctl status keepalived
可以通过以下命令查看虚拟IP地址是否已经分配:
sql
ip addr show