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

【计算机网络】LVS四层负载均衡器

https://mobian.blog.csdn.net/article/details/141093263
https://blog.csdn.net/weixin_42175752/article/details/139966198
《高并发的哲学原理》 (基本来自本书)
《亿级流量系统架构设计与实战》

LVS

章文嵩博士创造 LVS(IPVS)
章⽂嵩发现 Cisco 的硬件负载均衡器售价昂贵,于是创建并开源了 LVS(当时称为 IPVS)。如今,互联⽹上的绝⼤部分数据包都由 LVS 或承袭 LVS 思想的软件处理。

融入 Linux Kernel
2004 年,LVS(IPVS)被纳⼊了 kernel 2.4,从此之后,所有 Linux 系统都具备了变⾝为负载均衡器的能⼒。

LVS的优势

  • 高性能:LVS工作在内核层,性能高效,能够处理大量并发请求。避免了⽤户态到内核态的上下⽂切换导致的内存读写开销。这样可以⼤幅提升⼤流量下的数据处理能⼒。
  • 高可用性:通过配置Keepalived等工具,LVS可以实现高可用性,确保服务的持续运行。
  • 灵活性强:支持多种负载均衡算法和工作模式,适应不同的应用场景。

LVS 的基本原理可以⽤⼀句话概括:通过修改 MAC 层、IP 层、TCP 层的数据包,实现了⼀部分交换机和⽹关的功能,从⽽指挥流量到达真正的服务器上

LVS 只需要对数据包的⽬的 IP 地址进⾏修改,然后利⽤⼆层⽹络做基础的数据转发。这个策略让 LVS 承担了最少的计算和流量转发⼯作,增加了 CPU 和内存的资源利⽤率,从⽽⼤幅提升了单机性能

LVS和Nginx

Nginx 是一种高性能的服务器,其性能远高于业务服务器。但是Nginx毕竟是一个应用层软件,单台Nginx服务器能承载的用户请求也是有上限的,当日活用户发展到一定规模后,就需 Nginx集群才能顶住压力。既然是集群,那么势必需要引人一个中间层作为协调者,其负责决定将用户请求转发到哪台Nginx服务器。这个协调者需要有比 Nginx 更高的性能,它就是LVS。

LVS (Linux Virtual Server, Linux 虚拟服务器)是一个虚拟的服务器集群系统,从Linux 2.6 版本开始它已经成为 Linux 内核的一部分,即LVS运行于操作系统层面。

由于LVS基于OSI参考模型的网络层,免去了请求到应用层的层层解析工作,而且LVS工作于操作系统层面,所以 LVS 相比于Nginx有更高的性能。LVS 用于网络接人层时也被称为四层负载均衡器。

LVS和Nginx在转发请求时的区别:

  • Nginx 是基于 OSI 参考模型的第七层(应用层)协议开发的,采用了异步转发形式。Nginx 在保持客户端连接的同时新建一个与业务服务器的连接,等待业务服务器返回响应数据,然后再将响应数据返回给客户端。Nginx 选择异步转发的好处是可以进行失败转移(failover),即:如果与某台业务服务器的连接发生故障,那么就可以换另一个连接,提高了服务的稳定性。Nginx 主要强调的是“代理”。
  • LVS 是基于OSI 参考模型的第四层( 网络层)协议开发的,采用了同步转发形式。当LVS 监听到有客户端请求到来时,会直接通过修改数据包的地址信息将流量转发到下游服务器,让下游服务器与客户端直接连接。LVS 主要强调的是“转发”。

在这里插入图片描述

LVS 工作模式

LVS 有三种常⽤模式:

  1. NAT 模式:即⽹关模式,双向流量均经过⽹关转发,性能开销最⼤。不仅需要修改请求报文的目标地址,还需要修改响应报文的源地址,适用于小规模集群。
  2. TUN 模式:类似于单臂路由,性能⾼且可跨越机房。【单臂路由(router-on-a-stick)是指在路由器的一个接口上通过配置子接口(或“逻辑接口”,并不存在真正物理接口)的方式,实现原来相互隔离的不同VLAN(虚拟局域网)之间的互联互通】。该模式通过IP隧道将请求转发到后端服务器,后端服务器直接将响应报文发回客户端,适用于地理位置分散的集群
  3. DR 模式:仅适⽤于局域⽹,但性能惊⼈,因为回程流量不返回⽹关,直接在局域⽹内传输给客户端。在该模式下,负载均衡器只修改请求报文的目标MAC地址,而不修改IP地址,后端服务器直接将响应报文发回客户端,适用于大规模集群

