一文带你深入理解负载均衡原理

article/2025/10/10 5:45:37

一、背景

"远古时期",单机计算机处理性能很低,一般我们会通过扩容机器配置资源,以便更好承载我们的应用,例如:当时的个人电脑,如果你想玩大型游戏,我们最直接的做法就是替换更好的CPU,增加内存条,扩容磁盘等方式,而这种方式称为向上扩展(Scale Up)。

渐渐人们发现,向上扩展的方式虽然能解决问题,但是代价非常大,原因就在于成本,为了能让业务应用更好向外提供服务,企业不得不花费大价钱购买设备,而那时候的内存、磁盘等设备容量低,价格也很高。总的来说向上扩展这种方式性价比极低。

2004年,Google发布的MapReduce论文,以崭新的向外扩展(Scale Out)方式证明了其价值,简单来说,就是通过增加应用程序实例,将用户请求均匀分发到后端多个实例,从而提高服务数据处理能力。那怎样才能将请求均匀分发到后端呢?

最具有代表性的属2004年开源的Nginx,类似的软件还有Haproxy、Haproxy+keepalived、LVS等,当然有软件就有硬件,耳熟能详的F5就是硬件负载均衡的一种。

总之,负载均衡在现有的网络结构之上,提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

二、四层和七层负载均衡

上面已经提到,目前主流的负载均衡软件有Nginx、LVS等,其中Nginx主要用于七层Loadbalance,也支持四层,LVS典型四层Loadbalance,那四层和七层有什么区别?

下面我们使用wireshark工具抓包分析说明:

  • Frame: 1层,物理层
  • Ethernet II:2层,数据链路层,Mac地址解封装,Arp广播寻址
  • Internet Protocal: 三层,网络层,IP地址解封装,通过路由器寻址
  • Transmission Control Protocol: 四层,传输层

通过上面四层报文信息,可以看到四层报文主要封装了端口信息;

  • Hypertext Transfer Protocol: 七层,应用层,主要封装了请求方法、url、请求头等信息

通过上面可以看出:四层负载,是通过IP+Port的负载均衡;七层负载,是基于web请求方法、url、请求头、端口、path等信息的负载均衡。

由上可知: 七层负载均衡针对web请求负载均衡时,可选维度丰富、灵活,当然Nginx需要解析web请求协议(HTTP, HTTPS, FastCGI, uwsgi, SCGI, gRPC, websocket等)

补充:url格式: scheme:://username:password@host:port/resource_path?query#fragment

三、Nginx 和 LVS

我们此次重点介绍一下Nginx的七层负载均衡和LVS四层负载均衡原理。

Nginx

下游服务: 一般指浏览器或者服务调用方;

上游服务: 后端服务,即被调用服务;

Nginx中通过upstream定义一组被反向代理服务,即定义后端被调用服务;

LVS

LVS工作模式有四种: DR、TUN、NAT、fullNAT,本节只介绍NAT模式,方便理解负载均衡底层实现。

LVS通过调用内核netfilter模块,其底层数据结构为HashMap,当负载均衡服务较大时,LVS比IPTABLES性能好,因为iptables需要从上到下依次match,时间负载度为O(n),而LVS采用Hash算法O(1)。

其网络数据链路如下:

NIC(网卡) ->eth0->XDP->alloc skb->TC ingress -> PREROUTING ->系统路由表->( | INPUT->OUTPUT )FORWARD ->POSTROUTING->TC egress->lxc0->eth0->NIC

四、负载均衡算法

在Nginx中我们我们通过upstream定义一组后端服务,但请求具体到达那个后端服务,往往需要根据业务需求进行负载均衡算法配置。

  • Round Robin

轮训算法,依次将请求分配到各个后台服务器中,一般为默认方式

  • Weight

根据权重来分发请求到不同的机器中,Weight与访问比率成正比,用于后端服务器性能不均、灰度发布场景

  • IP hash

根据请求者IP的hash值降请求发送到上游服务器中,可以解决session问题

  • Least connection

将新的链接请求分配到当前链接最小的服务器,上游服务器性能相近时采用此种为好。

以上,希望对您理解负载均衡有所帮助。码字不易,如果你觉得对你有所帮助,欢迎点赞评论加关注,后续还会出更多优质文章和回答。


http://chatgpt.dhexx.cn/article/LRf3LO8b.shtml

相关文章

Nginx详解(正向代理,反向代理,负载均衡原理)

Nginx详解(正向代理,反向代理,负载均衡原理) 文章目录 Nginx详解(正向代理,反向代理,负载均衡原理)1、Nginx概述:2. 反向代理3. 负载均衡 1、Nginx概述: ngi…

Zookeeper——分布式ID和负载均衡原理

摘要 本文主要是介绍zookeeper的除了大部分人都知道的特性意外的一些其他的特性,对于整体的了解一个分布式注册中心的实现具有完整的了解,同时利用zookeeper的其他的特性在工作中,有利于的更好的解决工作的问题。zookeeper相关的特性或许在解…

OpenFeign 整合 Nacos负载均衡原理

一.OpenFeign介绍 OpenFeign是实现微服务间调用的工具,功能包括编解码、构造http请求等。同时OpenFeign又集成了ribbon功能实现客户端负载均衡能力,Bibbon默认的客户端负载均衡能力是与Eurake集成,Nacos通过重写ribbon的ServerList功能实现ri…

负载均衡技术原理

