构建高可用 LVS-DR + Keepalived 负载均衡集群实战指南

✅ 一、LVS-DR 模式概述

1.1 工作原理(Direct Routing)

  1. 客户端请求发送到 VIP(虚拟 IP),到达 Director。

  2. Director 修改目标 MAC 地址为 Real Server MAC,IP 地址不变

  3. Real Server 收到请求,通过 lo 接口配置 VIP 处理请求。

  4. Real Server 直接响应客户端,不经过 Director

1.2 DR 模式特点

  • Director 与 Real Server 必须在同一局域网。

  • Real Server 网关不能指向 Director。

  • 响应报文由 Real Server 直接发送给客户端。

  • Real Server 需配置 VIP 到 lo 接口,并抑制 ARP 响应。


🧱 二、LVS-DR 模式部署步骤

2.1 环境规划

角色 IP 地址
Director 192.168.10.150
Real Server1 192.168.10.100
Real Server2 192.168.10.80
VIP 192.168.10.180

2.2 Director 配置步骤

① 系统初始化
复制代码
systemctl stop firewalld
setenforce 0
modprobe ip_vs
yum install -y ipvsadm
② 配置虚拟 IP(VIP)
复制代码
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-ens33:0
vim ifcfg-ens33:0
---
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255
---
ifup ens33:0
③ 内核参数优化
复制代码
vim /etc/sysctl.conf
---
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
---
sysctl -p
④ 配置 LVS 转发规则
复制代码
ipvsadm -C
ipvsadm -A -t 192.168.10.180:80 -s rr
ipvsadm -a -t 192.168.10.180:80 -r 192.168.10.100:80 -g
ipvsadm -a -t 192.168.10.180:80 -r 192.168.10.80:80 -g
ipvsadm -ln

2.3 Real Server 配置步骤

① 配置 VIP 到 lo:0
复制代码
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
---
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255
---
ifup lo:0
route add -host 192.168.10.180 dev lo:0
② 抑制 ARP 响应
复制代码
vim /etc/sysctl.conf
---
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
---
sysctl -p
参数 作用
arp_ignore = 1 只响应本接口 IP 的 ARP 请求 防止 Real Server 响应 VIP 的 ARP 请求
arp_announce = 2 不使用非本地接口地址作为 ARP 源 防止 Real Server 主动用 VIP 发起 ARP
③ 安装 Web 服务
复制代码
yum install -y httpd
systemctl start httpd

# RS1
echo "this is 192.168.10.100 web01!" > /var/www/html/index.html

# RS2
echo "this is 192.168.10.80 web02!" > /var/www/html/index.html

2.4 测试验证

等50s后,它可能会转到第二个网页(也有可能转不到)

  • 注意:若启用 persistence_timeout 50,则 50 秒内同一客户端会固定访问同一节点。

📚 三、LVS 面试知识点速览

3.1 三种工作模式对比

模式 原理简述 优缺点
NAT Director 修改目标 IP 并转发 简单但性能瓶颈在 Director
DR 修改目标 MAC,RS 直接响应客户端 性能高,但要求同网段
TUN 封装 IP 隧道,RS 解封后响应 可跨网段,但需支持隧道协议

3.2 常用调度算法

算法 描述
rr 轮询
wrr 加权轮询
lc 最少连接
wlc 加权最少连接
sh 源地址哈希
dh 目标地址哈希

3.3 LVS vs Nginx vs HAProxy

特性 LVS Nginx HAProxy
工作层级 四层 四/七层 四/七层
性能 极高(内核态)
健康检查 依赖 Keepalived 支持 强大
配置复杂度 中等
场景 大规模四层调度 Web 服务、反向代理 专业负载均衡

🔄 四、LVS + Keepalived 高可用方案

4.1 Keepalived 核心功能

  • 基于 VRRP 实现 VIP 漂移

  • 支持 LVS 集群管理

  • 提供健康检查(TCP/HTTP)

  • 实现故障自动切换(Failover)


4.2 脑裂问题与防护

什么是脑裂?

两台节点因心跳中断,同时认为自己是 MASTER,导致 VIP 冲突、服务异常。

