2025年LVS的NAT和DR模型工作原理,并完成DR模型实战!

1 NAT (Network Address Translation) 模型:

工作原理:

客户端请求到达LVS负载均衡器,LVS根据调度算法选择一台真实服务器。

LVS将客户端请求的目的IP和端口改写为选定的真实服务器的IP和端口,然后转发给真实服务器。

真实服务器处理请求后,将响应返回给LVS。

LVS再将响应中的源IP和端口改回为自己的公网IP和端口,然后发送给客户端。

NAT 模式特点:

RIP 和 DIP 应在同一个 IP 网络,且应使用私网地址;RS 的网关要指向 DIP

请求报文和响应报文都必须经由 LVS 转发,LVS 易成为系统瓶颈

支持端口映射,可修改请求报文的目标 PORT

VS 必须是 Linux 系统,RS 可以是任意 OS 系统

LVS 主机需要开启 ip_forward 转发

DR (Direct Routing) 模型:

工作原理:

客户端请求到达LVS,LVS根据调度算法选择一台真实服务器。

LVS修改请求的MAC地址为选定服务器的MAC地址,然后直接将请求发送到该服务器的网络接口。

真实服务器处理请求后,直接将响应发送回客户端,不再经过LVS。

关键点是LVS和真实服务器共享同一个VIP(Virtual IP),但只有LVS响应ARP请求。

DR 模式是 LVS 的默认模式,应用广泛,通过为请求报文重新封装一个 MAC 首部进行转发,源 MAC 是 DIP 所在的接口的 MAC,目标MAC 是某挑选出的 RS 的 RIP 所在接口的 MAC 地址;源 IP/PORT,以及目标 IP/PORT 均保持不变,但源 MAC 和目标 MAC 会发生改变,DR 模式下,数据链路层之上的内容不会发生变化

DR 模式特点:

LVS 服务器 和 RS 服务器 上都配置有 VIP 地址

确保前端路由器将目标 IP 为 VIP 的请求报文只发往 LVS 服务器;

后端 RS 服务器上的 VIP 只用作封装响应报文,不可响应 ARP 广播,也不可主动对外发送 ARP 广播,

RS 的 RIP 可以使用私网地址,也可以是公网地址;RIP 与 DIP在同一 IP 网络;

RIP 的网关不能指向 DIP,以确保响应报文不会经由 LVS 服务器

RS 服务器和 LVS 服务器要在同一个物理网络(不能跨路由,因为路由会隔离 ARP 广播)

LVS 服务器只处理请求报文,不处理响应报文,相对于 NAT 模式其负载性能会大幅提升,响应由 RS 服务器自行完成

不支持端口映射(端口不能修改,数据链路层之上的内容不会发生变化)

无需开启 ip_forward

RS 服务器可以使用大多数 OS 系统(支持相关网络设置即可)

DR模型实战

对网卡名称进行统一

vim /etc/default/grub

GRUB_CMDLINE_LINUX=" net.ifnames=0"

修改网卡配置文件,将对应的 ens160,ens233 这种改成 eth0,eth1

cat /etc/netplan/eth0.yaml

network:

ethernets:

eth0:

addresses: [192.168.10.100/24]

routes: [{to: default,via: 192.168.10.200}]

version: 2

重新生成 grub 文件并重启

grub-mkconfig -o /boot/grub/grub.cfg;reboot

所有主机安装 net-tools 工具包,用 route 命令来进行路由管理

apt install net-tools -y

所有主机清空 iptables 规则

iptables -F

Router 主机开启 ip_forward

echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf

sysctl -p

net.ipv4.ip_forward = 1

后端RS主机安装 apache,nginx 用作测试,

apache 安装完成后需要修改配置,否则会和 nginx 冲突

apache 监听88,nginx 监听80,并分别设置默认页面

apt install apache2 -y

cat /etc/apache2/ports.conf

Listen 88

cat /etc/apache2/sites-available/000-default.conf

<VirtualHost *:88>

ServerAdmin webmaster@localhost

DocumentRoot /var/www/apache_www

创建目录,设置默认页面,并重启服务

mkdir /var/www/apache_html/

echo "this page from rs-1 apache" > /var/www/apache_html/index.html

systemctl restart apache2

apt install nginx -y

echo "this page from rs-1 nginx" > /var/www/html/index.html

systemctl restart nginx

测试

curl 127.1

this page from rs-1 nginx

curl 127.1:88

this page from rs-1 apache

router 主机配置

eth0 仅主机

cat /etc/netplan/eth0.yaml

network:

ethernets:

eth0:

addresses: [192.168.10.200/24]

version: 2

eth1 NAT

cat /etc/netplan/eth1.yaml

network:

ethernets:

eth1:

addresses: [10.0.0.200/24]

version: 2

开启路由转发

echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf

sysctl -p

net.ipv4.ip_forward = 1

LVS 主机配置

修改网卡配置

cat /etc/netplan/eth0.yaml

network:

ethernets:

eth0:

addresses: [10.0.0.8/24]

routes: [{to: default,via: 10.0.0.200}]

version: 2

RS-1 主机配置, RS-2主机配置

修改网卡配置

cat /etc/netplan/eth0.yaml

network:

ethernets:

eth0:

addresses: [10.0.0.110/24]

routes: [{to: default,via: 10.0.0.200}]

version: 2

在客户端测试,两台后台RS服务器能访问

curl 10.0.0.110

this page from rs-1

curl 10.0.0.120