DR 模式数据包推演

在这里插入图片描述

在 DR 模式下,LVS 只负责修改数据包,不充当⽹关的⾓⾊。因此,需要⼀个⽹关来执⾏公⽹ IP 和私⽹ IP 之间的 NAT 转换。假设客户端 IP 为 123.123.123.123,它向 110.242.68.3 的 80 端⼝发起了⼀个 HTTP 请求。当⽹关接收到⼀个发送给 110.242.68.3 的数据包时,发现协议为 TCP,⽬标端⼝为 80。通过查询⾃⼰的
NAT 表,⽹关发现内部 IP 为 10.0.0.100(即虚拟 IP),内部端⼝为 80。于是,⽹关向局域⽹发送了⼀个
IP 包。由于端⼝和协议保持不变,本次⽹络请求中的关键数据有四个:源 IP 地址、⽬的 IP 地址、源 MAC
地址和⽬的 MAC 地址。

  • 客户端发给⽹关的数据包情况为:
    1. 源 ip:123.123.123.123
    2. ⽬的 ip:110.242.68.3
    3. 源 MAC:客户端 MAC
    4. ⽬的 MAC:⽹关 MAC
  • ⽹关向局域⽹发出的数据包情况为:
    1. 源 ip:123.123.123.123
    2. ⽬的 ip:10.0.0.100(变了)
    3. 源 MAC:⽹关 MAC(变了)
    4. ⽬的 MAC:LVS MAC(变了)
  • LVS 接到该数据包后,会选择⼀个后端服务器,假设它选中的是 10.0.0.1 来真正处理请求,则 LVS 会
    对数据包进⾏如下修改后,再发送给 10.0.0.1:
    1. 源 ip:123.123.123.123
    2. ⽬的 ip:10.0.0.100
    3. 源 MAC:LVS MAC(变了)
    4. ⽬的 MAC:10.0.0.1 的 MAC(变了)
  • 10.0.0.1 在收到该数据包后,发现这个包的⽬的 MAC 地址确实是⾃⼰,⽽且⽬的 ip 10.0.0.100(VIP
    )也是⾃⼰,于是对该数据包进⾏正常的处理,然后将处理结果发送出去:
    1. 源 ip:10.0.0.100
    2. ⽬的 ip:123.123.123.123
    3. 源 MAC:10.0.0.1 的 MAC
    4. ⽬的 MAC:⽹关 MAC(因为⽬的 ip 不在“ip+⼦⽹掩码”所确定的局域⽹范围内,所以该数据包会
      被发送给⽹关)
  • ⽹关收到返回的数据包后,通过查询“五元组关系表”,对端⼝和 ip 信息做出正常的 NAT 修改后,将
    数据包发送回 123.123.123.123,请求结束。

DR 模式特点:

  1. LVS 只需处理正向数据包,通常正向数据包(请求)远⼩于反向数据包(响应),因此带宽占⽤较低。
  2. 反向数据包通过标准的⼆层以太网络传输,每台上游服务器都能达到⾃⼰的线速(⽹络设备接⼝协商速率,
    理论上的最⼤数据传输速率)。
  3. 只能在相同的⼆层⽹络下⼯作(即同⼀个局域⽹),架构上有局限,同时安全性较差。
  4. 需要在每台上游服务器上将 VIP(10.0.0.100)配置为 lo(本地回环)接⼝的 IP。
  5. 需要让每台上游服务器只响应真实 IP(如 10.0.0.1)的 ARP 查询请求,如果不⼩⼼回复了针对 VIP 的
    ARP 请求,将会引发混乱:局域⽹内有多台机器同时声称⾃⼰拥有 10.0.0.100 这个 IP,交换机会崩溃。
    在⽣产环境部署中,由于 LVS 集群是所有流量的⼊⼝,所以其可⽤性需要⾮常⾼,⼀般不会只部署在⼀个机房⾥,因此最常⽤的是 NAT 模式:双向流量都经过 LVS 集群,这样可以实现多地多中心的跨公⽹多活。

Keepalived

LVS 是运⾏在标准以太⽹模型下的负载均衡软件,配合 Keepalived 可以实现⾼可⽤。⽽ OSPF/ECMP 协
议是专业的多链路路由协议,可以实现不丢包的多活。

