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

第二章 部署LVS-DR集群

DR模式(直接路由)

概念

  • Direct Routing,简称DR模式
  • 采用半开放式的网络结构,与TUN模式的结构类似,但内网服务器并不是分散在各地,而是与调度器位于同一个物理网络
  • 负载调度器与内网服务器通过本地网络连接,不需要建立专用的IP隧道
  • 因为调度器只接收外网的请求,内网服务器的响应则是直接由网关路由出去,所以减轻了调度器的压力
  • 针对大规模集群

忽略网关的DR模式工作原理

这里简化工作流程,忽略网关来讲解局域网内数据的转发流程

也就是说目前的场景是:内网中的交换机、后端服务器、调度器

  • 外网客户端发送请求数据包
    • 网络层:源IP地址为客户端IP,目标IP地址为LVS的VIP(Virtual IP)地址
    • 传输层:源IP的一个随机端口。VIP的80端口
    • 数据链路层:源MAC地址是客户端的MAC地址,目标MAC地址是调度器的MAC地址
  • 交换机接收到数据包后
    • 交换机收到数据包后,根据MAC地址表来转发给对应的调度器
    • 交换机将下一跳的源MAC地址是交换机的MAC地址,目标MAC地址修改为调度器的MAC地址,封装成数据帧,然后传递给调度器
  • 调度器转发数据包到后端服务器
    • 调度器将收到的数据包根据调度策略分配给选定的后端服务器
    • 网络层:此时源地址还是客户端的IP地址保持不变,目标IP地址还是VIP
    • 调度器不能转发数据包,而是调度,数据包内的源、目标地址不变
    • 数据链路层:调度器重新封装数据帧,源MAC地址是调度器的MAC地址,目标MAC地址是后端服务器的真实MAC地址
  • 后端服务器处理请求
    • 后端服务器收到请求后去掉帧头部信息解析,进行应答,生成响应的数据包
    • 网络层:此时响应数据包的源IP地址是后端服务器虚拟子 接口绑定的VIP,目标IP地址是客户端的IP
    • 数据链路层:后端服务器重新封装数据帧,源MAC地址是后端服务器的MAC地址,目标MAC地址是客户端的MAC地址
    • (如果不忽略网关的话,目标MAC地址就是网关的内网接口MAC地址)
  • 交换机转发响应给外网客户端
    • 最后,交换机将响应数据包返回给外网客户端
    • 此时源MAC地址是交换机的MAC地址,目标MAC地址是客户端的MAC地址
    • 如果有网关:网关重新封装数据帧,源MAC地址是网关的外网接口MAC地址,目标MAC地址是客户端的MAC地址
注意
IP地址的重要性
  • 源IP地址:在整个通信过程中,源IP地址标识了数据包的发送方,即客户端的地址。这是确保服务器能够正确返回响应的关键。
  • 目标IP地址:目标IP地址则标识了数据包的最终接收方,如调度器或后端服务器的地址。这确保了数据包在网络中正确路由到达目的地。

注:如果在传输过程中源IP地址被修改,会导致客户端不接受该数据包,从而导致通信失败或安全问题。

数据帧的重新封装
  • 数据帧在每个网络设备之间传输时,会根据下一个设备的MAC地址进行重新封装。这是数据链路层的操作,确保数据能够通过物理网络正常传输。
  • 每次重新封装时,会保留原始的网络层(IP层)信息,包括源和目标IP地址。这样做的目的是确保数据包在经过多个网络设备时,能够继续被正确地路由到下一个目标,直到达到最终的接收方。

DR模式中的关键问题

每个节点的VIP

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

为什么VIP要在每个节点上都配置?

是为了让后端服务器生成的响应报文的源地址始终保持是VIP,客户端请求的是VIP,最后应答的也是VIP,保持一致


后端服务器真实IP接收—VIP应答

后端服务器接收请求用的是自己的真实IP接收的,但是响应请求的源地址用的却是VIP

解决方法

需要在每一个后端服务器设置路由条目

本主机内两个网卡接口的路由

本地回环增加一个子接口

