您的位置:首页 > 路由器知识路由器知识

2025年超详细LVSDR模式实战指南:从入门到精通的负载均衡配置手册

2026-04-12人已围观

2025年超详细LVS DR模式实战指南:从入门到精通的负载均衡配置手册

什么是LVS DR模式?用生活例子讲明白

想象你去一家超级火爆的网红奶茶店,门口有个精明的店长(LVS服务器),店内有多个制作台(后端服务器)。当你(客户端)点单时,店长并不亲自做奶茶,而是根据哪个制作台空闲,直接把你的订单小票(数据包)转给对应的制作台。制作台做好奶茶后,直接递给你,不需要再经过店长。这种"店长只分配任务,制作台直接服务顾客"的模式,就是LVS的DR(直接路由)模式。

LVS(Linux Virtual Server)本质上是Linux内核自带的负载均衡器,就像给服务器集群装了个智能"流量分配器"。它主要有三种工作模式:NAT模式、DR模式和TUN模式。其中DR模式性能最强,因为它只改数据包的MAC地址,不碰IP头,转发效率超高,能轻松扛住每秒数十万的请求。

为什么要选择DR模式?三大核心优势

1. 性能天花板最高:DR模式下,只有请求报文经过LVS服务器,响应报文直接从后端服务器回给客户端,LVS不会成为瓶颈。实测显示,DR模式的PPS(每秒数据包处理量)比NAT模式高3-5倍。

2. 服务器负载更均衡:支持轮询、加权轮询、最少连接等多种调度算法,能根据后端服务器性能灵活分配请求。比如给配置高的服务器设置更高权重,让它多干活。

3. 对网络环境要求低:只要LVS和后端服务器在同一个局域网就行,不需要复杂的网络拓扑。不像TUN模式需要专门的隧道支持,也不像NAT模式要求LVS做网关。

准备工作:硬件、系统与网络环境配置

最低硬件配置要求

- LVS服务器:2核4G内存起步,网卡建议千兆以上。如果你的网站日活百万级,建议4核8G配置。

- 后端服务器:根据业务需求配置,Web服务器2核2G足够,数据库服务器建议4核8G以上。

- 网络设备:所有服务器必须在同一局域网,交换机支持MAC地址学习(现在的交换机基本都支持)。

系统环境准备(以CentOS 7为例)

所有服务器都要执行这些操作:

```bash

关闭防火墙和SELinux,生产环境可按需配置规则

systemctl stop firewalld && systemctl disable firewalld

setenforce 0

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

安装必要工具

yum install -y net-tools vim wget

```

网络拓扑规划

我们用以下网络配置举例,你需要根据自己的实际环境修改IP地址:

- LVS服务器(DS):

- DIP(物理网卡IP):172.30.100.111

- VIP(虚拟服务IP):172.30.100.1(这个IP就是用户访问的地址)

- 后端服务器1(RS1):

- RIP(物理网卡IP):172.30.100.126

- VIP(回环网卡IP):172.30.100.1(和LVS的VIP一样)

- 后端服务器2(RS2):

- RIP(物理网卡IP):172.30.100.127

- VIP(回环网卡IP):172.30.100.1(和LVS的VIP一样)

从零开始配置:LVS服务器部署步骤

第一步:加载LVS内核模块

LVS已经是Linux内核的一部分,我们只需要加载它:

```bash

加载ip_vs模块

modprobe ip_vs

查看模块是否加载成功

lsmod | grep ip_vs

查看LVS版本信息

cat /proc/net/ip_vs

```

如果看到类似`IP Virtual Server version 1.2.1 (size=4096)`的输出,说明加载成功了。

第二步:安装LVS管理工具ipvsadm

ipvsadm是管理LVS的命令行工具,就像操作路由器用的命令行:

```bash

CentOS系统安装

yum install -y ipvsadm

Ubuntu系统安装

apt-get install -y ipvsadm

```

安装完成后,先别急着配置,我们需要先准备好VIP。

第三步:配置VIP地址

