LVS负载均衡群集详解:NAT与DR模式部署指南
一、LVS简介
LVS(Linux Virtual Server)是一个基于Linux内核的高性能、高可用性的负载均衡解决方案。它能够将多台服务器组成一个虚拟服务器,为客户端提供统一的服务入口,并通过多种调度算法将请求分发到后端真实服务器上。
二、ipvsadm工具选项说明
选项 | 说明 |
---|---|
-A | 添加虚拟服务器 |
-D | 删除整个虚拟服务器 |
-s | 指定负载调度算法(rr、wrr、lc、wlc) |
-a | 添加真实服务器(节点服务器) |
-d | 删除某一个节点 |
-t | 指定VIP地址及TCP端口 |
-r | 指定RIP地址及TCP端口 |
-m | 使用NAT群集模式 |
-g | 使用DR模式 |
-i | 使用TUN模式 |
-w | 设置权重(权重为0时表示暂停节点) |
-p 60 | 保持长连接60秒 |
-l | 列表查看LVS虚拟服务器 |
-n | 以数字形式显示地址、端口等信息 |
三、NAT模式LVS负载均衡群集部署
环境准备
- 负载调度器:内网关ens33:192.168.10.19,外网关ens37:10.0.0.1
- Web节点服务器1:192.168.10.16
- Web节点服务器2:192.168.10.17
- NFS服务器:192.168.10.18
- 客户端:10.0.0.12
1. 部署共享存储(NFS服务器)
bash
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0
yum install nfs-utils rpcbind -y
systemctl start rpcbind.service
systemctl start nfs.service
mkdir /opt/kgc /opt/benet
chmod 777 /opt/kgc /opt/benet
echo 'this is kgc web!' > /opt/kgc/index.html
echo 'this is benet web!' > /opt/benet/index.html
vim /etc/exports
/usr/share *(ro,sync)
/opt/kgc 192.168.10.0/24(rw,sync)
/opt/benet 192.168.10.0/24(rw,sync)
exportfs -rv
2. 配置节点服务器
bash
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0
yum install httpd -y
systemctl start httpd.service
systemctl enable httpd.service
yum install nfs-utils rpcbind -y
showmount -e 192.168.10.18
# 192.168.10.16节点
mount.nfs 192.168.10.18:/opt/kgc /var/www/html
# 192.168.10.17节点
mount.nfs 192.168.10.18:/opt/benet /var/www/html
3. 配置负载调度器
bash
# 配置SNAT转发规则
echo '1' > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o ens37 -j SNAT --to-source 10.0.0.1
# 加载LVS内核模块
modprobe ip_vs
cat /proc/net/ip_vs
# 安装ipvsadm
yum -y install ipvsadm
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm.service
# 配置负载分配策略
ipvsadm -C
ipvsadm -A -t 10.0.0.1:80 -s rr
ipvsadm -a -t 10.0.0.1:80 -r 192.168.10.16:80 -m
ipvsadm -a -t 10.0.0.1:80 -r 192.168.10.17:80 -m
ipvsadm
4. 测试效果
在客户端(10.0.0.12)使用浏览器访问http://10.0.0.1/,不断刷新浏览器测试负载均衡效果。
四、DR模式LVS负载均衡群集部署
环境准备
- DR服务器:192.168.10.18
- Web服务器1:192.168.10.16
- Web服务器2:192.168.10.17
- VIP:192.168.10.180
- 客户端:192.168.10.200
1. 配置负载调度器
bash
# 配置虚拟IP地址
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-ens33:0
vim ifcfg-ens33:0 # 配置VIP:192.168.10.180
ifup ens33:0
# 调整proc响应参数
vim /etc/sysctl.conf # 设置相关参数为0
sysctl -p
# 配置负载分配策略
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
ipvsadm -C
ipvsadm -A -t 192.168.10.180:80 -s rr
ipvsadm -a -t 192.168.10.180:80 -r 192.168.10.16:80 -g
ipvsadm -a -t 192.168.10.180:80 -r 192.168.10.17:80 -g
2. 配置节点服务器
bash
# 配置虚拟IP地址
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0 # 配置VIP:192.168.10.180
ifup lo:0
route add -host 192.168.10.180 dev lo:0
# 调整内核的ARP响应参数
vim /etc/sysctl.conf # 设置arp_ignore和arp_announce参数
sysctl -p
3. 测试LVS群集
在客户端使用浏览器访问http://192.168.10.180/
五、LVS工作模式对比
模式 | 优点 | 缺点 |
---|---|---|
NAT模式 | 配置简单,支持任何TCP/IP系统 | 性能瓶颈,扩展性有限 |
DR模式 | 高性能,响应直接返回客户端 | 需要在同一局域网环境 |
TUN模式 | 高性能,可跨网络部署 | 需要服务器支持IP隧道 |
六、LVS调度算法
固定调度算法
- rr:轮询算法
- wrr:加权轮询调度
- dh:目的地址哈希调度
- sh:源地址哈希调度
动态调度算法
- wlc:加权最小连接数调度
- lc:最小连接数调度
- lblc:基于地址的最小连接数调度
七、总结
LVS是一个强大且灵活的负载均衡解决方案,支持多种工作模式和调度算法,能够满足不同场景下的负载均衡需求。NAT模式适合简单环境,DR模式适合高性能要求的场景,TUN模式则适用于跨网络环境的部署。在实际应用中,需要根据具体需求选择合适的工作模式和调度算法。
LVS-DR模式负载均衡群集详解:原理、部署与优化
一、DR模式工作原理
数据包流向分析
- 客户端请求阶段:客户端发送请求到Director Server(负载均衡器),请求数据报文的源IP是CIP,目标IP是VIP
- 负载均衡处理:Director Server和Real Server在同一个网络中,数据通过二层数据链路层传输
- 报文重封装 :内核空间判断数据包目标IP是本机VIP,IPVS比对请求服务是否为集群服务,是则重新封装数据包:
- 修改源MAC地址为Director Server的MAC地址
- 修改目标MAC地址为Real Server的MAC地址
- 源IP地址与目标IP地址保持不变
- Real Server处理:Real Server接收报文后,重新封装响应报文(源IP为VIP,目标IP为CIP),通过lo接口传送给物理网卡发出
- 响应直接返回:Real Server直接将响应报文传送到客户端,不经过Director Server
DR模式特点
- 网络要求:Director Server和Real Server必须在同一物理网络中
- 地址灵活性:Real Server可以使用私有地址或公网地址
- 入口角色:Director Server作为群集访问入口,但不作为网关使用
- 流量分离:请求报文经过Director Server,响应报文直接返回客户端
- 路由限制:Real Server的网关不能指向Director Server IP
- 接口配置:Real Server的lo接口需要配置VIP地址
二、DR模式部署实战
环境规划
角色 | IP地址 | 说明 |
---|---|---|
DR服务器 | 192.168.10.23 | 负载调度器 |
Web服务器1 | 192.168.10.16 | 节点服务器 |
Web服务器2 | 192.168.10.17 | 节点服务器 |
VIP | 192.168.10.180 | 虚拟IP地址 |
客户端 | 192.168.10.200 | 测试客户端 |
NFS服务器 | 192.168.10.19 | 共享存储 |
1. 配置负载调度器(192.168.10.23)
bash
# 基础环境配置
systemctl stop firewalld.service
setenforce 0
modprobe ip_vs
cat /proc/net/ip_vs
yum -y install ipvsadm
# 配置虚拟IP地址(VIP)
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-ens33:0
vim ifcfg-ens33:0
ini
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255
bash
ifup ens33:0
ifconfig ens33:0
# 调整proc响应参数
vim /etc/sysctl.conf
ini
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
bash
sysctl -p
# 配置负载分配策略
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
ipvsadm -C
ipvsadm -A -t 192.168.10.180:80 -s rr
ipvsadm -a -t 192.168.10.180:80 -r 192.168.10.16:80 -g
ipvsadm -a -t 192.168.10.180:80 -r 192.168.10.17:80 -g
ipvsadm
# 查看节点状态
ipvsadm -ln
2. 配置节点服务器(192.168.10.16、192.168.10.17)
bash
# 基础环境配置
systemctl stop firewalld.service
setenforce 0
# 配置虚拟IP地址(VIP)
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
ini
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255
bash
ifup lo:0
ifconfig lo:0
# 添加路由规则
route add -host 192.168.10.180 dev lo:0
# 设置开机自启动
vim /etc/rc.local
bash
/sbin/route add -host 192.168.10.180 dev lo:0
bash
chmod +x /etc/rc.d/rc.local
# 调整内核ARP响应参数
vim /etc/sysctl.conf
ini
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
bash
sysctl -p
# 安装必要服务
yum -y install nfs-utils rpcbind httpd
systemctl start rpcbind
systemctl start httpd
# 挂载共享存储(以192.168.10.16为例)
mount.nfs 192.168.10.19:/opt/kgc /var/www/html
echo 'this is kgc web!' > /var/www/html/index.html
# 192.168.10.17节点
mount.nfs 192.168.10.19:/opt/benet /var/www/html
echo 'this is benet web!' > /var/www/html/index.html
3. 路由命令详解
bash
route add -host 192.168.10.180 dev lo:0
- route: 管理系统路由表的命令
- add: 添加新路由规则
- -host 192.168.10.180: 指定目标为主机地址
- dev lo:0: 指定数据包通过lo:0虚拟接口传输
作用: 将目标IP地址192.168.10.180指向本地回环接口的虚拟接口lo:0,使访问该IP的数据流量不会离开本地计算机。
4. ARP参数说明
- arp_ignore = 1: 系统只响应目的IP为本地IP的ARP请求
- arp_announce = 2: 系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址
三、LVS工作模式对比
特性 | NAT模式 | DR模式 | TUN模式 |
---|---|---|---|
性能 | 较低,有瓶颈 | 高性能 | 高性能 |
网络要求 | 无特殊要求 | 同一局域网 | 可跨网络 |
配置复杂度 | 简单 | 中等 | 复杂 |
适用场景 | 小规模应用 | 高性能要求 | 跨网络环境 |
四、LVS调度算法
固定调度算法
- rr (轮询): 依次分配请求到不同RS节点
- wrr (加权轮询): 根据权值分配任务,权值高的优先
- dh (目的地址哈希): 以目的地址为关键字查找静态hash表
- sh (源地址哈希): 以源地址为关键字查找静态hash表
动态调度算法
- wlc (加权最小连接数): 选择Ti/Wi值最小的RS
- lc (最小连接数): 选择当前连接最少的RS
- lblc (基于地址的最小连接数): 结合地址哈希和最小连接数
五、测试验证
在客户端使用浏览器访问 http://192.168.10.180/,不断刷新页面观察负载均衡效果。正常情况下,请求应该轮流分发到两个Web服务器。
六、常见问题排查
-
VIP无法访问
- 检查Director Server的VIP配置
- 验证Real Server的lo:0接口配置
- 确认ARP参数设置正确
-
负载不均
- 检查调度算法配置
- 验证Real Server服务状态
-
响应缓慢
- 检查网络连通性
- 确认Real Server性能状态
七、总结
LVS-DR模式通过直接路由技术实现了高性能的负载均衡,响应数据直接返回客户端,避免了Director Server的性能瓶颈。在实际部署中需要注意ARP抑制、路由配置等关键技术点,确保集群的稳定性和高性能。
LVS+Keepalived 高可用群集:原理、部署与实战指南
一、Keepalived 概述
什么是Keepalived?
Keepalived 是一个基于 VRRP 协议实现的 LVS 服务高可用方案,专门用于解决静态路由单点故障问题。最初专为 LVS 负载均衡软件设计,用于管理和监控 LVS 集群中各个服务节点的状态,后来加入了高可用的 VRRP 功能。
核心功能
- 管理 LVS 负载均衡软件:通过配置文件直接管理 LVS 配置
- 故障自动切换(Failover):实现主备主机之间的故障转移
- 健康检查(Health Checking):监控节点服务器状态
- 高可用性(HA):确保负载调度器和节点服务器的高可用
二、Keepalived 体系架构
主要模块
模块 | 功能描述 |
---|---|
core模块 | keepalived的核心,负责主进程的启动、维护及全局配置文件的加载和解析 |
vrrp模块 | 实现 VRRP 协议,处理主备切换 |
check模块 | 负责健康检查,支持端口检查和URL检查 |
VRRP 通信原理
- 协议目的:解决静态路由的单点故障问题
- 通信方式:IP多播(默认多播地址 224.0.0.18)
- 工作机制:主节点发包,备节点接包,备节点接收不到数据包时启动接管程序
- 认证方式:目前推荐使用明文方式配置认证类型和密码
三、脑裂问题及解决方案
什么是脑裂?
在高可用(HA)系统中,当两个节点间的"心跳线"断开时,HA系统分裂成为两个独立的个体,相互争抢共享资源和服务。
脑裂原因
- 心跳线链路故障
- 网卡及相关驱动问题
- 心跳线连接设备故障
- 仲裁机器问题
- iptables防火墙阻挡心跳消息
- VRRP实例配置不一致
应对策略
- 添加冗余心跳线:双线条线,减少发生几率
- 启用磁盘锁:正在服务一方锁住共享磁盘
- 设置仲裁机制:通过参考IP(如网关IP)进行判断
- 脚本检测报警:实时监控并报警
四、LVS+Keepalived 群集部署
环境准备
角色 | IP地址 | 软件组件 |
---|---|---|
主DR服务器 | 192.168.10.80 | ipvsadm、keepalived |
备DR服务器 | 192.168.10.23 | ipvsadm、keepalived |
Web服务器1 | 192.168.10.16 | httpd |
Web服务器2 | 192.168.10.17 | httpd |
虚拟IP(VIP) | 192.168.10.180 | - |
客户端 | 192.168.10.100 | - |
1. 配置负载调度器(主备相同)
bash
# 基础环境配置
systemctl stop firewalld.service
setenforce 0
yum -y install ipvsadm keepalived
modprobe ip_vs
cat /proc/net/ip_vs
配置keepalived
bash
cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak
vim keepalived.conf
主服务器配置(192.168.10.80):
nginx
global_defs {
smtp_server 127.0.0.1
router_id LVS_01
#vrrp_strict
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 10
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass abc123
}
virtual_ipaddress {
192.168.10.180
}
}
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.16 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.10.17 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
备服务器配置(192.168.10.23):
- 修改
router_id LVS_02
- 修改
state BACKUP
- 修改
priority 90
- 其他配置与主服务器相同
配置虚拟IP
bash
vim /etc/sysconfig/network-scripts/ifcfg-ens33:0
ini
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255
bash
systemctl restart network
ifup ens33:0
systemctl start keepalived
ip addr # 查看虚拟网卡vip
启动ipvsadm服务
bash
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
ipvsadm -ln
调整proc响应参数
bash
vim /etc/sysctl.conf
ini
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
bash
sysctl -p
2. 配置节点服务器
bash
# 基础环境配置
systemctl stop firewalld
setenforce 0
yum -y install httpd
systemctl start httpd
# Web服务器1(192.168.10.16)
echo 'this is kgc web!' > /var/www/html/index.html
# Web服务器2(192.168.10.17)
echo 'this is benet web!' > /var/www/html/index.html
配置虚拟IP和ARP参数
bash
vim /etc/sysconfig/network-scripts/ifcfg-lo:0
ini
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255
bash
service network restart
ifup lo:0
ifconfig lo:0
route add -host 192.168.10.180 dev lo:0
vim /etc/sysctl.conf
ini
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
bash
sysctl -p
3. 抢占与非抢占模式
抢占模式 :MASTER从故障中恢复后,会将VIP从BACKUP节点中抢占过来
非抢占模式:MASTER恢复后不抢占BACKUP升级为MASTER后的VIP
非抢占式配置:
- 两个节点state都必须为backup
- 添加配置
nopreempt
- 启动服务的顺序决定master权限
五、测试验证
正常访问测试
在客户端访问 http://192.168.10.180/,观察负载均衡效果
故障切换测试
bash
# 在主服务器关闭keepalived服务
systemctl stop keepalived
# 观察备服务器是否接管VIP和服务
ip addr # 在备服务器上查看VIP
健康检查验证
- 停止某个Web服务器的httpd服务
- 观察Keepalived是否自动将其从转发队列中移除
- 重启服务后观察是否自动重新加入
六、故障排查指南
常见问题
-
VIP无法访问
- 检查keepalived服务状态
- 验证虚拟网卡配置
- 确认防火墙设置
-
负载不均
- 检查调度算法配置
- 验证Real Server权重设置
-
脑裂现象
- 检查心跳线连通性
- 验证VRRP配置一致性
监控命令
bash
# 查看keepalived状态
systemctl status keepalived
# 查看VIP状态
ip addr show ens33:0
# 查看LVS转发规则
ipvsadm -ln
# 查看日志
tail -f /var/log/messages
七、总结
LVS+Keepalived 组合提供了完整的高可用负载均衡解决方案,具备以下优势:
- 高可用性:通过VRRP协议实现主备自动切换
- 健康检查:实时监控后端服务器状态
- 负载均衡:支持多种调度算法
- 故障隔离:自动隔离故障节点
- 灵活配置:支持抢占和非抢占模式
在实际生产环境中,建议:
- 配置冗余心跳线防止脑裂
- 设置合适的健康检查参数
- 定期进行故障切换测试
- 建立完善的监控报警机制
通过本文的详细部署指南和原理讲解,相信您已经能够成功搭建和管理LVS+Keepalived高可用群集。