LVS 拆分了网关单点
LVS 是⽹关型负载均衡继续拆单点的结果:LVS 将⽹关这个单点拆分成了“重定向”和“转发”,⾃⼰只承
担数据包重定向⼯作,将转发留给基础⽹以太⽹来解决,在单机上实现了⾮常⾼的系统容量。在最新的 x86
服务器上,单个 LVS 即使在开销更⼤的 NAT 模式下也可以实现⼤约 20G 的 TCP 带宽。

Keepalived 是⼀款出⾊的开源软件,专为与 LVS 配合⽽设计,主要功能是构建⾃选举集群。它⽀持独⽴部
署三台机器⽤作控制器集群,也可以将控制器部署到应⽤机器上。与 LVS ⼀样,基于虚拟 IP 技术,可在任
意标准以太⽹内运⾏。

Keepalived 运行原理

  1. 两台机器配置同⼀VIP(虚拟 IP):即两台机器的真实 IP 分别为 10.0.0.101 和 10.0.0.102,但虚拟出
    ⼀个 IP 10.0.0.100,不属于任何物理设备,可在任何机器间切换绑定。
  2. 两机频繁通信,通过分数计算确定哪台机器得分更⾼,由该机器向局域⽹发送 VRRP 组播报⽂宣称 VIP
    在我这⾥。
  3. 当得分⾼的主机宕机、断⽹或检测到服务进程消失(如 Nginx 挂掉),得分低的机器会在极短时间内接
    替,宣称 VIP 在⾃⼰这⾥。
  4. 发送给 VIP 的数据包会在短时间失效后由新机器承接(实测中断时间⼩于 1 秒),实现集群⾼可⽤。

高可用 LVS 集群,LVS 与 Keepalived 结合,基于多台物理机,可实现⾼可⽤负载均衡集群
在这里插入图片描述

⾦融级项⽬可在⼀城市跨三个机房做三节点 Keepalived 集群。为何不跨城市?因跨城市属于“两地三中⼼
”⾼可⽤技术领域,⼀般不在⼆层⽹络上进⾏,跨城市专⽤光纤建设费⽤⾼昂,城市内拉光纤更经济实惠。

相关文章:

【计算机网络】LVS四层负载均衡器

https://mobian.blog.csdn.net/article/details/141093263 https://blog.csdn.net/weixin_42175752/article/details/139966198 《高并发的哲学原理》 (基本来自本书) 《亿级流量系统架构设计与实战》 LVS 章文嵩博士创造 LVS(IPVS) 章⽂嵩发…...

Java 守护线程练习 (2024.8.12)