参看文章: 快速理解高性能HTTP服务端的负载均衡技术原理 简介几种负载均衡原理 浅谈几种常用负载均衡架构 一篇读懂分布式架构下的负载均衡技术:分类、原理、算法、常见方案等 一、 引言 负载均衡(Load Balance)是指将负载(工作任…

Docker Swarm 内部服务发现和负载均衡原理

1. 集群环境准备 搭建三台服务器,并安装docker环境,并保证能正常连接互联网,后面会使用其他镜像做负载均衡测试。 192.168.104.79192.168.104.80192.168.104.81 首先修改hostname,便于后面区分当前操作所在机器:使用…

Spring Cloud - Ribbon 负载均衡原理、负载策略、懒加载

目录 ​编辑 一、Ribbon 负载均衡原理 1.1、前言 1.2、负载均衡的工作流程 二、负载均衡策略 2.1、策略原理 2.2、负载均衡自定义方式 三、Ribbon 加载方式 一、Ribbon 负载均衡原理 1.1、前言 ps:案例是上一章所讲的 “根据订单id查询订单的同时&#xff0…

Ribbon-负载均衡原理

负载均衡原理 SpringCloud底层其实是利用了一个名为Ribbon的组件,来实现负载均衡功能的。 那么我们发出的请求明明是http://userservice/user/1,怎么变成了http://localhost:8081的呢? 源码跟踪 为什么我们只输入了service名称就可以访问了…

Nginx负载均衡原理与实战

Nginx 负载均衡原理与实践 本篇摘自《亿级流量网站架构核心技术》第二章 Nginx 负载均衡与反向代理 部分内容。 当我们的应用单实例不能支撑用户请求时,此时就需要扩容,从一台服务器扩容到两台、几十台、几百台。然而,用户访问时是通过如的…

Nginx负载均衡原理

Nginx简介 Nginx是通过反向代理实现的负载均衡。 什么是正向代理与反向代理? 正向代理就是,客户端通过一台代理服务器访问服务端。 反向代理就是,服务端通过代理服务器为客户端提供服务。 看起来似乎没有什么区别,举个例子。 …

负载均衡原理及算法

目录 背景概述原理分类按照软硬件分类硬件负载均衡软件负载均衡 按照地理结构分类本地负载均衡全局负载均衡 按照实现技术DNS负载均衡IP负载均衡链路层负载均衡混合型负载均衡 按照OSI层次二层负载均衡(数据链路层)三层负载均衡(网络层&#…

Ribbon负载均衡原理

Ribbon restTemplate相结合实现负载均衡,具体原理图详见以下截图: LoadBalancerClient 类执行具体的负载均衡,其继承于 LoadBalancerBase。LoadBalancerInterceptor 中注入了 LoadBalancerClient 对象,LoadBalancerClient执行具…

什么是负载均衡,负载均衡的原理解析是怎么样的

负载均衡对于很多大型企业来说,不管网游,商城,金融等业务,他的重要性无需多说,今天带来负载均衡的原理解析。 开头先理解一下所谓的“均衡”。 不能狭义地理解为分配给所有实际服务器一样多的工作量,因为…

负载均衡工作原理详解

负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。通过某种负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求。 均衡负…

负载均衡原理及实现

什么是负载均衡? 负载均衡( LoadBalance ),顾名思义就是把任务压力进行平衡的分摊到集群中各个操作单元(或机器)上,使得避免集群中部分机器压力过大而部分机器过于空闲。经过负载均衡,使得每个机器获取适合自己的处理能力负载。 …

Android 获取手机已安装的应用列表(适配)

权限 <uses-permissionandroid:name"android.permission.QUERY_ALL_PACKAGES"tools:ignore"QueryAllPackagesPermission" /> 加上权限才能获取到所有的应用 获取代码 public static boolean hasApplication(Context context, String packageName) …

如何在没有微软商店的情况下在Windows 10上安装应用程序

如何在没有微软商店的情况下在Windows 10上安装应用程序 通过微软商店&#xff0c;你可以轻松地在Windows 10设备上安装应用程序&#xff0c;就像使用Google Play或AppleStore一样。IT部门经常从设备上删除微软商店&#xff0c;或设置组策略禁用Windows更新&#xff0c;以防止…

“打开文件所在位置“失败,提示“该文件没有与之关联的应用来执行操作。请安装应用,若已经安装应用...““

问题点:装了某个软件,卸载后出现"打开文件所在位置"失败,出现以下提示: 该文件没有与之关联的应用来执行操作。请安装应用&#xff0c;若已经安装应用&#xff0c;请在“默认应用设置"页面中创建关联 解决办法: 打开注册表,找到HKEY_CLASSES_ROOT\Folder\shell,…

Win 11 打开未知文件/打开方式 该文件没有与之关联的应用来执行该操作。请安装应用,若已经安装应用,请在“默认应用设置”页面中创建关联。

问题 鼠标右键选中文件 - 打开方式&#xff0c;或者选择其他应用 弹窗提示&#xff1a; 该文件没有与之关联的应用来执行该操作。请安装应用&#xff0c;若已经安装应用&#xff0c;请在“默认应用设置”页面中创建关联。 打开注册表&#xff0c;查看是否存在以下路径 HKEY_C…

该文件没有与之关联的应用来执行该操作。请安装应用,若已经安装应用,请在“默认应用设置“页面中创建关联

在任意文件上鼠标右键&#xff0c;选择打开方式或者选择其他应用时报错“该文件没有与之关联的应用来执行该操作。请安装应用&#xff0c;若已经安装应用&#xff0c;请在"默认应用设置"页面中创建关联”&#xff0c;错误现象如下&#xff1a; 打开注册表&#xf…

安装软件程序

包管理基础 在深入了解Linux软件包管理之前&#xff0c;本章将先介绍一些基础知识。各种主流Linux发行版都采用了某种形式的包管理系统来控制软件和库的安装。 PMS利用一个数据库来记录各种相关内容&#xff1a;  Linux系统上已安装了什么软件包&#xff1b;  每个包安装了…