LVS+Keepalived高可用集群深度解析与实战部署

目录

前言

一、Keepalived核心概念详解

[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)架构)

二、Keepalived高可用故障切换原理

三、VRRP通信原理:高可用的底层支撑

[3.1 VRRP核心概念](#3.1 VRRP核心概念)

[3.2 VRRP工作流程](#3.2 VRRP工作流程)

四、Keepalived体系:核心模块及其作用

五、Keepalived服务器工作原理总览

六、Keepalived脑裂:成因与解决方法

[6.1 脑裂成因分析](#6.1 脑裂成因分析)

[6.2 脑裂解决方法](#6.2 脑裂解决方法)

七、实战部署:LVS+Keepalived高可用集群

[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协议实现,其核心流程可分为"心跳检测-状态判定-资源接管"三个阶段,具体原理如下:

  1. 初始状态选举:集群启动时,主备节点根据优先级进行角色选举。优先级范围为0-255,优先级高的节点成为主节点;若优先级相同,则IP地址更大的节点当选主节点。主节点会立即绑定虚拟IP(VIP),并对外发送ARP广播,告知局域网内其他设备VIP与主节点MAC的映射关系。

  2. 实时心跳监测:主节点会以固定间隔(默认1秒)向备用节点发送VRRP心跳报文,报文中包含主节点的优先级等信息。备用节点通过指定端口(默认112)监听心跳报文,若在设定超时时间(默认3秒)内未收到心跳,则判定主节点故障。

  3. 故障切换执行:备用节点判定主节点故障后,立即切换为MASTER状态,执行以下操作:① 绑定虚拟IP(VIP);② 发送ARP广播,更新局域网内设备的ARP缓存,将VIP映射至自身MAC地址;③ 开始对外提供服务并发送心跳报文。

  4. 故障恢复衔接:若启用"抢占模式"(默认开启),当原主节点故障恢复后,会通过心跳报文发现当前主节点的优先级低于自身,便会重新抢占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工作流程

  1. 备份组初始化:同一备份组内的所有节点启动后,根据配置的VRID和优先级进入初始化状态(Initialize),随后开始角色选举。

  2. 角色选举机制:选举遵循三个优先级规则:① 若某节点的IP与VIP相同(IP拥有者),则直接成为MASTER;② 无IP拥有者时,优先级高的节点当选;③ 优先级相同时,IP地址大的节点当选。

  3. MASTER运行状态:MASTER节点进入工作状态后,执行以下操作:① 响应ARP请求时使用虚拟MAC地址;② 处理客户端的路由转发请求;③ 每隔1秒发送VRRP心跳报文,告知备份组内节点自身状态。

  4. BACKUP监听状态:BACKUP节点进入监听状态,仅接收MASTER的心跳报文,不响应ARP请求和路由转发。若连续3个心跳周期未收到报文,则判定MASTER故障,触发新的选举。

  5. 故障切换与恢复:新MASTER选举产生后,立即接管VIP并对外提供服务。原MASTER恢复后,根据抢占模式决定是否重新夺权,实现集群状态的动态平衡。

四、Keepalived体系:核心模块及其作用

Keepalived的架构采用模块化设计,核心由四大模块组成,各模块协同工作实现高可用功能,具体分工如下:

  1. Core模块(核心模块):Keepalived的"大脑",负责主进程的启动、维护以及全局配置文件的加载与解析。它统筹管理其他所有模块,监控模块运行状态,当某模块异常退出时,Core模块会自动重启该模块,保障整个服务的稳定性。

  2. Check模块(健康检查模块):实现集群节点健康检查的核心模块,支持Layer3、Layer4、Layer5等多层检测机制。Check模块定期执行检测任务,将节点状态(正常/故障)反馈给VRRP模块,为故障切换提供决策依据。同时,它还支持解析LVS配置,实现对LVS后端节点的动态管理。

  3. VRRP模块(协议模块):Keepalived实现高可用的核心动力,负责VRRP协议的封装、发送与解析。它根据Check模块反馈的节点状态,触发主备角色切换逻辑,完成虚拟IP(VIP)的绑定与释放、ARP广播的发送等关键操作,确保故障切换的顺利执行。

  4. IPVS模块(LVS管理模块):基于Linux内核的IPVS模块封装实现,负责LVS集群的配置与管理。通过解析配置文件中的LVS规则,IPVS模块可动态添加、删除后端节点,调整负载均衡算法(如轮询、加权轮询、最少连接等),实现LVS负载均衡的自动化管理。

五、Keepalived服务器工作原理总览

结合上述模块与协议,Keepalived服务器的完整工作流程可概括为"初始化-监控-决策-执行"四个阶段:

  1. 初始化阶段:Keepalived启动后,Core模块加载并解析配置文件(默认/etc/keepalived/keepalived.conf),初始化Core、Check、VRRP、IPVS四大模块。VRRP模块根据配置组建备份组,选举MASTER和BACKUP角色;IPVS模块配置LVS负载均衡规则,添加后端节点;Check模块初始化健康检查任务。

  2. 监控阶段:系统稳定运行时,Check模块按配置周期执行健康检查(如Ping节点、检测端口、调用脚本等),实时采集主节点自身及后端业务节点的状态;同时,VRRP模块中MASTER节点定期发送心跳报文,BACKUP节点持续监听。

  3. 决策阶段:当Check模块检测到主节点自身故障(如核心服务崩溃)或后端节点故障时,立即将状态信息同步给VRRP模块。若为自身故障,主节点主动切换为BACKUP状态;若为后端节点故障,IPVS模块将其从分发列表中剔除。当BACKUP节点未收到MASTER心跳时,VRRP模块判定主节点故障,决策执行切换。

  4. 执行阶段:VRRP模块执行故障切换,BACKUP节点升级为MASTER,绑定VIP并发送ARP广播;IPVS模块同步更新负载均衡规则,继续对外提供服务。整个过程由模块协同完成,无需人工干预。

六、Keepalived脑裂:成因与解决方法

脑裂(Split Brain)是Keepalived主备架构中最常见的异常问题,指主备节点因心跳通信中断,各自判定对方故障,同时抢占虚拟IP(VIP)对外提供服务,导致集群出现"双主"状态。这会造成客户端请求混乱、数据不一致等严重问题,需重点防范。

6.1 脑裂成因分析

  • 网络链路故障:主备节点之间的网络线路中断(如交换机故障、网线松动),导致心跳报文无法传递,双方均判定对方故障。

  • 防火墙规则限制:主备节点之间未开放VRRP协议的组播端口(默认112),导致心跳报文被防火墙拦截。

  • Keepalived服务异常:主节点Keepalived服务崩溃但系统未宕机,无法发送心跳报文,备用节点触发切换后,主节点服务恢复并重新抢占VIP。

  • 资源耗尽:主节点因CPU、内存、磁盘IO耗尽,导致无法正常发送心跳报文,被备用节点判定为故障。

6.2 脑裂解决方法

  1. 双链路冗余:为主备节点配置两条独立的网络链路(如主链路用以太网、备用链路用光纤),降低网络中断的概率。即使一条链路故障,另一条链路仍可传递心跳报文。

  2. 开放防火墙规则 :在主备节点的防火墙中放行VRRP组播地址(224.0.0.18)和端口(112),确保心跳报文正常传输。以iptables为例,可添加规则:iptables -A INPUT -d 224.0.0.18 -p vrrp -j ACCEPT

  3. 部署第三方仲裁机制:引入独立的仲裁节点(如ZooKeeper、Redis或专用仲裁服务器),主备节点需同时向仲裁节点报告状态。当主备节点心跳中断时,通过仲裁节点判定真实状态,避免双方同时抢占VIP。例如,主备节点定期向仲裁节点发送心跳,若仲裁节点仅收到备用节点心跳,则允许其切换为主节点。

  4. 启用抢占延迟与非抢占模式 :在配置文件中设置抢占延迟(preempt_delay) ,让原主节点故障恢复后,延迟一段时间再抢占VIP(如设置为60秒),给备用节点足够的时间同步状态;对于业务不允许频繁切换的场景,可启用非抢占模式(nopreempt),让备用节点切换为主节点后,原主节点恢复后保持BACKUP状态,需人工干预恢复主角色。

  5. 监控告警与自动恢复:通过监控工具(如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的系统上安装keepalivedipvsadm,并加载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 命令查看。

主备节点配置的主要区别在于 statepriority 参数,备节点应设置为 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 故障切换测试

  1. 主调度器故障测试 :在LVS-MASTER(192.168.1.10)上执行systemctl stop keepalived停止服务。在备调度器上执行ip addr,可看到VIP(192.168.1.200)已绑定到备调度器网卡;客户端访问VIP仍正常,说明切换成功。

  2. 后端节点故障测试 :在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等容器编排平台结合,实现容器化业务的高可用负载均衡,为业务的规模化扩张提供更灵活的支撑。

相关推荐
m0_488777651 天前
LVS+Keepalived群集
lvs·keepalived
youxiao_902 天前
LVS负载均衡集群与LVS+Keepalived集群
运维·负载均衡·lvs
LucidX2 天前
LVS DR模式工作原理群集部署
lvs
2501_939909052 天前
LVS+Keepalived群集
lvs
伞啊伞2 天前
安装与配置 LVS + Keepalived
lvs
默恋~微凉2 天前
LVS+keepalived
lvs
伞啊伞2 天前
LVS-DR 模式负载均衡群集
智能路由器·负载均衡·lvs
不想画图2 天前
负载均衡——LVS+Keepalived群集部署
运维·负载均衡·lvs
可爱又迷人的反派角色“yang”3 天前
LVS+Keepalived群集
linux·运维·服务器·前端·nginx·lvs