DaemonExercise package DaemonExercise20240812;public class DaemonExercise {public static void main(String[] args) {// 守护线程// 当普通线程执行完毕之后,守护线程没有继续执行的必要,所以说会逐步关闭(并非瞬间关闭)//…...

C#小桌面程序调试出错,如何解决??

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…...

Seatunnel Mysql数据同步到Mysql

环境 mysql-connector-java-8.0.28.jar、connector-cdc-mysql 配置 env {# You can set SeaTunnel environment configuration hereexecution.parallelism 2job.mode "STREAMING"# 10秒检查一次,可以适当加大这个值checkpoint.interval 10000#execu…...

Java Web —— 第五天(请求响应1)

postman Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件 作用:常用于进行接口测试 简单参数 原始方式 在原始的web程序中,获取请求参数,需要通过HttpServletRequest 对象手动获 http://localhost:8080/simpleParam?nameTom&a…...

【LLMOps】手摸手教你把 Dify 接入微信生态

作者:韩方圆 "Dify on WeChat"开源项目作者 概述 微信作为最热门即时通信软件,拥有巨大的流量。 微信友好的聊天窗口是天然的AI应用LUI(Language User Interface)/CUI(Conversation User Interface)。 微信不仅有个人微信,同时提供…...

Ftrans文件摆渡方案:重塑文件传输与管控的科技先锋

一、哪些行业会用到文件摆渡相关方案 文件摆渡相关的产品和方案通常用于需要在不同的网络、安全域、网段之间传输数据的场景,主要是一些有核心数据需要保护的行业,做了网络隔离和划分。以下是一些应用比较普遍的行业: 金融行业:…...

LaTeX中的除号表示方法详解

/除号 LaTeX中的除号表示方法详解1. 使用斜杠 / 表示除号优点缺点 2. 使用 \frac{} 表示分数形式的除法优点缺点 3. 使用 \div 表示标准除号优点缺点 4. 使用 \over 表示分数形式的除法优点缺点 5. 使用 \dfrac{} 和 \tfrac{} 表示大型和小型分数优点缺点 总结 LaTeX中的除号表…...

DID、DID文档、VC、VP分别是什么 有什么关系

DID(去中心化身份) 定义:DID 是一种去中心化的唯一标识符,用于表示个体、组织或设备的身份。DID 不依赖于中央管理机构,而是由去中心化网络(如区块链)生成和管理。 用途:DID 允许用…...

网络安全应急响应

前言\n在网络安全领域,有一句广为人知的话:“没有绝对的安全”。这意味着任何系统都有可能被攻破。安全攻击的发生并不可怕,可怕的是从头到尾都毫无察觉。当系统遭遇攻击时,企业的安全人员需要立即进行应急响应,以将影…...

Qt数据和视图分离——中MCV和MVVM

智能指针 一、背景知识二、命令式编程 vs 声明式编程2.1 命令式编程(Imperative Programming)2.2 声明式编程(Declarative Programming) 三、 MVC(Model-View-Controller)3.1 模型(Model)3.2 视图&#xff…...

重定义变量类型:如#define FLOAT float和typedef float FLOAT的区别

在 C 或 C 中, #define 和 typedef 都可以用来为类型或值创建别名,但它们之间存在一些关键的区别: 预处理指令 ( #define ): #define 是预处理器指令,用于定义宏。 当编译器处理源代码时,预处理器会先运行&#…...

Qt 使用阿里矢量图标库

前言 阿里矢量图标库非常好用,里面有各种丰富的图标,完全免费,还支持自定义图标,还可以将图标打包到一个项目中,使用起来非常方便。 第一步: 打开阿里矢量图标库 第二步: 搜索图标&#x…...

仓颉语言运行时轻量化实践

杨勇勇 华为语言虚拟机实验室架构师,目前负责仓颉语言静态后端的开发工作 仓颉语言运行时轻量化实践 仓颉Native后端(CJNative)是仓颉语言的高性能、轻量化实现。这里的“轻量化”意指仓颉程序运行过程中占用系统资源(内存、CPU等…...

深入理解Python中的subprocess模块

目录 subprocess模块简介常用函数执行外部命令管道通信子进程管理错误处理实际应用示例最佳实践 subprocess模块简介 subprocess模块是Python标准库的一部分,提供了一个跨平台的方法来生成新进程、连接其输入/输出/错误管道,并获取其返回码。该模块旨…...

从零开始搭建 EMQX 集群压测框架

从零开始搭建 EMQX 集群压测框架 架构 在设计以EMQX为中心的MQTT消息队列集群压力测试框架时,我们采用微服务架构模式。EMQX作为消息队列的核心,负责处理MQTT协议的消息发布和订阅。Nginx作为EMQX的反向代理,负责负载均衡和SSL/TLS终端。MQT…...

ArkUI基本介绍

ArkUI:提供HarmonyOS应用UI开发框架,几件开发、精致体验、跨设备/跨平台。 ArkUI(方舟UI框架)为应用的UI开发提供了完整的基础设施,包括简洁的UI语法、丰富的UI功能(组件、布局、动画以及交互事件&#xff…...

vue2+OpenLayers 天地图上打点并且显示相关的信息(2)

上次是在地图上打点 这次鼠标移动在图标上面显示相关的信息 首先有两个事件 鼠标移入 和 鼠标移出事件 pointermove pointerout 鼠标放上去之前 放上去后 代码如下 <template><div class"container"><div id"vue-openlayers" class&quo…...

c++继承(二)

一、友元函数的继承 友元函数不能被继承&#xff0c;就像爸爸的朋友不是你的朋友&#xff0c;如果要有友元函数&#xff0c;在子类重新定义一个。 二、静态成员的继承 静态成员的继承仍然是那个成员&#xff0c;普通成员的继承是不同的。 父类的静态成员属于当前类&#xf…...

低代码开发的崛起:机遇与挑战

近年来&#xff0c;“低代码”开发平台的迅速崛起&#xff0c;已经成为IT行业中不可忽视的趋势。这些平台承诺让非专业人士也能快速构建应用程序&#xff0c;通过减少代码编写的需求&#xff0c;大幅提高开发效率。对于许多企业而言&#xff0c;低代码开发工具成为了一个加速数…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...