目录
[1.1 什么是Keepalived?](#1.1 什么是Keepalived?)
[1.2 专为LVS而生的负载均衡管理工具](#1.2 专为LVS而生的负载均衡管理工具)
[1.3 核心能力:故障自动切换](#1.3 核心能力:故障自动切换)
[1.4 LVS集群中的健康检查机制](#1.4 LVS集群中的健康检查机制)
[1.5 调度器与节点服务器的高可用(HA)架构](#1.5 调度器与节点服务器的高可用(HA)架构)
[3.1 VRRP核心概念](#3.1 VRRP核心概念)
[3.2 VRRP工作流程](#3.2 VRRP工作流程)
[6.1 脑裂成因分析](#6.1 脑裂成因分析)
[6.2 脑裂解决方法](#6.2 脑裂解决方法)
[7.1 环境准备](#7.1 环境准备)
[7.2 后端Web节点部署(192.168.1.12/13)](#7.2 后端Web节点部署(192.168.1.12/13))
[7.3 LVS调度器部署(192.168.1.10/11)](#7.3 LVS调度器部署(192.168.1.10/11))
[7.3.1 安装核心软件](#7.3.1 安装核心软件)
[7.3.2 配置LVS-MASTER(192.168.1.10)](#7.3.2 配置LVS-MASTER(192.168.1.10))
[7.3.3 配置LVS-BACKUP(192.168.1.11)](#7.3.3 配置LVS-BACKUP(192.168.1.11))
[7.3.4 编写健康检查脚本](#7.3.4 编写健康检查脚本)
[7.3.5 启动服务并设置开机自启](#7.3.5 启动服务并设置开机自启)
[7.4 后端节点配置LVS DR模式(关键)](#7.4 后端节点配置LVS DR模式(关键))
[7.5 集群测试验证](#7.5 集群测试验证)
[7.5.1 负载均衡测试](#7.5.1 负载均衡测试)
[7.5.2 故障切换测试](#7.5.2 故障切换测试)
[7.5.3 脑裂测试(可选)](#7.5.3 脑裂测试(可选))
前言
在互联网业务高速发展的今天,系统的高可用性已经成为保障业务连续性的核心诉求。想象一下,若电商平台在大促峰值突然宕机,或支付系统出现单点故障,造成的损失将难以估量。而LVS(Linux Virtual Server)与Keepalived的组合,正是解决这类问题的经典方案------LVS负责实现高效的负载均衡,将海量请求合理分发;Keepalived则守护集群稳定性,实现故障的自动检测与切换。本文将从概念解析到原理深挖,再到实战部署,带大家全面掌握这一高可用解决方案。
一、Keepalived核心概念详解
1.1 什么是Keepalived?
Keepalived是一款运行于Linux系统的轻量级高可用自动化软件,核心功能聚焦于服务器状态监测 与故障自动切换。它基于TCP/IP协议栈的多层检测机制,能实时监控集群节点状态,当主节点故障时,自动将业务无缝切换至备用节点;当故障节点恢复后,又可自动将其重新纳入集群,全程无需人工干预。与HeartBeat等功能复杂的高可用软件相比,Keepalived部署简单、配置灵活,仅需一个核心配置文件即可完成基础高可用架构搭建。
1.2 专为LVS而生的负载均衡管理工具
Keepalived最初便是为LVS负载均衡集群设计的配套工具。LVS作为Linux内核自带的负载均衡模块,能实现四层(传输层)高效请求分发,但自身缺乏健康检查和故障切换能力。Keepalived的出现恰好弥补了这一短板------它可通过内置的IPVS(IP Virtual Server)管理模块,直接解析LVS的配置,实现对LVS集群节点的状态监控与动态管理。当检测到某后端节点故障时,Keepalived会立即将其从LVS的分发列表中剔除,避免请求流向故障节点;节点恢复后再自动重新加入,保障LVS集群的分发有效性。
1.3 核心能力:故障自动切换
故障自动切换(Failover)是Keepalived实现高可用的核心机制。其核心逻辑是通过主备节点的心跳检测,维持集群状态的一致性。在主备架构中,主节点(MASTER)正常运行时会独占集群的虚拟IP(VIP),对外提供服务;备用节点(BACKUP)则持续监听主节点的心跳信号。当主节点因硬件故障、服务崩溃等原因无法正常工作时,备用节点会在心跳超时后判定主节点故障,立即抢占虚拟IP并接管服务。整个切换过程通常在秒级完成,对用户完全透明,从而最大限度减少业务中断时间。
1.4 LVS集群中的健康检查机制
健康检查是Keepalived保障集群稳定性的前提,它通过TCP/IP协议栈的不同层次实现对节点状态的精准检测,主要支持以下几种方式:
-
Layer3(网络层)检查:通过发送ICMP数据包(类似Ping命令)检测节点IP的有效性。若IP地址无法响应,则判定节点故障,适用于服务器宕机等严重故障场景。
-
Layer4(传输层)检查:通过检测节点特定TCP/UDP端口的监听状态判断服务可用性。例如,对Web服务检查80/443端口,若端口未开启则剔除节点,适用于服务进程崩溃等场景。
-
Layer5(应用层)检查:针对具体业务场景的深度检查,如对Web服务发送HTTP GET请求,通过对比响应内容的MD5哈希值判断服务是否正常;也支持SSL_GET实现加密服务的检查。此外,还可通过genhash工具生成预设哈希值,提高检查准确性。
-
自定义脚本检查(MISC_CHECK):支持调用自定义Shell脚本进行复杂状态检测,脚本通过返回0(正常)或1(故障)告知Keepalived节点状态,适用于数据库连接、业务日志异常等定制化场景。
1.5 调度器与节点服务器的高可用(HA)架构
在LVS+Keepalived集群中,高可用架构贯穿于调度器和节点服务器两层:
-
调度器高可用:采用"双机热备"架构,由两台服务器作为LVS调度器,通过Keepalived实现主备切换。主调度器负责接收客户端请求并分发至后端节点,备调度器实时监控主调度器状态,确保调度器无单点故障。
-
节点服务器高可用:多台后端节点服务器运行相同业务,LVS调度器通过轮询、加权轮询等算法分发请求。Keepalived持续对所有节点进行健康检查,当某节点故障时,立即将其从分发列表中移除,剩余节点继续承接业务,实现节点层的负载冗余。
这种"调度器主备+节点集群"的架构,从核心分发层到业务节点层实现了全链路高可用,是企业级应用的经典选型。
二、Keepalived高可用故障切换原理
Keepalived的故障切换机制基于VRRP协议实现,其核心流程可分为"心跳检测-状态判定-资源接管"三个阶段,具体原理如下:
-
初始状态选举:集群启动时,主备节点根据优先级进行角色选举。优先级范围为0-255,优先级高的节点成为主节点;若优先级相同,则IP地址更大的节点当选主节点。主节点会立即绑定虚拟IP(VIP),并对外发送ARP广播,告知局域网内其他设备VIP与主节点MAC的映射关系。
-
实时心跳监测:主节点会以固定间隔(默认1秒)向备用节点发送VRRP心跳报文,报文中包含主节点的优先级等信息。备用节点通过指定端口(默认112)监听心跳报文,若在设定超时时间(默认3秒)内未收到心跳,则判定主节点故障。
-
故障切换执行:备用节点判定主节点故障后,立即切换为MASTER状态,执行以下操作:① 绑定虚拟IP(VIP);② 发送ARP广播,更新局域网内设备的ARP缓存,将VIP映射至自身MAC地址;③ 开始对外提供服务并发送心跳报文。
-
故障恢复衔接:若启用"抢占模式"(默认开启),当原主节点故障恢复后,会通过心跳报文发现当前主节点的优先级低于自身,便会重新抢占VIP并切换为MASTER状态,原备用节点则退回BACKUP状态。若为"非抢占模式",原主节点恢复后会保持BACKUP状态,避免频繁切换对业务造成影响。
三、VRRP通信原理:高可用的底层支撑
VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)是Keepalived实现主备切换的底层协议,其设计目标是解决静态路由的单点故障问题,通过将多台物理路由器虚拟化为一个"虚拟路由器",实现路由服务的高可用。
3.1 VRRP核心概念
-
虚拟路由器:由VRRP备份组内所有物理路由器组成的逻辑实体,拥有唯一的虚拟IP(VIP)和虚拟MAC地址(格式为00-00-5E-00-01-{VRID},VRID为备份组标识)。客户端将虚拟路由器作为默认网关,无需感知后端物理设备的变化。
-
MASTER(主路由器):虚拟路由器中唯一对外提供服务的物理节点,拥有VIP的所有权,负责处理客户端的路由请求,并定期发送VRRP心跳报文。
-
BACKUP(备份路由器):备份组内的其他物理节点,仅监听MASTER的心跳报文,不对外提供服务。当MASTER故障时,BACKUP通过选举成为新的MASTER。
-
VRRP报文:MASTER向BACKUP发送的状态通告报文,基于IP多播(组播地址224.0.0.18)发送,TTL值为255,目的端口为112,报文中包含备份组ID、MASTER优先级、VIP等关键信息。
3.2 VRRP工作流程
-
备份组初始化:同一备份组内的所有节点启动后,根据配置的VRID和优先级进入初始化状态(Initialize),随后开始角色选举。
-
角色选举机制:选举遵循三个优先级规则:① 若某节点的IP与VIP相同(IP拥有者),则直接成为MASTER;② 无IP拥有者时,优先级高的节点当选;③ 优先级相同时,IP地址大的节点当选。
-
MASTER运行状态:MASTER节点进入工作状态后,执行以下操作:① 响应ARP请求时使用虚拟MAC地址;② 处理客户端的路由转发请求;③ 每隔1秒发送VRRP心跳报文,告知备份组内节点自身状态。
-
BACKUP监听状态:BACKUP节点进入监听状态,仅接收MASTER的心跳报文,不响应ARP请求和路由转发。若连续3个心跳周期未收到报文,则判定MASTER故障,触发新的选举。
-
故障切换与恢复:新MASTER选举产生后,立即接管VIP并对外提供服务。原MASTER恢复后,根据抢占模式决定是否重新夺权,实现集群状态的动态平衡。
四、Keepalived体系:核心模块及其作用
Keepalived的架构采用模块化设计,核心由四大模块组成,各模块协同工作实现高可用功能,具体分工如下:
-
Core模块(核心模块):Keepalived的"大脑",负责主进程的启动、维护以及全局配置文件的加载与解析。它统筹管理其他所有模块,监控模块运行状态,当某模块异常退出时,Core模块会自动重启该模块,保障整个服务的稳定性。
-
Check模块(健康检查模块):实现集群节点健康检查的核心模块,支持Layer3、Layer4、Layer5等多层检测机制。Check模块定期执行检测任务,将节点状态(正常/故障)反馈给VRRP模块,为故障切换提供决策依据。同时,它还支持解析LVS配置,实现对LVS后端节点的动态管理。
-
VRRP模块(协议模块):Keepalived实现高可用的核心动力,负责VRRP协议的封装、发送与解析。它根据Check模块反馈的节点状态,触发主备角色切换逻辑,完成虚拟IP(VIP)的绑定与释放、ARP广播的发送等关键操作,确保故障切换的顺利执行。
-
IPVS模块(LVS管理模块):基于Linux内核的IPVS模块封装实现,负责LVS集群的配置与管理。通过解析配置文件中的LVS规则,IPVS模块可动态添加、删除后端节点,调整负载均衡算法(如轮询、加权轮询、最少连接等),实现LVS负载均衡的自动化管理。
五、Keepalived服务器工作原理总览
结合上述模块与协议,Keepalived服务器的完整工作流程可概括为"初始化-监控-决策-执行"四个阶段:
-
初始化阶段:Keepalived启动后,Core模块加载并解析配置文件(默认/etc/keepalived/keepalived.conf),初始化Core、Check、VRRP、IPVS四大模块。VRRP模块根据配置组建备份组,选举MASTER和BACKUP角色;IPVS模块配置LVS负载均衡规则,添加后端节点;Check模块初始化健康检查任务。
-
监控阶段:系统稳定运行时,Check模块按配置周期执行健康检查(如Ping节点、检测端口、调用脚本等),实时采集主节点自身及后端业务节点的状态;同时,VRRP模块中MASTER节点定期发送心跳报文,BACKUP节点持续监听。
-
决策阶段:当Check模块检测到主节点自身故障(如核心服务崩溃)或后端节点故障时,立即将状态信息同步给VRRP模块。若为自身故障,主节点主动切换为BACKUP状态;若为后端节点故障,IPVS模块将其从分发列表中剔除。当BACKUP节点未收到MASTER心跳时,VRRP模块判定主节点故障,决策执行切换。
-
执行阶段:VRRP模块执行故障切换,BACKUP节点升级为MASTER,绑定VIP并发送ARP广播;IPVS模块同步更新负载均衡规则,继续对外提供服务。整个过程由模块协同完成,无需人工干预。
六、Keepalived脑裂:成因与解决方法
脑裂(Split Brain)是Keepalived主备架构中最常见的异常问题,指主备节点因心跳通信中断,各自判定对方故障,同时抢占虚拟IP(VIP)对外提供服务,导致集群出现"双主"状态。这会造成客户端请求混乱、数据不一致等严重问题,需重点防范。
6.1 脑裂成因分析
-
网络链路故障:主备节点之间的网络线路中断(如交换机故障、网线松动),导致心跳报文无法传递,双方均判定对方故障。
-
防火墙规则限制:主备节点之间未开放VRRP协议的组播端口(默认112),导致心跳报文被防火墙拦截。
-
Keepalived服务异常:主节点Keepalived服务崩溃但系统未宕机,无法发送心跳报文,备用节点触发切换后,主节点服务恢复并重新抢占VIP。
-
资源耗尽:主节点因CPU、内存、磁盘IO耗尽,导致无法正常发送心跳报文,被备用节点判定为故障。
6.2 脑裂解决方法
-
双链路冗余:为主备节点配置两条独立的网络链路(如主链路用以太网、备用链路用光纤),降低网络中断的概率。即使一条链路故障,另一条链路仍可传递心跳报文。
-
开放防火墙规则 :在主备节点的防火墙中放行VRRP组播地址(224.0.0.18)和端口(112),确保心跳报文正常传输。以iptables为例,可添加规则:
iptables -A INPUT -d 224.0.0.18 -p vrrp -j ACCEPT。 -
部署第三方仲裁机制:引入独立的仲裁节点(如ZooKeeper、Redis或专用仲裁服务器),主备节点需同时向仲裁节点报告状态。当主备节点心跳中断时,通过仲裁节点判定真实状态,避免双方同时抢占VIP。例如,主备节点定期向仲裁节点发送心跳,若仲裁节点仅收到备用节点心跳,则允许其切换为主节点。
-
启用抢占延迟与非抢占模式 :在配置文件中设置抢占延迟(preempt_delay) ,让原主节点故障恢复后,延迟一段时间再抢占VIP(如设置为60秒),给备用节点足够的时间同步状态;对于业务不允许频繁切换的场景,可启用非抢占模式(nopreempt),让备用节点切换为主节点后,原主节点恢复后保持BACKUP状态,需人工干预恢复主角色。
-
监控告警与自动恢复:通过监控工具(如Nagios、Zabbix)实时监控主备节点的VIP状态,当检测到双VIP时立即触发告警(如短信、邮件)。同时,编写脚本定期检查双主状态,若发现脑裂,自动停止其中一台节点的Keepalived服务,保留正常节点提供服务。
七、实战部署:LVS+Keepalived高可用集群
本节将以CentOS 7系统为例,部署"双机热备LVS调度器+两台后端Web节点"的高可用集群,实现Nginx服务的负载均衡与故障自动切换。
7.1 环境准备
| 节点角色 | IP地址 | 操作系统 | 核心软件 | 备注 |
|---|---|---|---|---|
| LVS-MASTER | 192.168.1.10 | CentOS 7 | keepalived、ipvsadm | 主调度器 |
| LVS-BACKUP | 192.168.1.11 | CentOS 7 | keepalived、ipvsadm | 备调度器 |
| Web节点1 | 192.168.1.12 | CentOS 7 | nginx | 后端业务节点 |
| Web节点2 | 192.168.1.13 | CentOS 7 | nginx | 后端业务节点 |
| 虚拟IP(VIP) | 192.168.1.200 | - | - | 对外服务IP |
前置操作:所有节点关闭防火墙和SELinux,确保节点间网络互通。
# 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 关闭SELinux setenforce 0 sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
7.2 后端Web节点部署(192.168.1.12/13)
两台Web节点部署Nginx服务,并配置不同页面内容以便后续测试负载均衡效果。
以下是实现Nginx安装、启动及多节点Web服务器配置的完整代码段:
安装Nginx
bash
yum install -y nginx
启动Nginx并设置开机自启
bash
systemctl start nginx
systemctl enable nginx
Web节点1配置(192.168.1.12)
bash
echo "Web Server 1 - 192.168.1.12" > /usr/share/nginx/html/index.html
Web节点2配置(192.168.1.13)
bash
echo "Web Server 2 - 192.168.1.13" > /usr/share/nginx/html/index.html
防火墙配置(可选)
bash
firewall-cmd --permanent --add-service=http
firewall-cmd --reload
验证Nginx状态
bash
systemctl status nginx
curl http://localhost
7.3 LVS调度器部署(192.168.1.10/11)
7.3.1 安装核心软件
安装keepalived和ipvsadm的代码实现
以下代码用于在基于RHEL/CentOS的系统上安装keepalived和ipvsadm,并加载ip_vs内核模块以确保LVS功能正常:
bash
# 安装keepalived和ipvsadm(ipvsadm用于管理LVS规则)
yum install -y keepalived ipvsadm
# 加载ip_vs内核模块(LVS依赖)
modprobe ip_vs
# 确保开机自动加载ip_vs模块
echo "modprobe ip_vs" >> /etc/rc.local
chmod +x /etc/rc.local
功能说明
yum install -y keepalived ipvsadm:自动安装keepalived(用于高可用)和ipvsadm(用于管理LVS规则)。modprobe ip_vs:立即加载ip_vs内核模块,确保LVS功能可用。echo "modprobe ip_vs" >> /etc/rc.local:将模块加载命令写入rc.local,实现开机自启。chmod +x /etc/rc.local:赋予rc.local可执行权限,确保其生效。
注意事项
- 适用于RHEL/CentOS 7及更高版本(
systemd环境下rc.local可能需额外配置)。 - 若系统未启用
rc.local,需检查并手动启用(如systemctl enable rc-local)。 - 在CentOS 8/9或RHEL 8/9上,可能需要使用
dnf代替yum。
7.3.2 配置LVS-MASTER(192.168.1.10)
编辑Keepalived配置文件/etc/keepalived/keepalived.conf,实现LVS主调度器配置:
keepalived 配置文件示例
以下是一个完整的 keepalived 配置文件示例,实现主备高可用和负载均衡功能:
! Configuration File for keepalived
global_defs {
router_id LVS_MASTER # 节点标识,主备需不同
}
# 健康检查脚本配置
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh" # 自定义检查脚本路径
interval 2 # 检查间隔2秒
weight -20 # 检查失败时,节点优先级降低20
}
vrrp_instance VI_1 {
state MASTER # 角色为MASTER
interface ens33 # 绑定VIP的网卡(需根据实际环境修改)
virtual_router_id 51 # 虚拟路由ID,主备需一致(0-255)
priority 100 # 优先级,MASTER需高于BACKUP(如100>90)
advert_int 1 # 心跳发送间隔1秒
authentication {
auth_type PASS # 认证方式
auth_pass 1111 # 认证密码,主备需一致
}
# 虚拟IP配置
virtual_ipaddress {
192.168.1.200 # 虚拟IP(VIP)
}
# 调用健康检查脚本
track_script {
check_nginx
}
}
# LVS负载均衡规则配置
virtual_server 192.168.1.200 80 {
delay_loop 6 # 健康检查间隔6秒
lb_algo rr # 负载均衡算法(rr:轮询;wrr:加权轮询;lc:最少连接)
lb_kind DR # LVS模式(DR:直接路由;NAT:网络地址转换;TUN:隧道)
persistence_timeout 50 # 会话保持时间50秒(同一客户端50秒内请求分发至同一节点)
protocol TCP # 协议类型
# 后端Web节点1配置
real_server 192.168.1.12 80 {
weight 1 # 权重(值越大,接收请求比例越高)
TCP_CHECK {
connect_timeout 3 # 连接超时3秒
retry 3 # 重试次数3次
delay_before_retry 3 # 重试间隔3秒
}
}
# 后端Web节点2配置
real_server 192.168.1.13 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
配置文件说明
global_defs 部分定义全局配置,router_id 用于标识节点,主备节点需设置不同的值。
vrrp_script 定义健康检查脚本,用于检测 Nginx 等服务是否正常运行。检查失败会降低节点优先级。
vrrp_instance 配置 VRRP 实例,定义主备切换相关参数,包括虚拟 IP、心跳间隔、认证信息等。
virtual_server 配置 LVS 负载均衡规则,定义后端服务器、健康检查、负载均衡算法等参数。
使用注意事项
配置文件中 interface 参数需根据实际网络接口名称修改,可通过 ip addr 命令查看。
主备节点配置的主要区别在于 state 和 priority 参数,备节点应设置为 BACKUP 和较低的优先级。
健康检查脚本 /etc/keepalived/check_nginx.sh 需自行创建并赋予可执行权限。
保存配置文件后,需重启 keepalived 服务使配置生效:
systemctl restart keepalived
7.3.3 配置LVS-BACKUP(192.168.1.11)
备调度器配置与主调度器类似,需修改角色、优先级和节点标识,配置文件/etc/keepalived/keepalived.conf如下:
以下是实现高可用负载均衡的Keepalived配置文件示例,包含主备切换、健康检查及LVS规则:
配置文件内容
global_defs {
router_id LVS_BACKUP
}
vrrp_script check_nginx {
script "/etc/keepalived/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
}
track_script {
check_nginx
}
}
virtual_server 192.168.1.200 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.1.12 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 192.168.1.13 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
关键功能说明
该配置实现了一个备份节点(BACKUP)的Keepalived服务,当主节点失效时会接管虚拟IP 192.168.1.200。通过check_nginx脚本监测Nginx服务状态,若检测失败会降低优先级触发主备切换。
LVS部分配置了DR模式的负载均衡,采用轮询(rr)算法分发请求到192.168.1.12和192.168.1.13两个后端服务器,TCP健康检查确保只有存活节点接收流量。
配套脚本建议
需创建/etc/keepalived/check_nginx.sh健康检查脚本,示例内容:
bash
#!/bin/bash
if ! pgrep -x "nginx" >/dev/null; then
exit 1
else
exit 0
fi
7.3.4 编写健康检查脚本
在两台调度器上创建/etc/keepalived/check_nginx.sh脚本,用于检查Nginx服务状态(若调度器自身也运行Nginx,可检测本地服务;此处主要检查后端节点,脚本可根据需求调整):
以下是根据需求编写的Bash脚本代码,用于检查后端Web节点状态并在双节点故障时停止Keepalived服务:
bash
#!/bin/bash
# 检查后端Web节点1状态
nginx1_status=$(curl -s -w "%{http_code}" http://192.168.1.12 -o /dev/null)
# 检查后端Web节点2状态
nginx2_status=$(curl -s -w "%{http_code}" http://192.168.1.13 -o /dev/null)
# 若两个节点均故障,停止Keepalived,避免脑裂
if [ $nginx1_status -ne 200 ] && [ $nginx2_status -ne 200 ]; then
systemctl stop keepalived
exit 1
fi
exit 0
代码说明
脚本通过curl命令检查两个后端Web节点(192.168.1.12和192.168.1.13)的HTTP状态码
当两个节点都返回非200状态码时,脚本会执行systemctl stop keepalived命令停止Keepalived服务
最后通过exit返回状态码(1表示故障,0表示正常)
使用建议
需要将脚本保存为可执行文件(如check_nginx.sh)并赋予执行权限
建议将该脚本配置为Keepalived的检查脚本,在vrrp_instance配置段中添加track_script参数
可考虑添加日志记录功能以便后续故障排查
给脚本添加执行权限:
bash
chmod +x /etc/keepalived/check_nginx.sh
7.3.5 启动服务并设置开机自启
7.4 后端节点配置LVS DR模式(关键)
由于本次LVS采用DR(直接路由)模式,后端Web节点需配置VIP绑定(仅在回环网卡),避免ARP广播冲突。在两台Web节点上执行以下操作:
创建VIP配置脚本
以下脚本实现VIP绑定、ARP响应控制及开机自启功能:
bash
cat > /etc/init.d/init_lvs.sh << EOF
#!/bin/bash
VIP=192.168.1.200
case "\$1" in
start)
# 绑定VIP到回环网卡
ifconfig lo:0 \$VIP netmask 255.255.255.255 broadcast \$VIP
# 禁止ARP响应
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
;;
stop)
# 解绑VIP
ifconfig lo:0 down
# 恢复ARP响应
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
;;
*)
echo "Usage: \$0 {start|stop}"
exit 1
;;
esac
EOF
设置执行权限与启动
bash
chmod +x /etc/init.d/init_lvs.sh
/etc/init.d/init_lvs.sh start
配置开机自启
bash
echo "/etc/init.d/init_lvs.sh start" >> /etc/rc.local
chmod +x /etc/rc.local
7.5 集群测试验证
7.5.1 负载均衡测试
在客户端电脑打开浏览器,访问虚拟IP(http://192.168.1.200),多次刷新页面,观察页面内容在"Web Server 1"和"Web Server 2"之间切换,说明LVS轮询分发功能正常。
7.5.2 故障切换测试
-
主调度器故障测试 :在LVS-MASTER(192.168.1.10)上执行
systemctl stop keepalived停止服务。在备调度器上执行ip addr,可看到VIP(192.168.1.200)已绑定到备调度器网卡;客户端访问VIP仍正常,说明切换成功。 -
后端节点故障测试 :在Web节点1(192.168.1.12)上执行
systemctl stop nginx停止服务。客户端访问VIP时,页面仅显示"Web Server 2",说明LVS已将故障节点剔除;重启Web节点1的Nginx服务后,页面再次轮询显示,说明节点已重新加入集群。
7.5.3 脑裂测试(可选)
断开主备调度器之间的网络连接,观察是否出现双VIP。若已配置仲裁机制或非抢占模式,应能避免脑裂;若出现双VIP,可通过监控告警脚本自动恢复。
八、总结与展望
LVS+Keepalived组合凭借"高效负载均衡+秒级故障切换"的核心优势,成为企业级高可用架构的经典选择。本文从Keepalived概念、故障切换原理、VRRP协议、核心模块等理论知识入手,结合实战部署过程,完整呈现了集群搭建与验证流程。在实际生产环境中,还需根据业务规模优化配置(如调整LVS算法、增加后端节点、部署仲裁集群等),同时加强监控告警体系建设,确保集群长期稳定运行。
随着云原生技术的发展,LVS+Keepalived也可与Kubernetes等容器编排平台结合,实现容器化业务的高可用负载均衡,为业务的规模化扩张提供更灵活的支撑。