当前位置: 首页 > news >正文

构建高可用 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 地址
Director192.168.10.150
Real Server1192.168.10.100
Real Server2192.168.10.80
VIP192.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 测试验证

  • 浏览器访问:http://192.168.10.180

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

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

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


📚 三、LVS 面试知识点速览

3.1 三种工作模式对比

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

3.2 常用调度算法

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

3.3 LVS vs Nginx vs HAProxy

特性LVSNginxHAProxy
工作层级四层四/七层四/七层
性能极高(内核态)
健康检查依赖 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 地址
MASTER192.168.10.150
BACKUP192.168.10.160
VIP192.168.10.180
Web1/Web2192.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.confglobal_defs {router_id LVS_01        # MASTER 为 LVS_01,BACKUP 为 LVS_02smtp_server 127.0.0.1
}vrrp_instance VI_1 {state MASTER            # BACKUP 节点写 BACKUPinterface ens33virtual_router_id 10priority 100            # MASTER 高于 BACKUPadvert_int 1authentication {auth_type PASSauth_pass abc123}virtual_ipaddress {192.168.10.180  # 这里的VIP虚拟地址要改一下}
}virtual_server 192.168.10.180 80 {delay_loop 6lb_algo rrlb_kind DRpersistence_timeout 50protocol TCPreal_server 192.168.10.100 80 {   # 这里的地址要改一下weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 3}}real_server 192.168.10.80 80 {    # 这里的地址要改一下weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 3}}
}

Keepalived 配置示例(BACKUP)

global_defs {router_id LVS_02  # 这里改成LVS_02smtp_server 127.0.0.1
}vrrp_instance VI_1 {state BACKUP     # 这里改成BACKUPinterface ens33virtual_router_id 10priority 80   # 优先级改的要比MASTER要小就可以了  advert_int 1authentication {auth_type PASSauth_pass abc123}virtual_ipaddress {192.168.10.180   # IP地址记得改一下}
}virtual_server 192.168.10.180 80 {delay_loop 6lb_algo rrlb_kind DRpersistence_timeout 50protocol TCPreal_server 192.168.10.100 80 {   # 这里的IP地址要改一下weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 3}}real_server 192.168.10.80 80 {   # 这里的IP地址改一下weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 3}}
}

VIP 配置

vim /etc/sysconfig/network-scripts/ifcfg-ens33:0DEVICE=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 httpdecho '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.80vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255service network restart
ifup lo:0
route add -host 192.168.10.180 dev lo:0vim /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 配置、脑裂防护、防火墙设置

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

http://www.dtcms.com/a/392563.html

相关文章:

  • 网络协议总结
  • Python多线程爬虫加速电商数据采集
  • JVM之直接内存(Direct Memory)
  • 深入理解C指针(四):回调函数与qsort——指针实战的终极舞台
  • 翻拍图像检测(即拍摄屏幕的照片)功能实现思路
  • 【Linux】进程概念(上):从冯诺依曼到进程入门
  • 计算机视觉(opencv)实战二十八——基于 OpenCV CSRT 跟踪器的实时目标
  • 【Mysql】深分页问题、页分裂问题、加密/解密、执行计划
  • 【名人简历】牛顿
  • coze开发的牙科AI智能体助手web页面
  • JavaEE初阶——从入门到掌握线程安全
  • GitHub热门大数据项目:基于人体生理指标管理的可视化分析系统技术解析
  • 零基础学Docker(2)--基本命令
  • 华为FusionCloud私有云:企业数字化转型的智能底座
  • 【LVS入门宝典】LVS NAT模式深度解析:从原理到实战配置指南
  • MQ 项目(实习项目,初步更新)
  • Redis中Lua脚本的应用场景分析
  • phpkg 让 PHP 摆脱 Composer 依赖地狱
  • Python -- 人生重开模拟器(简易版)
  • CSS基础查缺补漏(持续更新补充)
  • 用户生命周期价值(CLV)目标变量系统性设计与实践(二)
  • TDengine 与工业应用平台 Ignition 集成
  • JVM垃圾收集中判断对象存活相关问题
  • 【C++】告别“类型转换”踩坑,从基础到四种核心强制转换方式
  • WinDivert学习文档之五-————编程API(八)
  • 【LVS入门宝典】LVS NAT模式深度解析:流量走向与IP包头修改机制
  • 第二章 微调:定制专属模型——从通用能力到场景适配
  • 为统信UOS2.0离线安装python3.11.9开发环境
  • Maven 进阶:依赖管理的 “坑” 与解决方案
  • 2.15Vue全家桶-VueRouter