前言
在企业级服务器架构中,单点故障是制约系统稳定性的核心痛点。LVS(Linux Virtual Server)作为内核级四层负载均衡工具,凭借高性能成为高并发场景的首选;但 LVS 本身存在调度器单点故障问题,而 Keepalived 基于 VRRP 协议的双机热备机制,完美解决了这一缺陷。本文将以 OpenEuler 系统为基础,结合图片中的核心知识点,从原理剖析、环境规划、详细配置到故障测试,全面讲解 LVS+Keepalived 高可用集群的搭建过程,助力运维人员掌握企业级高可用架构实战技能。
一、LVS+Keepalived 核心理论基础
1.1 LVS 负载均衡技术深度解析
LVS 由章文嵩博士开发,是 Linux 内核原生集成的负载均衡解决方案,工作在内核态,转发性能远超 Nginx、HAProxy 等用户态工具,支持百万级并发请求处理,是大型电商、金融、政务平台的核心负载均衡组件。
1.1.1 LVS 核心架构
LVS 架构包含三层核心节点:
- 负载调度器(Director) :集群入口,负责接收客户端请求并根据调度算法分发至后端真实服务器,核心依赖
ip_vs内核模块。 - 真实服务器(Real Server, RS):后端业务节点,部署具体业务服务(如 Web、数据库),处理实际业务逻辑并返回结果。
- 客户端(Client):发起请求的终端设备,仅需访问调度器的虚拟服务地址,无需感知后端 RS 节点。
1.1.2 LVS 三种工作模式
LVS 支持三种 IP 负载均衡模式,不同模式适配不同业务场景:
- NAT 模式(网络地址转换)
- 原理:调度器修改请求报文的目标 IP 为 RS 的 IP,响应报文经调度器转发至客户端,调度器同时转换源 IP。
- 特点:RS 可使用任意操作系统,调度器承担双向流量,性能瓶颈明显,仅适合小规模集群。
- TUN 模式(IP 隧道)
- 原理:调度器通过 IP 隧道封装请求报文,发送至 RS,RS 解包后直接响应客户端(无需经调度器)。
- 特点:RS 可跨地域部署,支持大规模集群,但隧道封装增加网络开销。
- DR 模式(直接路由)
- 原理:调度器仅修改请求报文的目标 MAC 地址为 RS 的 MAC,IP 地址保持不变;RS 通过本地回环接口绑定 VIP,直接响应客户端。
- 特点:性能最优(仅处理请求流量),支持超大规模集群,是企业主流选择,本文重点讲解 DR 模式。
1.1.3 LVS 核心调度算法
LVS 内置 10 种调度算法,核心分为三类,适配不同业务负载特征:
- 轮询类:rr(轮询)、wrr(加权轮询)------ 均衡分配请求,适合 RS 性能一致的场景。
- 最小连接类:lc(最小连接)、wlc(加权最小连接)------ 优先分配请求至连接数最少的 RS,适合 RS 性能不均的场景。
- 哈希类:dh(目标 IP 哈希)、sh(源 IP 哈希)------ 基于 IP 哈希实现会话绑定,适合有状态业务。
1.2 Keepalived 高可用核心原理
Keepalived 是专为 LVS 设计的高可用工具,核心基于 **VRRP(虚拟路由冗余协议)** 实现双机热备,同时集成健康检查功能,保障集群节点可用性。
1.2.1 VRRP 协议工作机制
VRRP 协议将多台物理服务器虚拟为一个虚拟路由器,共享一个虚拟 IP(VIP),对外提供统一服务入口,核心逻辑如下:
- 角色划分:节点分为 MASTER(主节点)和 BACKUP(备节点),MASTER 持有 VIP 并处理业务,BACKUP 监听 MASTER 状态。
- 优先级选举:通过优先级(1-255)决定主备归属,优先级越高越易成为 MASTER,默认优先级 100。
- 心跳检测:MASTER 每秒发送 VRRP 通告报文(组播地址 224.0.0.18,端口 112),BACKUP 未在 3 倍通告间隔内收到报文时,判定 MASTER 故障,自动接管 VIP(IP 漂移)。
- 状态切换:切换过程对客户端透明,仅需修改 ARP 映射,无需修改客户端路由配置。
1.2.2 Keepalived 核心组件
Keepalived 通过三大组件协同工作,实现高可用与负载均衡一体化:
- VRRP 协议栈:核心组件,负责主备选举、心跳通信、VIP 漂移,是 IP 冗余的基础。
- 健康检查模块(Checkers):实时检测 LVS 调度器和后端 RS 的可用性,支持 TCP 端口检测、HTTP 接口检测、脚本自定义检测,服务故障时自动剔除异常节点。
- IPVS 封装模块 :直接管理 LVS 的
ip_vs规则,无需手动执行ipvsadm命令,实现负载均衡规则与高可用配置统一管理。
1.3 LVS+Keepalived 集群核心价值
- 消除调度器单点故障:双机热备机制确保 MASTER 故障时,BACKUP 秒级接管 VIP,业务无感知恢复。
- 智能节点健康检测:自动剔除故障 RS,避免请求转发至异常节点,提升业务可用性。
- 高性能负载均衡:LVS 内核态转发 + Keepalived 轻量级检测,兼顾性能与高可用,适配高并发场景。
- 零成本扩展:支持横向扩展 RS 节点,无需修改核心架构,满足业务增长需求。
二、环境规划与前置准备
2.1 集群架构设计
本文采用LVS-DR 模式 + Keepalived 双机热备架构,包含 2 台 LVS 调度器、2 台后端 RS 节点,架构图如下(结合图片核心拓扑):
┌─────────────────┐ ┌─────────────────┐
│ 客户端(Client)│ │ 交换机(Switch)│
└────────┬────────┘ └────────┬────────┘
│ │
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ VIP:192.168.1.100 │ │ LVS-MASTER(主)│
│ 对外服务入口 │ │ IP:192.168.1.10│
└────────┬────────┘ │ Keepalived+LVS │
│ └────────┬────────┘
│ │
│ ┌─────────────────┐
│ │ LVS-BACKUP(备)│
│ │ IP:192.168.1.11│
└───────────────▶│ Keepalived+LVS │
└────────┬────────┘
│
┌─────────────────┐ │ ┌─────────────────┐
│ Web-Node1 │◀─────┴─────▶│ Web-Node2 │
│ IP:192.168.1.12│ │ IP:192.168.1.13│
│ 部署Nginx │ │ 部署Nginx │
└─────────────────┘ └─────────────────┘
2.2 服务器 IP 规划
表格
| 节点角色 | IP 地址 | 系统版本 | 核心软件 | 备注 |
|---|---|---|---|---|
| LVS-MASTER | 192.168.1.10 | OpenEuler 24.03 | keepalived、ipvsadm | 主调度器,持有 VIP |
| LVS-BACKUP | 192.168.1.11 | OpenEuler 24.03 | keepalived、ipvsadm | 备调度器,备用 VIP |
| Web-Node1 | 192.168.1.12 | OpenEuler 24.03 | nginx | 后端真实服务器 1 |
| Web-Node2 | 192.168.1.13 | OpenEuler 24.03 | nginx | 后端真实服务器 2 |
| 虚拟 IP(VIP) | 192.168.1.100 | - | - | 对外统一服务入口 |
2.3 前置环境配置(所有节点)
2.3.1 系统基础优化
# 1. 关闭防火墙(生产环境需开放对应端口,测试环境建议关闭)
systemctl stop firewalld
systemctl disable firewalld
# 2. 关闭SELinux
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 3. 配置主机名(便于区分)
hostnamectl set-hostname LVS-MASTER # 主调度器
# 备调度器执行:hostnamectl set-hostname LVS-BACKUP
# Web节点执行:hostnamectl set-hostname Web-Node1/Web-Node2
# 4. 配置hosts解析
cat >> /etc/hosts << EOF
192.168.1.10 LVS-MASTER
192.168.1.11 LVS-BACKUP
192.168.1.12 Web-Node1
192.168.1.13 Web-Node2
EOF
# 5. 重启系统生效(可选)
reboot
2.3.2 内核参数优化(DR 模式必备)
DR 模式下,RS 节点需配置 ARP 参数,避免 ARP 广播冲突,核心参数如下:
# 编辑内核参数配置文件
cat > /etc/sysctl.d/99-lvs-arp.conf << EOF
# 回环接口仅响应目标IP为本地IP的ARP请求
net.ipv4.conf.lo.arp_ignore = 1
# 回环接口不使用源IP发送ARP请求,优先使用发送接口IP
net.ipv4.conf.lo.arp_announce = 2
# 所有接口统一ARP配置
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
# 允许绑定非本地IP(VIP漂移必备)
net.ipv4.ip_nonlocal_bind = 1
EOF
# 生效内核参数
sysctl -p /etc/sysctl.d/99-lvs-arp.conf
三、 后端真实服务器(RS)配置
3.1 Nginx 安装与配置
3.1.1 安装 Nginx
以 OpenEuler 系统为例,安装 Nginx 并配置开机自启:
# 1. 安装Nginx依赖
yum install -y nginx
# 2. 启动Nginx并设置开机自启
systemctl start nginx
systemctl enable nginx
# 3. 验证Nginx状态
systemctl status nginx
curl http://127.0.0.1 # 测试是否正常启动
3.1.2 定制 Web 页面(区分节点)
为两台 RS 节点配置不同的首页内容,便于测试负载均衡效果:
# Web-Node1执行
echo "Web-Node1 - IP: 192.168.1.12" > /usr/share/nginx/html/index.html
# Web-Node2执行
echo "Web-Node2 - IP: 192.168.1.13" > /usr/share/nginx/html/index.html
3.2 RS 节点 VIP 配置(DR 模式核心)
DR 模式下,RS 节点需在回环接口(lo:0)绑定 VIP,仅用于响应客户端请求,不监听客户端连接,配置如下:
# 1. 创建回环接口配置文件
cat > /etc/sysconfig/network-scripts/ifcfg-lo:0 << EOF
DEVICE=lo:0
IPADDR=192.168.1.100
NETMASK=255.255.255.255
ONBOOT=yes
EOF
# 2. 启动回环接口
ifup lo:0
# 3. 验证VIP绑定
ifconfig lo:0 # 查看是否显示192.168.1.100
# 4. 配置路由(禁锢VIP,避免冲突)
route add -host 192.168.1.100 dev lo:0
# 5. 开机自动生效(写入rc.local)
echo "/sbin/route add -host 192.168.1.100 dev lo:0" >> /etc/rc.local
chmod +x /etc/rc.local
四、LVS 调度器配置(主备节点)
4.1 核心软件安装(主备节点通用)
LVS 调度器需安装ipvsadm(LVS 管理工具)和keepalived(高可用工具),OpenEuler 系统直接通过 yum 安装:
# 1. 安装核心软件
yum install -y ipvsadm keepalived
# 2. 加载ip_vs内核模块(LVS核心依赖)
modprobe ip_vs
# 3. 验证内核模块加载
lsmod | grep ip_vs # 显示ip_vs则加载成功
# 4. 设置开机自动加载内核模块
echo "modprobe ip_vs" >> /etc/rc.local
chmod +x /etc/rc.local
# 5. 启动Keepalived服务(主备节点均需启动)
systemctl enable keepalived
systemctl start keepalived
4.2 Keepalived 主节点(LVS-MASTER)配置
Keepalived 核心配置文件为/etc/keepalived/keepalived.conf,主节点配置需指定 MASTER 角色、VIP、LVS 负载均衡规则及健康检查脚本。
4.2.1 主节点完整配置文件
# 备份默认配置文件
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
# 编辑主配置文件
cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived
# 全局配置
global_defs {
# 节点唯一标识,主备节点需不同
router_id LVS_MASTER
# 跳过相同主节点的VRRP通告地址检查(提升效率)
vrrp_skip_check_adv_addr
# 严格遵循VRRP协议
vrrp_strict
# VRRP进程优先级
vrrp_priority 10
# 健康检查进程优先级
checker_priority 10
}
# 定义健康检查脚本(检测后端RS可用性)
vrrp_script check_real_server {
# 脚本路径:检测80端口是否存活,失败则降低优先级
script "kill -0 1 && nc -z 127.0.0.1 80 || exit 1"
# 检查间隔:1秒
interval 1
# 超时时间:3秒
timeout 3
# 失败后优先级降低20
weight -20
# 连续2次成功判定正常
rise 2
# 连续3次失败判定故障
fall 3
}
# VRRP实例配置(主备节点需一致)
vrrp_instance VI_1 {
# 角色:主节点
state MASTER
# 承载VIP的网卡(根据实际环境修改,如eth0、ens33)
interface eth0
# 虚拟路由ID,主备必须一致
virtual_router_id 51
# 优先级:主节点高于备节点
priority 120
# 心跳通告间隔:1秒
advert_int 1
# 认证配置
authentication {
# 认证类型:密码认证
auth_type PASS
# 认证密码:主备必须一致
auth_pass 123456
}
# 虚拟IP(VIP):主备节点一致
virtual_ipaddress {
192.168.1.100/24 dev eth0
}
# 关联健康检查脚本
track_script {
check_real_server
}
# 抢占延迟:主节点恢复后,60秒后再抢占VIP(避免频繁切换)
preempt_delay 60
}
# LVS虚拟服务器配置(DR模式)
virtual_server 192.168.1.100 80 {
# 延迟循环:1秒
delay_loop 2
# 负载均衡算法:加权轮询
lb_algo wrr
# 转发模式:DR模式
lb_kind DR
# 持久化超时时间:0(关闭会话保持)
persistence_timeout 0
# 协议:TCP
protocol TCP
# 后端真实服务器1(Web-Node1)
real_server 192.168.1.12 80 {