VIP是用户访问的入口,必须绑定在LVS服务器的物理网卡上:

```bash

在物理网卡上创建虚拟接口,绑定VIP

ifconfig eth0:0 172.30.100.1 broadcast 172.30.100.1 netmask 255.255.255.255 up

添加VIP路由

route add -host 172.30.100.1 dev eth0:0

```

> 注意:这里的`eth0`是你的物理网卡名,有些人的系统可能叫`ens33`或`enp0s3`,用`ifconfig`命令可以查看。子网掩码必须是32位(255.255.255.255),广播地址和VIP相同。

第四步:编写LVS配置脚本

手动敲命令太麻烦,我们写个脚本一键配置:

```bash

!/bin/bash

清除已有规则

ipvsadm -C

启用IP转发(DR模式其实不需要,但开着也无妨)

echo 1 > /proc/sys/net/ipv4/ip_forward

定义变量

VIP="172.30.100.1:80" VIP和端口

RS1="172.30.100.126:80" 后端服务器1

RS2="172.30.100.127:80" 后端服务器2

创建虚拟服务,使用加权轮询算法(wrr)

ipvsadm -A -t $VIP -s wrr

添加后端服务器,指定DR模式(-g),权重都为1

ipvsadm -a -t $VIP -r $RS1 -g -w 1

ipvsadm -a -t $VIP -r $RS2 -g -w 1

保存配置

ipvsadm -S > /etc/sysconfig/ipvsadm

查看配置

ipvsadm -Ln

```

给脚本加执行权限并运行:

```bash

chmod +x lvs_dr_setup.sh

./lvs_dr_setup.sh

```

运行成功后,会看到类似这样的输出:

```

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 172.30.100.1:80 wrr

-> 172.30.100.126:80 Route 1 0 0

-> 172.30.100.127:80 Route 1 0 0

```

后端服务器配置:关键在ARP抑制

为什么要配置回环网卡VIP?

这是DR模式最容易让人困惑的地方:为什么后端服务器也要配置VIP?因为当LVS把请求转发给后端服务器时,数据包的目标IP还是VIP。如果后端服务器没配置VIP,就会认为这个包不是发给自己的,直接丢弃。

但如果所有服务器都在网卡上配VIP,就会出现"ARP地址冲突"——当客户端问"谁是172.30.100.1"时,所有服务器都会抢答,导致客户端收到多个回复,不知道该发给谁。

解决办法是:把VIP配置在回环网卡(lo)上,并且禁止回环网卡响应ARP请求。这样既能让后端服务器接收VIP的数据包,又不会在网络上"暴露"自己有VIP。

详细配置步骤(两台后端服务器都要做)

第一步:在回环网卡上配置VIP

```bash

在回环网卡上创建虚拟接口,绑定VIP

ifconfig lo:0 172.30.100.1 broadcast 172.30.100.1 netmask 255.255.255.255 up

添加本地路由,让访问VIP的数据包走回环网卡

route add -host 172.30.100.1 dev lo:0

```

第二步:修改ARP内核参数(重中之重)

这一步是DR模式的核心秘密,必须严格配置:

```bash

配置arp_ignore:1表示只响应目标IP是本机物理网卡IP的ARP请求

echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore

echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore

配置arp_announce:2表示发送ARP请求时,优先使用请求目标网段的本地IP作为源IP

echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce

echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce

```

> 通俗解释:`arp_ignore=1`让服务器"装聋作哑",收到VIP的ARP查询假装没听见;`arp_announce=2`让服务器"谨言慎行",对外宣告IP时只说自己的物理网卡IP,不提回环网卡上的VIP。

第三步:编写后端服务器配置脚本

同样,我们把这些命令写成脚本,方便以后维护:

```bash

!/bin/bash

VIP="172.30.100.1"

配置回环网卡VIP

ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up

route add -host $VIP dev lo:0

配置ARP参数

echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore

echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore

echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce

echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce

```

保存为`lvs_rs_setup.sh`,加执行权限运行。