当使用ens33网卡收到报文后,如果访问的是VIP的地址,就交给lo:0去处理报文封装

通过路由条目把下一跳修改为本地的另一个虚拟网卡(lo:0)

注:所以DR模式叫做直接路由


ARP

如果交换机和调度器是第一次通信,就需要发出ARP广播来查找调度器服务器

但是在局域网中调度器和后端服务器具有相同的VIP地址,会造成各服务器ARP通信的混乱

  • 当ARP广播发送到LVS-DR集群时,因为调度器和后端服务器都是连接到相同的网络上,他们都会接收到ARP广播
  • 应该设置只有前端的调度器进行响应。其他后端服务器不响应 该ARP广播
解决方法
  • 对后端服务器进行处理,使其不响应针对VIP的ARP请求
  • 使用虚拟接口lo:0承载VIP地址
  • 设置内核参数arp_ignore=1表示系统只响应目标地址为本地真实IP的ARP请求

IP地址
  • 当交换机第一次与调度器通信后,网关内ARP缓存表存储的是VIP对应调度器的MAC地址
  • 但是到后端服务器发送响应报文给网关时,这个响应报文的源地址还是VIP但是MAC地址就变成了后端服务器的MAC地址
  • 网关接收到响应以后,会发现VIP对应的MAC地址与ARP缓存表记录的信息对不上
  • 此时如果不处理,那么下次再有外网请求转发时就会直接发送给后端服务器,而不是调度器了
解决方法

对后端服务器进行处理,设置内核参数arp_announce=2表示系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址

设置完参数以后,后端服务器再发送报文的IP地址就不使用VIP作为地址,而是使用自己的真实地址来发送报文,那么网关接收到了报文就不会冲突了

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

总结

后端服务器的VIP不参与ARP的请求和应答

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Mongodb权限
  • 谷粒商城实战笔记-136-商城业务-首页-整合thymeleaf渲染首页
  • Django异步请求和后台管理实战
  • 『哈哥赠书 - 55期』-『码农职场:IT人求职就业手册』
  • IT课程学习搭子
  • 【AD域】搭建AD域服务器
  • C++STL常用总结
  • 2024年7月30日~2024年8月5日周报
  • 技术速递|VS Code Java 7月更新 - Gradle 支持增强!用户体验改进与 Spring 新功能
  • 量化投资基础(四)之AR、MA、ARMA与ARIMA模型
  • NASA:气溶胶研究处 (ARB) 48 英寸激光雷达数据
  • 边缘计算在智能交通系统中的应用探究
  • qt下载安装
  • 在MINST图像分类数据集上训练一个简单的多层神经网络
  • springboot宠物在线领养系统-计算机毕业设计源码51181
  • 自己简单写的 事件订阅机制
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 2017-08-04 前端日报
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Bootstrap JS插件Alert源码分析
  • HTTP那些事
  • Java 多线程编程之:notify 和 wait 用法
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 检测对象或数组
  • 浏览器缓存机制分析
  • 如何合理的规划jvm性能调优
  • 微信小程序:实现悬浮返回和分享按钮
  • 消息队列系列二(IOT中消息队列的应用)
  • 写代码的正确姿势
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • ​io --- 处理流的核心工具​
  • ​ubuntu下安装kvm虚拟机
  • ​卜东波研究员:高观点下的少儿计算思维
  • ‌‌雅诗兰黛、‌‌兰蔻等美妆大品牌的营销策略是什么?
  • #HarmonyOS:Web组件的使用
  • #pragma once与条件编译
  • (1)(1.11) SiK Radio v2(一)
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (阿里云万网)-域名注册购买实名流程
  • (二)fiber的基本认识
  • (七)Java对象在Hibernate持久化层的状态
  • (算法)N皇后问题
  • (一)模式识别——基于SVM的道路分割实验(附资源)
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)拼包函数及网络封包的异常处理(含代码)
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .NET CORE Aws S3 使用
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .Net 垃圾回收机制原理(二)
  • .NET 事件模型教程(二)
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET面试题(二)
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • // an array of int