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 服务器上,达到数据复用的目的

相关推荐
玉梅小洋1 小时前
Git 使用技巧——查看 Commit 修改文件的概要
git·github
矢志航天的阿洪12 小时前
从GitHub到本地:Python IGRF库环境配置完全指南
开发语言·python·github
chunmiao303215 小时前
了解github上,watch,fork,star代表啥
github
CoderJia程序员甲16 小时前
GitHub 热榜项目 - 日榜(2026-01-30)
开源·大模型·llm·github·ai教程
Aliex_git17 小时前
Claude Code 使用笔记(四)- GitHub Claude 审查助手
人工智能·笔记·学习·github·ai编程
MicrosoftReactor18 小时前
技术速递|使用 GitHub Copilot SDK 构建智能体:自动化技术更新追踪实战指南
自动化·github·copilot
LeenixP18 小时前
GitHub Copilot 调用第三方模型API
ai·github·copilot·ai编程·oai compatible
WINDHILL_风丘科技18 小时前
面对汽车三高试验挑战,TFM远程管理平台能否成为破局关键?
人工智能·汽车·github
lambert.wang2 天前
当使用 uv 下载 Python 解释器时出现异常,通常是因为网络连接问题导致无法从 GitHub 下载安装包
python·github·uv
Ama_tor2 天前
obsidian插件系列|从github下载插件banners及简单应用
github·obsidian·banner