第四步:安装测试服务(以Nginx为例)

为了测试负载均衡是否生效,我们在两台后端服务器上安装Nginx,并设置不同的首页:

```bash

安装Nginx

yum install -y nginx

后端服务器1设置首页内容

echo "

Server 172.30.100.126

" > /usr/share/nginx/html/index.html

后端服务器2设置首页内容

echo "

Server 172.30.100.127

" > /usr/share/nginx/html/index.html

启动Nginx

systemctl start nginx && systemctl enable nginx

```

验证配置:一步步确认是否成功

第一步:检查LVS规则是否生效

在LVS服务器上执行:

```bash

ipvsadm -Ln

```

正常输出应该包含我们配置的VIP和后端服务器IP,权重(Weight)都是1。

第二步:测试VIP是否能访问

在客户端电脑上访问`http://172.30.100.1`,应该能看到后端服务器的页面。多刷新几次,如果能交替显示"Server 172.30.100.126"和"Server 172.30.100.127",说明轮询算法生效了。

第三步:抓包验证数据包流向(高级验证)

在LVS服务器上抓包,查看是否只有请求没有响应:

```bash

tcpdump -i eth0 host 172.30.100.1 -nn

```

正常情况下,应该只能看到`IP 客户端IP > 172.30.100.1: HTTP`的请求包,看不到响应包(因为响应包直接从后端服务器回客户端了)。

在后端服务器上抓包,应该能看到目标MAC是自己,但目标IP是VIP的数据包:

```bash

tcpdump -i eth0 host 172.30.100.1 -nn

```

性能优化:让你的LVS集群跑得更快

选择合适的调度算法

LVS支持多种调度算法,不同场景选不同的:

- 轮询(rr):请求按顺序分给后端服务器,适合所有服务器性能差不多的情况。

- 加权轮询(wrr):给性能好的服务器设置高权重,比如配置高的服务器权重设为2,普通的设为1,请求会按2:1分配。

- 最少连接(lc):优先分配给连接数少的服务器,适合请求处理时间长短不一的场景(比如电商网站,有的用户浏览商品,有的用户下单付款)。

修改调度算法很简单,改`ipvsadm -A`命令的`-s`参数就行:

```bash

改为加权轮询算法

ipvsadm -E -t 172.30.100.1:80 -s wrr

修改后端服务器权重

ipvsadm -e -t 172.30.100.1:80 -r 172.30.100.126:80 -g -w 2

ipvsadm -e -t 172.30.100.1:80 -r 172.30.100.127:80 -g -w 1

```

调整Linux内核参数

在LVS服务器上修改`/etc/sysctl.conf`,添加以下参数:

```bash

开启SYN cookies,防止SYN攻击

net.ipv4.tcp_syncookies = 1

最大TCP连接数

net.core.somaxconn = 65535

增加TCP连接跟踪表大小

net.netfilter.nf_conntrack_max = 1048576

减少TIME_WAIT连接数量

net.ipv4.tcp_max_tw_buckets = 20000

```

执行`sysctl -p`使配置生效。

配置连接超时时间

默认LVS会保持连接300秒,对于高并发网站来说太长了,会占用大量连接资源。可以缩短超时时间:

```bash

修改TCP连接超时时间(单位:秒)

ipvsadm --set 30 10 60

```

参数含义:`--set tcp tcpfin udp`,分别是TCP连接超时、TCP FIN包超时、UDP超时。

高可用配置:用Keepalived避免单点故障

LVS服务器本身可能会挂掉,这时候整个系统就瘫痪了。解决办法是用Keepalived做LVS的主备切换,就像给皇帝配个太子,皇帝不行了太子上。

安装Keepalived

```bash

yum install -y keepalived

```

配置主LVS服务器(172.30.100.111)

编辑`/etc/keepalived/keepalived.conf`:

