【计算机网络】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 有三种常⽤模式:
- NAT 模式:即⽹关模式,双向流量均经过⽹关转发,性能开销最⼤。不仅需要修改请求报文的目标地址,还需要修改响应报文的源地址,适用于小规模集群。
- TUN 模式:类似于单臂路由,性能⾼且可跨越机房。【单臂路由(router-on-a-stick)是指在路由器的一个接口上通过配置子接口(或“逻辑接口”,并不存在真正物理接口)的方式,实现原来相互隔离的不同VLAN(虚拟局域网)之间的互联互通】。该模式通过IP隧道将请求转发到后端服务器,后端服务器直接将响应报文发回客户端,适用于地理位置分散的集群。
- 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 地址。
- 客户端发给⽹关的数据包情况为:
- 源 ip:123.123.123.123
- ⽬的 ip:110.242.68.3
- 源 MAC:客户端 MAC
- ⽬的 MAC:⽹关 MAC
- ⽹关向局域⽹发出的数据包情况为:
- 源 ip:123.123.123.123
- ⽬的 ip:10.0.0.100(变了)
- 源 MAC:⽹关 MAC(变了)
- ⽬的 MAC:LVS MAC(变了)
- LVS 接到该数据包后,会选择⼀个后端服务器,假设它选中的是 10.0.0.1 来真正处理请求,则 LVS 会
对数据包进⾏如下修改后,再发送给 10.0.0.1:- 源 ip:123.123.123.123
- ⽬的 ip:10.0.0.100
- 源 MAC:LVS MAC(变了)
- ⽬的 MAC:10.0.0.1 的 MAC(变了)
- 10.0.0.1 在收到该数据包后,发现这个包的⽬的 MAC 地址确实是⾃⼰,⽽且⽬的 ip 10.0.0.100(VIP
)也是⾃⼰,于是对该数据包进⾏正常的处理,然后将处理结果发送出去:- 源 ip:10.0.0.100
- ⽬的 ip:123.123.123.123
- 源 MAC:10.0.0.1 的 MAC
- ⽬的 MAC:⽹关 MAC(因为⽬的 ip 不在“ip+⼦⽹掩码”所确定的局域⽹范围内,所以该数据包会
被发送给⽹关)
- ⽹关收到返回的数据包后,通过查询“五元组关系表”,对端⼝和 ip 信息做出正常的 NAT 修改后,将
数据包发送回 123.123.123.123,请求结束。
DR 模式特点:
- LVS 只需处理正向数据包,通常正向数据包(请求)远⼩于反向数据包(响应),因此带宽占⽤较低。
- 反向数据包通过标准的⼆层以太网络传输,每台上游服务器都能达到⾃⼰的线速(⽹络设备接⼝协商速率,
理论上的最⼤数据传输速率)。 - 只能在相同的⼆层⽹络下⼯作(即同⼀个局域⽹),架构上有局限,同时安全性较差。
- 需要在每台上游服务器上将 VIP(10.0.0.100)配置为 lo(本地回环)接⼝的 IP。
- 需要让每台上游服务器只响应真实 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 运行原理
- 两台机器配置同⼀VIP(虚拟 IP):即两台机器的真实 IP 分别为 10.0.0.101 和 10.0.0.102,但虚拟出
⼀个 IP 10.0.0.100,不属于任何物理设备,可在任何机器间切换绑定。 - 两机频繁通信,通过分数计算确定哪台机器得分更⾼,由该机器向局域⽹发送 VRRP 组播报⽂宣称 VIP
在我这⾥。 - 当得分⾼的主机宕机、断⽹或检测到服务进程消失(如 Nginx 挂掉),得分低的机器会在极短时间内接
替,宣称 VIP 在⾃⼰这⾥。 - 发送给 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 视图ÿ…...
重定义变量类型:如#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功能(组件、布局、动画以及交互事件ÿ…...
vue2+OpenLayers 天地图上打点并且显示相关的信息(2)
上次是在地图上打点 这次鼠标移动在图标上面显示相关的信息 首先有两个事件 鼠标移入 和 鼠标移出事件 pointermove pointerout 鼠标放上去之前 放上去后 代码如下 <template><div class"container"><div id"vue-openlayers" class&quo…...
c++继承(二)
一、友元函数的继承 友元函数不能被继承,就像爸爸的朋友不是你的朋友,如果要有友元函数,在子类重新定义一个。 二、静态成员的继承 静态成员的继承仍然是那个成员,普通成员的继承是不同的。 父类的静态成员属于当前类…...
低代码开发的崛起:机遇与挑战
近年来,“低代码”开发平台的迅速崛起,已经成为IT行业中不可忽视的趋势。这些平台承诺让非专业人士也能快速构建应用程序,通过减少代码编写的需求,大幅提高开发效率。对于许多企业而言,低代码开发工具成为了一个加速数…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
