深入理解 LVS-DR 模式与 Keepalived 高可用集群
前言
一、LVS DR 模式负载均衡集群
1. LVS DR 模式工作原理(Direct Routing)
1.1 数据包流向分析
1.2 DR 模式特点
2. DR 模式部署步骤
2.0 环境规划
2.0.1 服务器规划
2.1 配置负载调度器(Director Server)
(1) 系统配置
(2) 配置虚拟IP
(3) 调整内核参数
(4) 配置 LVS 服务及调度
2.2 配置节点服务器(Real Server)
(1) 配置 VIP 到 lo 接口
(2) ARP 参数调整,避免MAC冲突
(3) 安装 Web 服务
2.3 测试 LVS 集群
3. LVS 面试知识点整理
3.1 LVS 三种工作模式
3.2 LVS 调度算法
3.3 Nginx vs LVS vs HAProxy 区别
二、LVS + Keepalived 高可用集群
1. 概念与原理
1.1 Keepalived
1.2 VRRP 工作原理
1.3 Keepalived 主要模块
2. 脑裂问题与防护
2.1 脑裂(Split Brain)
2.2 原因
2.3 防护策略
3. 部署步骤
3.1 环境准备
3.2 安装与配置 LVS + Keepalived
3.2.1 DR 服务器操作
3.2.2 配置 Keepalived
3.2.3 启动服务
3.2.4 内核参数优化
3.3 配置 Web 节点
3.4 测试
3.5 小结与注意事项
前言
在当今高并发互联网应用中,单台服务器往往难以应对巨大的流量压力,且存在单点故障风险。负载均衡技术通过将流量分发到多台服务器,能够有效提升系统处理能力和服务可靠性。
LVS(Linux Virtual Server)作为内核级四层负载均衡器,以其卓越性能成为构建大型集群的首选。其中的DR(Direct Routing)模式通过让真实服务器直接响应客户端请求,避免了负载均衡器成为瓶颈,是实现高性能负载均衡的理想方案。
本文将深入讲解LVS-DR模式的工作原理和部署实践,并详细介绍如何通过Keepalived实现高可用集群,为构建稳定可靠的网络服务提供实用指导。
一、LVS DR 模式负载均衡集群
1. LVS DR 模式工作原理(Direct Routing)
1.1 数据包流向分析
-
客户端 → Director(负载均衡器)
-
客户端发送请求到 VIP(虚拟IP),数据包到达 Director Server 内核空间。
-
-
Director → Real Server(真实服务器)
-
Director 判断数据包目标IP为VIP,是集群服务请求,修改:
-
目标MAC:Real Server MAC
-
源MAC:Director Server MAC
-
-
IP地址保持不变,发送到 Real Server。
-
-
Real Server 处理请求
-
接收报文(目标MAC为自身),通过
lo
接口配置 VIP 处理请求。 -
响应报文源IP为 VIP,目标IP为客户端(CIP),直接发送给客户端。
-
-
客户端接收响应
-
响应报文不经过 Director Server。
-
1.2 DR 模式特点
-
Director Server 与 Real Server 必须在同一物理网络。
-
Real Server 可以使用私有或公网地址。
-
Director 仅作为请求入口,不作为网关。
-
所有请求经过 Director,响应直接由 Real Server 发送。
-
Real Server 的网关不能指向 Director Server。
-
Real Server 的
lo
接口配置 VIP。
2. DR 模式部署步骤
2.0 环境规划
2.0.1 服务器规划
-
DR 服务器:192.168.114.129
-
Web 服务器1:192.168.114.252
-
Web 服务器2:192.168.114.253
-
VIP:192.168.114.180
2.1 配置负载调度器(Director Server)
环境部署
-
IP:
192.168.114.129
-
VIP:
192.168.114.180
(1) 系统配置
bash
systemctl stop firewalld.service systemctl stop iptables.service setenforce 0 modprobe ip_vs yum -y install ipvsadm
(2) 配置虚拟IP
bash
cd /etc/sysconfig/network-scripts/ cp ifcfg-ens33 ifcfg-ens33:0 vim ifcfg-ens33:0 # 内容 DEVICE=ens33:0 ONBOOT=yes IPADDR=192.168.114.180 NETMASK=255.255.255.255 ifup ens33:0 # 开启网卡 ifconfig ens33:0 # 查看网卡
(3) 调整内核参数
bash
vim /etc/sysctl.conf # 添加 net.ipv4.ip_forward = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.ens33.send_redirects = 0 sysctl -p
(4) 配置 LVS 服务及调度
bash
# 如果有报错文件不存在,需要先添加规则再保存 ipvsadm-save > /etc/sysconfig/ipvsadm # 保存导出 ipvsadm-restore < /etc/sysconfig/ipvsadm # 恢复 systemctl start ipvsadm ipvsadm -C ipvsadm -A -t 192.168.114.180:80 -s rr ipvsadm -a -t 192.168.114.180:80 -r 192.168.114.252:80 -g ipvsadm -a -t 192.168.114.180:80 -r 192.168.114.253:80 -g ipvsadm -ln # 查看节点状态,Route代表DR模式
2.2 配置节点服务器(Real Server)
-
IP:
192.168.114.252
、192.168.114.253
(1) 配置 VIP 到 lo
接口
bash
cd /etc/sysconfig/network-scripts/ cp ifcfg-lo ifcfg-lo:0 vim ifcfg-lo:0 # 内容 DEVICE=lo:0 ONBOOT=yes IPADDR=192.168.114.180 NETMASK=255.255.255.255 ifup lo:0 ifconfig lo:0 route add -host 192.168.114.180 dev lo:0
(2) ARP 参数调整,避免MAC冲突
bash
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
(3) 安装 Web 服务
bash
# 选择一种方式安装Web服务 # 1、编译安装nginx # 2、yum install nginx (需要epel-release源) # 3、yum install httpd # 192.168.114.16 echo 'this is 192.168.114.252 web01!' > /var/www/html/index.html # 192.168.114.17 echo 'this is 192.168.114.253 web02!' > /var/www/html/index.html
2.3 测试 LVS 集群
-
在客户端浏览器访问:
http://192.168.114.180/
-
应轮询显示不同节点页面内容。
注意:LVS-DR 用户访问 http://192.168.114.180/
下次刷新时可能有约50秒延迟
3. LVS 面试知识点整理
3.1 LVS 三种工作模式
模式 | 原理 | 优缺点 |
---|---|---|
NAT(VS/NAT) | Director 改变数据包目标IP并转发,RS响应包回到Director再发客户端 | 优点:节点可任意OS;缺点:Director是瓶颈 |
DR(VS/DR) | Director 改变目标MAC地址,RS直接响应客户端 | 优点:Director不处理响应;缺点:节点需与Director同网段 |
TUN(VS/TUN) | Director 封装IP包到隧道,RS解封直接响应客户端 | 优点:Director不处理响应;缺点:节点需支持IP隧道 |
3.2 LVS 调度算法
-
固定调度:rr、wrr、dh、sh
-
动态调度:lc、wlc、lblc
算法 | 描述 |
---|---|
rr | 轮询,每个RS均摊 |
wrr | 加权轮询,权重高的分配多 |
dh | 目的地址哈希分配 |
sh | 源地址哈希分配 |
lc | 最少连接数 |
wlc | 加权最少连接 |
lblc | 基于地址的最少连接 |
3.3 Nginx vs LVS vs HAProxy 区别
特性 | Nginx | LVS (Linux Virtual Server) | HAProxy |
---|---|---|---|
定位 | Web 服务器 + 反向代理 + 负载均衡 | 内核级四层负载均衡 | 专业负载均衡器(四层+七层) |
工作层级 | 四层(TCP)+ 七层(HTTP/HTTPS) | 四层(TCP/UDP,传输层) | 四层 + 七层 |
性能 | 高(软件级,单机可达十万级并发) | 极高(内核态,百万级并发) | 高(接近 Nginx,但更专注负载均衡) |
功能特点 | - 静态资源服务 - 反向代理 - 缓存 - 支持 HTTP/HTTPS 负载均衡 | - 高性能转发 - 调度算法丰富(RR、LC、SH…) - 内核态转发,几乎无性能损耗 | - 专注于负载均衡 - 健康检查更强大 - 支持会话保持、SSL 卸载等 |
健康检查 | 简单(TCP/HTTP) | 依赖 Keepalived 或其他工具 | 强大(多协议、多方式) |
配置复杂度 | 简单 | 较复杂(需 ipvsadm/keepalived 配合) | 中等(配置文件灵活) |
适用场景 | Web 代理、动静分离、中小型集群 | 超大规模集群、核心四层调度 | 高可用集群、对健康检查要求高的业务 |
一句话总结:
-
Nginx:轻量、全能,适合 Web 服务和中小型负载均衡。
-
LVS:极致性能,适合四层超大规模集群,但功能单一。
-
HAProxy:专业负载均衡器,四层+七层都行,健康检查能力最强。
二、LVS + Keepalived 高可用集群
1. 概念与原理
1.1 Keepalived
-
基于 VRRP 协议实现高可用(HA)。
-
初衷是为 LVS 负载均衡提供高可用方案,后来支持其他服务(如 Nginx、MySQL 等)。
-
功能:
-
LVS 集群管理
-
节点健康检查(Health Check)
-
故障自动切换(Failover)
-
高可用 VIP(虚拟 IP)接管
-
1.2 VRRP 工作原理
-
MASTER 节点发送心跳(通告)给 BACKUP 节点。
-
BACKUP 节点收不到心跳时,接管 VIP。
-
MASTER 恢复时,可抢回 VIP(抢占模式)或不抢回(非抢占模式)。
-
默认多播地址:224.0.0.18
-
优先级决定 MASTER 节点(数值越大优先)。
1.3 Keepalived 主要模块
模块 | 功能 |
---|---|
core | 核心进程、配置文件加载解析 |
vrrp | VRRP 协议实现,高可用 |
check | 健康检查,支持 TCP/HTTP/脚本检查 |
2. 脑裂问题与防护
2.1 脑裂(Split Brain)
-
两个节点失去心跳连接,均认为对方挂掉。
-
后果:
-
共享资源冲突
-
数据损坏(如数据库)
-
2.2 原因
-
心跳线故障(断线、老化)
-
网卡/驱动故障
-
心跳网络设备故障
-
仲裁机器异常
-
防火墙阻挡 VRRP
-
配置不一致(virtual_router_id、优先级、实例名)
-
vrrp实例名字不一致、优先级一致
2.3 防护策略
-
双心跳线冗余
-
磁盘锁(锁定共享资源)
-
仲裁机制(Ping 参考 IP)
-
脚本监控报警
3. 部署步骤
3.1 环境准备
-
主 DR:192.168.114.129(MASTER)
-
备 DR:192.168.114.251(BACKUP)
-
VIP:192.168.114.180
-
Web 节点:
-
192.168.114.252
-
192.168.114.253
-
-
客户端:192.168.114.1
3.2 安装与配置 LVS + Keepalived
3.2.1 DR 服务器操作
bash
systemctl stop firewalld setenforce 0 yum -y install ipvsadm keepalived modprobe ip_vs cat /proc/net/ip_vs # 检查模块
3.2.2 配置 Keepalived
-
文件:
/etc/keepalived/keepalived.conf
-
关键配置:
text
global_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 100priority 100 # MASTER 高于 BACKUPadvert_int 1authentication {auth_type PASSauth_pass abc123}virtual_ipaddress {192.168.114.180} } virtual_server 192.168.114.180 80 {delay_loop 6lb_algo rrlb_kind DRpersistence_timeout 50protocol TCPreal_server 192.168.114.252 80 {weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 3}}real_server 192.168.114.253 80 {weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 3}} }
-
VIP 配置:
bash
vim /etc/sysconfig/network-scripts/ifcfg-ens33:0 DEVICE=ens33:0 ONBOOT=yes IPADDR=192.168.114.180 NETMASK=255.255.255.255
-
重启网络:
bash
systemctl restart network ifup ens33:0
3.2.3 启动服务
bash
systemctl start keepalived ip addr # 查看 VIP 是否生效 ipvsadm-save > /etc/sysconfig/ipvsadm systemctl start ipvsadm ipvsadm -ln # 查看 LVS 配置
3.2.4 内核参数优化
bash
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
3.3 配置 Web 节点
bash
systemctl stop firewalld setenforce 0 yum -y install httpd systemctl start httpd echo 'this is kgc web!' > /var/www/html/index.html # 192.168.114.252 echo 'this is benet web!' > /var/www/html/index.html # 192.168.114.253 vim /etc/sysconfig/network-scripts/ifcfg-lo:0 DEVICE=lo:0 ONBOOT=yes IPADDR=192.168.114.180 NETMASK=255.255.255.255 service network restart ifup lo:0 route add -host 192.168.114.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
3.4 测试
-
客户端访问 VIP:
text
http://192.168.114.180/
-
停掉 MASTER Keepalived:
bash
systemctl stop keepalived
-
观察 BACKUP 节点接管 VIP 是否成功。
-
再启动 MASTER,观察 VIP 是否回归(抢占或非抢占模式)。
-
3.5 小结与注意事项
项目 | 注意点 |
---|---|
VIP | DR 节点配置 VIP 网卡 ens33:0,Web 节点配置 lo:0 |
抢占模式 | MASTER 恢复会抢回 VIP,非抢占模式需配置 nopreempt |
健康检查 | Keepalived 支持 TCP/HTTP 检查,可防止故障节点被调度 |
防火墙 | Firewalld 需关闭,确保 VRRP 心跳消息畅通 |
脑裂防护 | 双心跳线、磁盘锁、仲裁 IP、脚本监控 |
通过本文的详细讲解,您应该对 LVS-DR 模式的工作原理、部署步骤以及如何结合 Keepalived 实现高可用集群有了全面的了解。这些知识对于构建高性能、高可用的负载均衡系统至关重要。