```conf

! Configuration File for keepalived

global_defs {

router_id LVS_MASTER

}

vrrp_instance VI_1 {

state MASTER

interface eth0

virtual_router_id 51

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

172.30.100.1/32 dev eth0 label eth0:0

}

}

virtual_server 172.30.100.1 80 {

delay_loop 6

lb_algo wrr

lb_kind DR

persistence_timeout 0

protocol TCP

real_server 172.30.100.126 80 {

weight 1

TCP_CHECK {

connect_port 80

connect_timeout 3

retry 3

delay_before_retry 3

}

}

real_server 172.30.100.127 80 {

weight 1

TCP_CHECK {

connect_port 80

connect_timeout 3

retry 3

delay_before_retry 3

}

}

}

```

配置备LVS服务器(172.30.100.112)

大部分配置和主服务器一样,只需要改`state`、`priority`和`router_id`:

```conf

! Configuration File for keepalived

global_defs {

router_id LVS_BACKUP

}

vrrp_instance VI_1 {

state BACKUP

interface eth0

virtual_router_id 51

priority 90 优先级比主服务器低

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

172.30.100.1/32 dev eth0 label eth0:0

}

}

virtual_server部分和主服务器完全一样,省略...

```

启动Keepalived后,VIP会自动飘在主服务器上。如果主服务器挂了,备服务器会自动接管VIP,整个过程大概1-2秒,用户几乎感知不到。

新手避坑清单:10个最容易踩的陷阱

1. VIP子网掩码不是32位:必须是`255.255.255.255`,否则会导致ARP广播范围错误。

2. 后端服务器网关指向LVS:DR模式下后端服务器网关应该指向真实网关,不是LVS服务器。

3. arp_ignore和arp_announce参数没配置:这是最常见的错误,会导致VIP冲突,必须严格设为1和2。

4. 回环网卡VIP配置在物理网卡上:后端服务器的VIP必须在lo接口,不能在物理网卡。

5. LVS和后端服务器不在同一网段:DR模式要求所有服务器在同一局域网,否则MAC地址转发会失败。

6. 防火墙没关闭或没开规则:至少要开放80端口,最好先关闭防火墙测试,成功后再开规则。

7. 使用了不支持DR模式的云服务器:有些云服务商(如AWS)的基础网络不支持自定义MAC地址,会导致DR模式失效。

8. 没给VIP添加路由:LVS和后端服务器都需要添加VIP的主机路由,否则数据包不知道怎么走。

9. 用ifconfig配置但没保存:ifconfig配置重启后会丢失,必须写成脚本或配置到网络接口文件。

10. 没测试后端服务器直接访问VIP的情况:在后端服务器上执行`curl http://172.30.100.1`,应该能访问到自己的页面。

常见问题解决:5个经典故障案例

问题1:访问VIP提示无法连接

排查步骤:

1. 检查LVS服务器是否配置了VIP:`ifconfig eth0:0`

2. 检查LVS规则是否正确:`ipvsadm -Ln`

3. 检查后端服务器Nginx是否启动:`systemctl status nginx`

4. 检查LVS到后端服务器的网络连通性:`ping 172.30.100.126`

可能原因:LVS规则没配置,或后端服务器没启动服务。

问题2:只能访问到一台后端服务器

排查步骤:

1. 检查LVS调度算法是否正确:`ipvsadm -Ln`应该有`wrr`或`rr`

2. 检查后端服务器权重是否都是0:权重为0的服务器不会被分配请求

3. 清除浏览器缓存或用`curl`测试:浏览器可能有缓存

可能原因:权重配置错误,或用了基于源IP的调度算法(如sh)。

问题3:VIP冲突,偶尔能访问偶尔不能

排查步骤:

1. 在客户端执行`arp -a | findstr 172.30.100.1`(Windows)或`arp -n | grep 172.30.100.1`(Linux)

2. 查看VIP对应的MAC地址是否稳定(应该是LVS服务器的MAC)

3. 在后端服务器检查arp_ignore参数:`cat /proc/sys/net/ipv4/conf/all/arp_ignore`

可能原因:后端服务器的ARP抑制参数没配置好,导致客户端收到多个ARP响应。

