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

LVS-DR

目录

一、LVS—DR

1.简介

2.数据包流向分析

2.1客户端发送请求

2.2数据通过二层数据链路层传输 

2.3IPVS处理请求 

2.4真实服务器处理请求 

2.5响应数据包传送

2.6总结 

3.DR模式的特点

二、LVS—DR中遇到的ARP问题

1.问题一

2.问题二

三、DR模式LVS负载均衡群集部署

1.配置DR服务器 

2.部署共享存储(NFS服务器)

3.配置节点服务器 

4.测试LVS集群 


一、LVS—DR

1.简介

LVS-DR (Direct Routing,直接路由模式)是 Linux Virtual Server(LVS) 提供的一种负载均衡
模式,用于在高并发、高流量场景下分发客户端请求到多台后端服务器。其主要特点是通过直接路由的方式将客户端请求发送给真实服务器,并且真实服务器直接将响应发送回客户端,而不经过负载均衡器。这样避免了负载均衡器成为瓶颈,从而极大提高了系统的处理能力

2.数据包流向分析

2.1客户端发送请求

客户端向负载均衡器(Director Server)发送请求
请求数据包的源 IP 地址是客户端 IP(CIP),目标 IP 地址是负载均衡器的虚拟 IP(VIP)
请求数据包到达负载均衡器的内核空间

2.2数据通过二层数据链路层传输 

负载均衡器和真实服务器(Real Server)位于同一网络中,数据包通过二层(数据链路层)直接传输
负载均衡器和真实服务器的通信依赖于数据链路层的交换

2.3IPVS处理请求 

负载均衡器的内核空间检测到数据包的目标 IP 是 VIP
IPVS(IP Virtual Server)在内核空间将数据包与集群服务进行匹配,确认请求的服务是否是集群服务


IPVS将数据包重新封装:
源 MAC 地址修改为负载均衡器的 MAC 地址
目标 MAC 地址修改为真实服务器的 MAC 地址
源 IP 地址和目标 IP 地址保持不变(仍然是 CIP 和 VIP)
修改后的数据包通过二层数据链路层发送给真实服务器

2.4真实服务器处理请求 

真实服务器接收到数据包时,检测到目标 MAC 地址是其自身的 MAC 地址
真实服务器处理请求后生成响应数据包
响应数据包的源 IP 地址为 VIP(与请求的数据包相同),目标 IP 地址为客户端 IP(CIP)
真实服务器将响应数据包通过 lo(回环)接口 发送到物理网卡,然后向外发送响应

2.5响应数据包传送

真实服务器直接将响应数据包发送到客户端
由于响应数据包的目标 MAC 地址是客户端的,响应数据直接到达客户端,而不经过负载均衡器

2.6总结 

客户端 → 负载均衡器:客户端请求的数据包目标 IP 是 VIP,到达负载均衡器
负载均衡器 → 真实服务器:负载均衡器修改数据包的源 MAC 地址为自身的 MAC 地址,目标 MAC 地址为真实服务器的 MAC 地址。数据包通过二层网络传输到真实服务器
真实服务器 → 客户端:真实服务器处理请求,生成响应数据包,源 IP 地址为 VIP,目标 IP 地址为 CIP。响应数据包直接从真实服务器发送到客户端

注:

MAC 地址修改:

负载均衡器通过修改数据包的 MAC 地址,将请求正确地路由到目标真实服务器
同一网络要求:

负载均衡器和真实服务器必须在同一局域网内,因为 LVS-DR 模式依赖于直接路由机制
ARP 配置:

为了避免真实服务器响应 VIP 的 ARP 请求,必须在真实服务器上配置 ARP 策略

3.DR模式的特点