常见原因
  • 心跳线故障

  • 防火墙拦截 VRRP

  • 配置不一致(如 virtual_router_id

防护策略
  • 双心跳线冗余

  • 配置仲裁 IP(如网关)

  • 使用磁盘锁或脚本监控

  • 保证防火墙放行 VRRP(多播地址:224.0.0.18)


🧪 五、LVS + Keepalived 部署结构

角色 IP 地址
MASTER 192.168.10.150
BACKUP 192.168.10.160
VIP 192.168.10.180
Web1/Web2 192.168.10.100 /192.168.10.80

DR服务器的配置

复制代码
systemctl stop firewalld
setenforce 0
yum -y install ipvsadm keepalived
modprobe ip_vs
cat /proc/net/ip_vs  # 检查模块

Keepalived 配置示例(MASTER)

复制代码
vim /etc/keepalived/keepalived.conf

global_defs {
    router_id LVS_01        # MASTER 为 LVS_01,BACKUP 为 LVS_02
    smtp_server 127.0.0.1
}

vrrp_instance VI_1 {
    state MASTER            # BACKUP 节点写 BACKUP
    interface ens33
    virtual_router_id 10
    priority 100            # MASTER 高于 BACKUP
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass abc123
    }
    virtual_ipaddress {
        192.168.10.180  # 这里的VIP虚拟地址要改一下
    }
}

virtual_server 192.168.10.180 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP
    real_server 192.168.10.100 80 {   # 这里的地址要改一下
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.10.80 80 {    # 这里的地址要改一下
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

Keepalived 配置示例(BACKUP)

复制代码
global_defs {
    router_id LVS_02  # 这里改成LVS_02
    smtp_server 127.0.0.1
}

vrrp_instance VI_1 {
    state BACKUP     # 这里改成BACKUP
    interface ens33
    virtual_router_id 10
    priority 80   # 优先级改的要比MASTER要小就可以了  
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass abc123
    }
    virtual_ipaddress {
        192.168.10.180   # IP地址记得改一下
    }
}

virtual_server 192.168.10.180 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP
    real_server 192.168.10.100 80 {   # 这里的IP地址要改一下
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.10.80 80 {   # 这里的IP地址改一下
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

VIP 配置

复制代码
vim /etc/sysconfig/network-scripts/ifcfg-ens33:0

DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255

重启网络

复制代码
systemctl restart network
ifup ens33:0

启动服务

复制代码
systemctl start keepalived
ip addr  # 查看 VIP 是否生效
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
ipvsadm -ln  # 查看 LVS 配置

内核参数优化

复制代码
vim /etc/sysctl.conf
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
sysctl -p

配置 Web 节点

当然我这里是按照前面的做的,并没有按照下面的代码做的

复制代码
systemctl stop firewalld
setenforce 0
yum -y install httpd
systemctl start httpd

echo 'this is kgc web!' > /var/www/html/index.html  # 192.168.10.100
echo 'this is benet web!' > /var/www/html/index.html  # 192.168.10.80

vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255

service network restart
ifup lo:0
route add -host 192.168.10.180 dev lo:0

vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
sysctl -p

测试

客户端访问 VIP:http://192.168.10.180/

  • 应轮询显示不同节点页面内容。

等50s后,它可能会转到第二个网页(也有可能转不到)

  • 注意:若启用 persistence_timeout 50,则 50 秒内同一客户端会固定访问同一节点。

停掉 MASTER Keepalived:

systemctl stop keepalived

查询ip

复制代码
ip addr

192.168.10.150

没有发现192.168.10.180这个虚拟IP

192.168.10.160

现在192.168.10.160获得虚拟IP

重启之后

systemctl start keepalived

192.168.10.150重新获得IP地址

✅ 六、总结与建议

  • LVS-DR 是性能最优的四层负载均衡方式。

  • Keepalived 提供高可用保障,避免单点故障。

  • 注意 ARP 抑制、VIP 配置、脑裂防护、防火墙设置

  • 健康检查和日志监控是生产环境必不可少的部分。

相关推荐
神奇的程序员4 小时前
从已损坏的备份中拯救数据
运维·后端·前端工程化
虾..5 小时前
Linux 软硬链接和动静态库
linux·运维·服务器
Evan芙5 小时前
Linux常见的日志服务管理的常见日志服务
linux·运维·服务器
玄斎6 小时前
MySQL 单表操作通关指南:建库 / 建表 / 插入 / 增删改查
运维·服务器·数据库·学习·程序人生·mysql·oracle
trayvontang7 小时前
Nginx之location配置
运维·nginx
十六年开源服务商7 小时前
WordPress定制开发最佳公司的用户画像
运维
世岩清上8 小时前
AI驱动的智能运维:从自动化到自主化的技术演进与架构革新
运维·人工智能·自动化
张童瑶8 小时前
Linux SSH隧道代理转发及多层转发
linux·运维·ssh
石小千9 小时前
Linux安装OpenProject
linux·运维
Lime-30909 小时前
制作Ubuntu 24.04-GPU服务器测试系统盘
linux·运维·ubuntu