问题4:LVS切换后服务不可用

排查步骤:

1. 检查备LVS是否接管了VIP:`ifconfig`

2. 检查备LVS的ipvs规则:`ipvsadm -Ln`

3. 检查Keepalived日志:`tail -f /var/log/messages | grep Keepalived`

可能原因:备LVS的ipvs规则没配置,或VIP飘移失败。

问题5:高并发下LVS服务器CPU占用过高

排查步骤:

1. 用`top`查看哪个进程占用CPU高,通常是`softirq`(软中断)

2. 检查LVS服务器的网卡是否跑满:`ifconfig eth0`看RX/TX packets

3. 检查调度算法是否合理:`ipvsadm -Ln`

解决办法:

- 升级服务器CPU,至少4核以上

- 优化内核参数,增加网络缓冲区:

```bash

echo "net.core.rmem_max = 16777216" >> /etc/sysctl.conf

echo "net.core.wmem_max = 16777216" >> /etc/sysctl.conf

sysctl -p

```

- 如果PPS超过10万,考虑用DPVS(基于DPDK的LVS)

10个实用小技巧:让你成为LVS高手

1. 规则保存与恢复:`ipvsadm -S > /etc/sysconfig/ipvsadm`保存规则,`ipvsadm -R < /etc/sysconfig/ipvsadm`恢复。

2. 查看连接数:`ipvsadm -Ln --stats`查看各后端服务器的连接统计,`ipvsadm -Ln --rate`查看速率统计。

3. 临时禁用后端服务器:`ipvsadm -e -t 172.30.100.1:80 -r 172.30.100.126:80 -g -w 0`,把权重设为0。

4. 设置连接持久化:`ipvsadm -A -t 172.30.100.1:80 -s rr -p 60`,表示60秒内同一客户端的请求会发到同一台后端服务器,适合购物车等场景。

5. 监控LVS性能:安装`collectd`和`grafana`,配置ipvs插件,可视化监控连接数、吞吐量等指标。

6. 批量配置后端服务器:用Ansible批量执行配置脚本,几台到几百台服务器都能轻松搞定。

7. 自动重启服务:把LVS和Keepalived配置成系统服务,确保开机启动:`systemctl enable ipvsadm keepalived`。

8. 日志记录:修改`/etc/sysconfig/ipvsadm`,添加`IPVSADM_OPTIONS="-l"`开启日志,日志在`/var/log/ipvsadm`。

9. 使用加权轮询处理服务器性能差异:给高配服务器设置更高权重,如`-w 3`,低配设`-w 1`。

10. 定期清理连接:对于短连接服务(如HTTP),可以定期执行`ipvsadm -C && sh /path/to/lvs_script.sh`清理无效连接。

长期使用体验:LVS DR模式的优缺点总结

优点:

1. 稳定性超强:LVS是内核模块,比Nginx等应用层负载均衡器稳定得多,我见过连续运行两年不重启的LVS服务器。

2. 性能损耗极低:只改MAC地址,转发效率接近硬件负载均衡器,比Nginx负载均衡性能高3-5倍。

3. 配置简单:核心就是LVS和后端服务器的几个配置文件,学会后维护成本很低。

缺点:

1. 不支持端口转换:DR模式不能像NAT模式那样改端口,比如把80端口转发到后端的8080端口。

2. 不支持跨网段后端服务器:所有服务器必须在同一局域网,限制了架构灵活性。

3. 管理界面缺失:只有命令行工具,不像F5有图形界面,对新手不够友好。

话说回来,对于中大型网站,LVS DR模式仍然是性价比最高的负载均衡方案。它可能不是最先进的,但绝对是最稳定、最经得住考验的——毕竟这是Linux内核自带的功能,已经过近20年的市场验证。

如果你正在搭建高并发网站,又不想花大价钱买硬件负载均衡器,LVS DR模式绝对是你的不二之选。按照本文的步骤一步步配置,即使是新手也能在1小时内搭建起一个能扛住10万并发的负载均衡集群。