在现代互联网架构中,服务的高可用性是保障业务连续性的基石,任何单点故障都可能导致服务中断,造成用户体验下降乃至经济损失,在众多高可用解决方案中,Keepalived 以其轻量、高效和稳定的特点,在 Linux 环境下,特别是 CentOS 7 系统中,得到了广泛的应用,它通过 VRRP(虚拟路由冗余协议)协议实现服务器的故障转移,确保关键服务在主节点出现问题时,能够无缝切换到备用节点,从而对外提供一个稳定、可靠的虚拟服务入口。
Keepalived 的核心工作原理
要理解 Keepalived,首先需要掌握其两个核心组件:VRRP 协议和健康检查机制。
VRRP (Virtual Router Redundancy Protocol)
VRRP 是一种容错协议,它将一组路由器(在 Keepalived 场景下即服务器)虚拟成一个虚拟路由器,这个虚拟路由器拥有一个统一的虚拟 IP 地址(VIP),在这组服务器中,一台作为主节点(MASTER),其余作为备用节点(BACKUP)。
- 主节点(MASTER):拥有最高优先级,负责处理所有发送到虚拟 IP 的请求,它会周期性地发送 VRRP 广播报文,通知其他备用节点自己仍然存活。
- 备用节点(BACKUP):处于监听状态,接收主节点的广播报文,如果在设定的时间内(称为“ advert_int”和“master_down_interval”)没有收到主节点的报文,备用节点就会认为主节点已经宕机,并立即发起选举,优先级最高的备用节点将成为新的主节点,接管虚拟 IP 地址,继续提供服务。
这个过程对于客户端来说是完全透明的,客户端始终访问的是同一个虚拟 IP,无需关心背后是哪一台物理服务器在响应。
健康检查
VRRP 只能检测服务器本身的存活状态(网络层面),但如果服务器存活,但其上运行的关键服务(如 Nginx、MySQL)已经停止响应,VRRP 就无能为力了,这时,Keepalived 的健康检查功能就派上了用场。
Keepalived 可以定期执行自定义的脚本来检查特定服务的状态,可以编写一个脚本检查 Nginx 进程是否存在,或者尝试访问一个特定的 URL 来判断 Web 服务是否正常,如果检查失败,Keepalived 会主动降低本机的优先级,从而触发一次主备切换,即使服务器本身网络是通的,这实现了从“主机存活”到“服务可用”的深度监控。
在 CentOS 7 上安装与配置 Keepalived
下面我们通过一个经典的案例,演示如何在两台 CentOS 7 服务器上部署 Keepalived,为 Nginx 服务提供高可用。
环境准备:
角色 | 主机名 | IP 地址 | 系统 |
---|---|---|---|
主节点 (MASTER) | centos7-master | 168.1.101 | CentOS 7 |
备用节点 (BACKUP) | centos7-backup | 168.1.102 | CentOS 7 |
虚拟 IP (VIP) | N/A | 168.1.200 | N/A |
第一步:安装 Keepalived 和 Nginx
在两台服务器上分别执行以下命令:
# 安装 EPEL 源(如果未安装) sudo yum install -y epel-release # 安装 Nginx 和 Keepalived sudo yum install -y nginx keepalived
第二步:配置 Nginx(可选,用于测试)
为了方便测试,可以为两台服务器的 Nginx 设置不同的首页,以便区分访问的是哪台机器。
在 centos7-master
上:
echo "<h1>Master Server - 192.168.1.101</h1>" | sudo tee /usr/share/nginx/html/index.html
在 centos7-backup
上:
echo "<h1>Backup Server - 192.168.1.102</h1>" | sudo tee /usr/share/nginx/html/index.html
然后启动并设置 Nginx 开机自启:
sudo systemctl start nginx sudo systemctl enable nginx
第三步:配置 Keepalived
Keepalived 的主配置文件是 /etc/keepalived/keepalived.conf
。
主节点 (centos7-master) 配置:
编辑 /etc/keepalived/keepalived.conf
文件,内容如下:
! Configuration File for keepalived global_defs { router_id LVS_DEVEL_01 # 一个唯一的标识符 } # 定义一个健康检查脚本 vrrp_script check_nginx { script "/usr/local/bin/check_nginx.sh" # 脚本路径 interval 2 # 每2秒检查一次 weight -20 # 检查失败,优先级降低20 } vrrp_instance VI_1 { state MASTER # 定义角色为主节点 interface ens33 # 绑定的网卡名称(请根据实际情况修改,如 eth0) virtual_router_id 51 # 虚拟路由ID,主备必须一致 priority 100 # 优先级,主节点应高于备用节点 advert_int 1 # 主备间通信间隔(秒) authentication { auth_type PASS # 认证类型 auth_pass 1111 # 认证密码,主备必须一致 } virtual_ipaddress { 192.168.1.200 # 虚拟IP地址 } track_script { check_nginx # 调用上面定义的检查脚本 } }
备用节点 (centos7-backup) 配置:
编辑 /etc/keepalived/keepalived.conf
文件,内容与主节点基本相同,只需修改 state
和 priority
:
! Configuration File for keepalived global_defs { router_id LVS_DEVEL_02 # 修改标识符 } vrrp_script check_nginx { script "/usr/local/bin/check_nginx.sh" interval 2 weight -20 } 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.1.200 # 虚拟IP地址 } track_script { check_nginx } }
第四步:创建健康检查脚本
在两台服务器上,都创建健康检查脚本 /usr/local/bin/check_nginx.sh
:
sudo touch /usr/local/bin/check_nginx.sh sudo chmod +x /usr/local/bin/check_nginx.sh
如下:
#!/bin/bash # 检查nginx进程是否存在 if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then # 如果nginx不存在,尝试启动一次 systemctl start nginx sleep 2 # 再次检查,如果仍不存在,则退出脚本,返回1,触发keepalived降权 if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then exit 1 else exit 0 fi else exit 0 fi
这个脚本首先检查 Nginx 进程,如果不存在,它会尝试重启 Nginx,如果重启失败,脚本会返回状态码 1,Keepalived 捕获到这个非零返回值后,就会执行 weight -20
的操作,将本机优先级降低(例如主节点从 100 降到 80),低于备用节点的 90,从而触发 VIP 漂移。
第五步:启动 Keepalived 并测试
在两台服务器上启动并设置 Keepalived 开机自启:
sudo systemctl start keepalived sudo systemctl enable keepalived
测试过程:
- 验证 VIP 绑定:在主节点上执行
ip addr show ens33
,你会看到168.1.200
这个虚拟 IP 已经绑定在ens33
网卡上,在备用节点上执行同样命令,则看不到 VIP。 - 访问服务:在局域网内任意一台机器上,通过浏览器或
curl
访问http://192.168.1.200
,你会看到主节点(Master Server)的页面。 - 模拟服务故障:在主节点上停止 Nginx 服务:
sudo systemctl stop nginx
。 - 观察故障转移:等待几秒钟后,再次在备用节点上执行
ip addr show ens33
,你会发现在备用节点的网卡上出现了168.1.200
,再次访问http://192.168.1.200
会变成备用节点(Backup Server)的页面,查看 Keepalived 日志tail -f /var/log/messages
,可以看到状态切换的详细记录。 - 恢复服务:重新启动主节点的 Nginx 和 Keepalived 服务,VIP 将会重新漂移回优先级更高的主节点。
通过以上步骤,我们成功地在 CentOS 7 上部署了一个基于 Keepalived 的高可用 Nginx 服务集群,Keepalived 的配置灵活,功能强大,是实现各类关键服务高可用性的重要工具。
相关问答 (FAQs)
问题1:Keepalived 配置中的 virtual_router_id
有什么作用?主备节点必须设置成一样的吗?
解答: virtual_router_id
(虚拟路由标识符)是 VRRP 协议中的一个核心参数,它用于在同一个局域网内区分不同的 VRRP 组(或称虚拟路由器),只有 virtual_router_id
相同的服务器才会属于同一个高可用组,它们之间才会相互发送 VRRP 报文、进行主备选举,属于同一个集群的主节点和所有备用节点,其 virtual_router_id
必须完全一致,如果设置不一致,它们将无法识别彼此,各自为政,也就无法实现故障转移,该值的取值范围是 0-255,确保在同一个网络内不重复即可。
问题2:如果两台服务器的 Keepalived 都进入了 MASTER 状态,该怎么办?这种情况通常被称为“脑裂”。
解答: “脑裂”是高可用架构中一个非常严重的问题,指的是两个节点因某种原因无法通信,都认为对方已宕机,从而都抢占 MASTER 角色,导致出现两个主节点同时拥有虚拟 IP 的情况,这会引发网络混乱和服务异常。
脑裂的常见原因和排查思路如下:
- 防火墙问题:这是最常见的原因,VRRP 协议使用组播(默认地址 224.0.0.18)进行通信,请确保两台服务器之间的防火墙允许 VRRP 协议的报文通过,可以在防火墙中添加规则放行 VRRP,或者临时关闭防火墙进行测试(
systemctl stop firewalld
)。 - 网络设备问题:中间的交换机或路由器可能配置不当,阻止了组播报文的传输,需要检查网络设备的配置。
- 服务器网络配置:检查服务器的网卡配置、IP 地址、子网掩码是否正确,确保它们在同一个二层网络内。
- Keepalived 配置错误:检查
authentication
部分的auth_pass
是否一致,virtual_router_id
是否一致,interface
网卡名是否正确。
解决脑裂问题的根本是确保主备节点之间的心跳链路(即 VRRP 通信链路)是稳定和可靠的,在生产环境中,有时会引入额外的“仲裁”机制,比如使用一个第三方的服务器或共享存储来判断哪个节点应该真正持有资源,从而避免脑裂。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复