当前位置: 首页 > article >正文

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


http://www.kler.cn/a/577745.html

相关文章:

  • 江协科技/江科大-51单片机入门教程——P[5-1] 模块化编程 P[5-2] LCD1602调试工具
  • 《机器学习数学基础》补充资料:描述性统计
  • MySQL复习笔记
  • 【贪心算法2】
  • 第8章 访问管理(网络安全防御实战--蓝军武器库)
  • hooks useModule自定义hooks (二次封装AgGridReact ag-table)自定义表头,自定义表头搜索
  • 动态规划中一维与二维DP表的选择:从问题本质到C++实现
  • 服务器内存
  • Greenplum6.19集群搭建
  • 整理了一下网络编程中TCP的状态
  • K8s 1.27.1 实战系列(一)介绍及准备工作
  • Elasticsearch:使用 BigQuery 提取数据
  • flask学习3-深入
  • Windows 系统性能缓慢的原因
  • 网络安全创刊 网络安全紫队
  • libilibi项目优化(1)使用Redis实现缓存
  • GetWindowLongPtr函数分析
  • 常用的分布式ID设计方案
  • AI 人工智能深度解析:从基础到前沿,全面掌握未来科技
  • 【Linux】冯诺依曼体系与操作系统理解