this page from rs-2

RS-1 主机上配置 VIP,RS-2 主机上配置 VIP

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

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

ifconfig lo:1 10.0.0.100 netmask 255.255.255.255

LVS 主机上配置VIP

ifconfig lo:1 10.0.0.100 netmask 255.255.255.255

LVS 主机上配置转发规则

iptables -F

ipvsadm -A -t 10.0.0.100:80 -s wrr

ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.110 -g -w 1

ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.120 -g -w 1

查看

ipvsadm -Ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 10.0.0.100:80 wrr

-> 10.0.0.110:80 Route 1 0 0

-> 10.0.0.120:80 Route 1 0 0

客户端测试转发

curl 10.0.0.100

this page from rs-1 nginx

curl 10.0.0.100

this page from rs-2 nginx

2.总结LVS的调度算法。

四种静态调度算法:

静态算法仅根据算法本身来进行调度,不关注后端 RS 服务器负载情况

RR:Round Robin,轮询算法,LVS 服务器将前端请求轮流转发到后端每一台 RS 服务器上,后端每台 RS 服务器处理的请求量都是相同的

WRR:Weight RR,加权轮询算法,LVS 服务器将前端请求根据后端 RS 服务器的权重进行转发,对于后端 RS 服务器中性能好的机器可以设置较高的权重,物尽其用

SH:Source Hash,源 IP 地址 hash,将来自于同一个 IP 地址的客户端请求调度到后端同一台 RS 服务器上,从而实现会话保持

DH:Destinatio Hash,目标 IP 地址 hash, 客户端的请求第一次被调度到某到 RS 服务器后,其后续的请求都将会被发往同一台 RS 服务器,一般用于正向代理缓存场景

六种动态调度算法

动态算法要根据当前系统中后端 RS 服务器的负载情况进行调度,给负载较低的后端主机多转发,给负载较高的后端主机少转发

LC:Least Connections,最少连接算法,将前端请求调度到己建立的连接数最少的后端 RS 服务器上,如果集群后端服务器具有相同的配置和相近的系统性能,采用此调度算法可以较好的均衡负载(Overhead = Activeconns * 256 + InActiveconns,负载值越小,则被调度的优先级越高,256个非活动连接相当于1个非活动连接)

WLC:Weighted Least Connections,加权最少连接算法,此算法是 LVS 的默认调度算法,在 LC 算法中,只考虑了 RS 服务器的连接数,而没有考虑 RS 服务器会有不同的配置和性能,此算法优化了负载均衡性能,具有较高权重值的 RS 服务器将承受较大比例的活动连接负载,(Overhead =(ActiveConns * 256 + InActiveConns)/ Weight,权重值越大,则计算出的负载值越小,相应的,被调度的优先级越高,256个非活动连接相当于1个活动连接)

SED:Shortest Expected Delay,最短延迟调度算法,此算法是 WLC 算法的改进版,不再考虑非活动连接(Overhead =(Activeconns + 1)* 256 / Weight,权重值越大,则计算出的负载值越小,相应的,被调度的优先级越高,不考虑非活动连接的原因是为了防止 WLC 算法中 InActiveconns 数过大影响调度的准确性,+1 是为了保证被除数大于0,防止出现计算结果为0的情况,计算结果为0则意味着每台 RS 被调度的概率是一致的,权重值设置无效

NQ:Never Queue,最少队列调度算法/永不排队调度算法,初始的时候先做一次轮循,保证每台 RS 都至少被调度一次,后续使用 SED 调度算法

LBLC:Locality-Based Least Connections,基于局部性的最少链接调度算法,本质是动态的 DH 算法,该算法优先使用 DH 算法将请求调度到同一台 RS 服务器上,如果该 RS 服务器负载较高或不可用,则再使用 LC 算法决定调度到哪一台 RS 服务器上,此 RS 服务器将成为一下次调度时 DH 算法的首选项

LBLCR:Locality-Based Least Connections with Replication,带复制的基于局部性的最少链接调度算法,在 LBLC 算法中,如果 DH 算法选出的 RS 服务器不能被调度,则要使用 LC 算法重新选择 RS 服务器,LBLCR 的算法优势是会将之前被选中的 RS 服务器上的相关缓存数据复制一份到此次被选中的 RS 服务器上,达到数据复用的目的

相关推荐
uhakadotcom3 分钟前
FinGPT:金融领域的开源语言模型框架
后端·面试·github
uhakadotcom2 小时前
Pandas入门:数据处理和分析的强大工具
后端·面试·github
草梅友仁2 小时前
Manus 与 OpenManus:AI 助手对比及开源复现 | 2025 年第 10 周草梅周报
开源·github·aigc
小华同学ai3 小时前
2K star!三分钟搭建企业级后台系统,这款开源Java框架绝了!
后端·架构·github
神的随波逐流的中子3 小时前
用于设计的可综合SV:SystemVerilog不仅仅用于验证!
后端·github
uhakadotcom4 小时前
Grafana入门指南:使用场景、部署和实践
后端·面试·github
uhakadotcom4 小时前
Prometheus入门:监控系统的强大工具
后端·面试·github
icebreaker8 小时前
利用 Github 构建你自己的免费图床
前端·github
与光同尘 大道至简9 小时前
中国嵌入式单片机就业形势分析
arm开发·python·单片机·嵌入式硬件·github·硬件工程
GoGeekBaird10 小时前
Manus 好不好不知道,QwQ-32B 确实不错!
后端·github