(1)Director server 和 Real server 必须在同一个物理网络中
LVS-DR 模式依赖于数据链路层(Layer 2)直接转发数据包,因此要求负载均衡器
(Director Server)和所有的真实服务器(Real Server)位于同一局域网中,不能跨越子网或不同的网络
(2)Real server 可以使用私有地址或公网地址
Real Server 可以配置成私有 |P 地址(RIP),也可以是公网 IP 地址。如果 Real Server 使用公网 IP 地址,则可以直接通过互联网访问该服务器,而无需通过 Director Server 转发
(3)Director server 作为群集的访问入口,但不作为网关使用
Director Server 负责将客户端的请求分发给 Real Server,但它不会充当 Real Server 的网
关。请求报文通过 Director Server 进入,但响应报文不会通过 Director Server
(4)所有的请求报文经过 Director server,但回复响应报文不能经过 Director Server
客户端的请求会通过负载均衡器,由它将请求分发给指定的Real Server,然而,Real
Server 的响应数据会直接发给客户端,绕过 Director Server。这种设计提高了系统的性能和效率,避免了 Director Server 成为瓶颈
(5)Real server 的网关不允许指向 Director server lP
Real Server 的默认网关不能设置为 Director Server 的IP地址,因为 LVS-DR 的核心思想是响应报文不经过 Director Server。所有的响应数据应该直接通过真实服务器的物理网络接口发送给客户端
(6)Real server 上的 lo 接口配置 VIP 的 IP 地址
在 Real Server 上,需要在回环接口(`1o`)上绑定 VIP。这样,当请求到达 Real Server时,服务器能够接收目标 IP 为 VIP 的数据包并正确处理

二、LVS—DR中遇到的ARP问题

1.问题一

在LVS-DR负载均衡集群中,负载均衡器与节点服务器都要配置相同的VIP地址

在局域网中具有相同的IP地址,势必会造成各服务器ARP通信的素乱

解决思路 

(1)当ARP广播发送到LVS-DR集群时,因为负载均衡器和节点服务器都是连接到相同的网络上,它们都会接收到ARP广播
(2)只有前端的负载均衡器进行响应,其他节点服务器不应该响应ARP广播

解决方法

对节点服务器进行处理,使其不响应针对VIP的ARP请求

使用虚接口lo:0承载VIP地址
设置内核参数arp ignore=1:系统只响应目的IP为本地IP的ARP请求

2.问题二

Real Server返回报文(源IP是VIP)经路由器转发,重新封装报文时,需要先获取路由器的MAC地址

发送ARP请求时,Linux默认使用IP包的源IP地址(即VIP)作为ARP请求包中的源IP地址,而不使用发送接口的IP地址

路由器收到ARP请求后,将更新ARP表项

原有的VIP对应Director的MAC地址会被更新为VIP对应Real Server的MAC地址

路由器根据ARP表项,会将新来的请求报文转发给Real Server,导致Director的VIP失效

解决思路

对节点服务器进行处理,设置内核参数arp announce=2:系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址

解决方法

net.ipv4.conf.lo.arp_ignore =1
net.ipv4.conf.lo.arp_announce =2
net.ipv4.conf.al.arp_ignore =1
net.ipv4.conf.al.arp_announce =2

三、DR模式LVS负载均衡群集部署

实验需求:

DR服务器:172.16.58.10

web服务器1:172.16.58.20

web服务器2:172.16.58.30

VIP:172.16.58.180

客户端:172.16.58.40

1.配置DR服务器 

DR服务器:172.16.58.10

关闭防火墙以及增强功能
systemctl stop firewalld.service
setenforce 0


加载IPVS模块
modprobe ip_vs
cat /proc/net/ip_vs


安装ipvsadm工具
yum -y install ipvsadm


配置虚拟IP地址:172.16.58.180
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-ens33:0
 
vim ifcfg-ens33:0
 
DEVICE=ens33:0
ONBOOT=yes
IPADDR=172.16.58.180
NETMASK=255.255.255.255


启动虚拟IP
ifup ens33:0
ifconfig ens33:0


调整内核参数
修改内核响应参数来关闭ICMP重定向
vim /etc/sysctl.conf
 
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
 

应用修改
sysctl -p


配置负载分配策略
启动ipvsadm并配置负载均衡策略
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
ipvsadm -C
ipvsadm -A -t 172.16.58.180:80 -s rr
ipvsadm -a -t 172.16.58.180:80 -r 172.16.88.20:80 -g
ipvsadm -a -t 172.16.58.180:80 -r 172.16.88.30:80 -g
ipvsadm


查看节点状态
ipvsadm -ln

2.部署共享存储(NFS服务器)

NFS服务器:172.16.58.40

关闭防火墙以及增强功能
systemctl stop firewalld.service
setenforce 0


安装NFS和rpcbind服务并且修改权限
yum -y install nfs-utils rpcbind
mkdir /opt/kgc /opt/benet
chmod 777 /opt/kgc /opt/benet


配置NFS共享目录
vim /etc/exports
 
/usr/share *(ro,sync)
/opt/kgc 172.16.58.0/24(rw,sync)
/opt/benet 172.16.58.0/24(rw,sync)


启动NFS和rpcbind服务
systemctl start nfs.service
systemctl start rpcbind.service

3.配置节点服务器 

节点服务器:172.16.58.20 、172.16.58.30

关闭防火墙以及增强功能
systemctl stop firewalld.service
setenforce 0


配置虚拟IP在lo接口
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0
 
vim ifcfg-lo:0
 
DEVICE=lo:0
ONBOOT=yes
IPADDR=172.16.58.180
NETMASK=255.255.255.255


启动虚拟IP并配置路由
ifup lo:0
ifconfig lo:0
route add -host 172.16.58.180 dev lo:0


配置路由在系统启动时自动生效
vim /etc/rc.local
/sbin/route add -host 172.16.58.180 dev lo:0
chmod +x /etc/rc.d/rc.local


调整内核的ARP响应参数
修改内核参数以避免ARP冲突
vim /etc/sysctl.conf
 
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


应用修改
sysctl -p


安装NFS和HTTPD服务,并挂载NFS共享
yum -y install nfs-utils rpcbind httpd
systemctl start rpcbind
systemctl start httpd
 
对于172.16.88.20
mount.nfs 172.16.58.10:/opt/kgc /var/www/html
echo 'this is kgc web!' > /var/www/html/index.html
 
对于172.16.88.30
mount.nfs 172.16.58.10:/opt/benet /var/www/html
echo 'this is benet web!' > /var/www/html/index.html

4.测试LVS集群 

在客户端使用浏览器访问 http://172.16.58.180/


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

相关文章:

  • STM32嵌入式闹钟系统设计与实现
  • hadoop大数据平台
  • aws(学习笔记第十二课) 使用AWS的RDS-MySQL
  • RHCE的学习(16)(shell脚本编程)
  • 回归分析学习
  • LabVIEW 实现 find_nearest_neighbors 功能(二维平面上的最近邻查找)
  • JMeter测试工具的简单了解
  • java和kotlin 可以同时运行吗
  • 高性能微服务架构:Spring Boot 集成 gRPC 实现用户与订单服务即时交互
  • SpringBoot2:web开发常用功能实现及原理解析-整合EasyExcel实现Excel导入导出功能
  • 数据结构修炼——顺序表和链表的OJ题练习
  • C++ string类
  • k8s以及prometheus
  • 树莓派交叉编译
  • 【Web】URI和URL的介绍
  • STM32CubeIDE关于printf()串口输出重定向的问题
  • 『功能项目』项目优化 - 框架加载资源【41】
  • 在 macOS 上管理 Node版本
  • 计算机存储概念
  • python numpy pytorch tensorlfow list 转tenser float 32的方法,模型计算基本用的都是float32,需要转换
  • 常见本地大模型个人知识库工具部署、微调及对比选型
  • mac上Charles怎么配置,可以抓取浏览器/IDEA的接口
  • 【getshell】phpmyadmin后台getshell(4.8.5)
  • springboot+security为什么@ControllerAdvice自定义的异常处理没有生效
  • 怎么去浮毛比较高效?热门除浮毛宠物空气净化器希喂、范罗士、有哈测评推荐
  • Linux与Ubuntu:内核与发行版的关系