负载均衡技术原理

article/2025/10/10 11:28:50

参看文章:

快速理解高性能HTTP服务端的负载均衡技术原理

简介几种负载均衡原理

浅谈几种常用负载均衡架构

一篇读懂分布式架构下的负载均衡技术:分类、原理、算法、常见方案等


一、 引言

负载均衡(Load Balance)是指将负载(工作任务)进行平衡、分摊到多个操作单元上运行,促使多台设备共同更快、更高效完成某一项或者多项任务。负载均衡在现有网络结构基础上,提供了一种透明并且廉价有效的方法扩展服务器和网络设备的带宽、加强网络数据处理能力,增加吞吐量、提高网络的可用性和灵活性。

负载均衡包含两方面的含义:

  • ①将一个复杂任务拆分成多个子任务,然后交由多个操作单元协作处理,最后共同完成这项任务。是不是有点像分布式计算呢?
  • ②将海量、高并发访问处理均分到多个处理单元中,雨露均沾,避免旱的旱死,涝的涝死。

为什么要负载均衡?

在网站创立之初,一般只需要一台服务器(通常为LAMP架构作为解决方案)对外提供服务即可,但是随着业务快速扩大,原先的架构依然无法满足现在的业务需求。此时就需要对服务器进行扩容,简单的说就是将多台服务器组成一个集群共同对外提供服务(架构一步到位了),通过负载均衡技术将用户的请求分流到不同的服务器上,从而达到扩容的目的,这便是负载均衡存在的意义。

目前,负载均衡技术已经广泛地应用在网络之中。就拿全国人民都知晓的“双11购物节”而言,每一秒的订单量都是巨大的,只通过几台服务器完全无法满足这么多人同时访问。各个互联网巨头(淘宝、京东、微信、支付宝、抖音、美团等等)都是通过各种各样的技术来解决这么高的并发访问、海量数据存储等等,他们在满足自己业务需求的同时,将自己的解决方案通过搭建云平台来出售,供其他的小公司使用,从而降低小公司的运营成本(无需从头开始,一步一步来摸索高并发架构解决方案)。

这些解决方案现在基本都是利用集群技术,达到最佳的资源使用、最大化吞吐率、最短的响应时间,避免单点过载问题。集群技术的使用,不可避免的会用到负载均衡技术,否则便无法发挥集群技术的优势。下面负载均衡技术做一个详细的介绍。

二、 负载均衡实现分类

负载均衡实现目前可以分为3类:

基于DNS负载均衡

 

基于硬件的负载均衡

比如F5

基于软件的负载均衡

比如LVS, NGINX,Squid

原理:当用户访问域名的时候(如www.taobao.com),会先向DNS服务器去解析域名对应的IP地址,这个时候我们可以让DNS服务器根据不同地理位置的用户返回不同的IP。比如杭州的用户就返回淘宝在杭州业务服务器的IP,北京的用户来访问的话,就返回淘宝在北京业务服务器所在的IP。

 

 

在这个模式下,用户就相当于实现了按照「就近原则」将请求分流了,既减轻了单个集群的负载压力,也提升了用户的访问速度。

使用DNS做负载均衡的方案,天然的优势就是配置简单,实现成本非常低,无需额外的开发和维护工作。

但是它也有一个明显的缺点:当配置修改后,生效不及时。这个是由于DNS的特性导致的,DNS一般会有多级缓存,所以当我们修改了DNS配置之后,由于缓存的原因,会导致IP变更不及时,从而影响负载均衡的效果。

另外,使用DNS做负载均衡的话,大多是基于地域或者干脆直接做IP轮询,没有更高级的路由策略,所以这也是DNS方案的局限所在。

有专门的硬件加持,可能比用软件处理要高效。在硬件负载均衡器中,最出名的就是F5负载均衡器:

硬件负载均衡器特点只有一个:除了贵,什么都好。就这一个特点就导致它的市场没有那个普及,因此更多中小公司使用了软件的负载均衡技术。

软件技术的负载均衡,基于OSI 网络模型来实现。我们通过OSI 7层模型来简单说明存在的负载均衡技术。

软件负载均衡分类:

  • 二层负载均衡

负载均衡服务器对外提供一个公网IP, 集群中的真正服务器使用相同的内网IP地址,但是MAC地址不同。当负载均衡服务器收到客户请求时,通过修改报文中的目的MAC地址,将报文分流到不同的设备上,从而达到负载均衡的目的。此技术好像不常用。

  • ​​​​​​​三层负载均衡

负载均衡服务器对外提供一个公网IP, 集群中的真正服务器使用不同的内网IP地址。当负载均衡服务器收到客户请求时,通过修改报文中的目的IP地址,将报文分流到不同的设备上,从而达到负载均衡的目的。

  • ​​​​​​​四层负载均衡

四层负载均衡服务器除了使用传输层(TCP\UDP协议)的端口信息外,也会结合IP层源目的IP地址进行处理。当负载均衡服务器收到客户请求时,通过修改报文中的IP和端口,将报文分流到不同的设备上,从而达到负载均衡的目的。

  • LVS
  • NAT
  • IP隧道
  • ​​​​​​​七层负载均衡

七层负载均衡工作在OSI模型的应用层,应用层的协议类型比较多(可以参考上图),可以通过应用层协议进行分流,同时也可以根据报文中的内容(如URL、浏览器类型、语言、甚至地址位置等)进行负载均衡

  • Nginx负载均衡

其中软件中最常用的就是Nginx负载均衡(7层)和LVS负载均衡(4层)。

基于四层的负载均衡效率要高,一般能达到每秒几十万的处理量;而基于7层的负载均衡处理量一般在每秒几万。

基于软件的负载均衡特点很明显:便宜呀!!!。中小公司可以直接基于开源代码做移植、适配即可,且可以部署在普通服务器上,在研发成本和硬件上大大降低了成本,从而得到了很多公司的使用。

 

三、 负载均衡算法

主要的均衡算法有:

负载均衡算法可以分为两类:静态负载均衡算法动态负载均衡算法

  • 静态负载均衡算法包括:轮询、比率、优先权
  • 动态负载均衡算法包括:最少连接数、最快响应速度、观察方法、预测法、动态性能分配、动态服务器补充、服务质量、服务类型、规则模式

  • 轮询(Round Robin):顺序循环将请求一次顺序循环地连接每个服务器。当其中某个服务器发生第二到第 7 层的故障,BIG-IP 就把其从顺序循环队列中拿出,不参加下一次的轮询,直到其恢复正常。

实现时,一般为服务器带上权重;这样有两个好处:针对服务器的性能差异可分配不同的负载;当需要将某个结点剔除时,只需要将其权重设置为0即可;

  • 优点:实现简单、高效;易水平扩展
  • 缺点:请求到目的结点的不确定,造成其无法适用于有写的场景(缓存,数据库写)
  • 应用场景:数据库或应用服务层中只有读的场景
  • 随机方式请求随机分布到各个结点;在数据足够大的场景能达到一个均衡分布;
    • 优点:实现简单、易水平扩展
    • 缺点:同 Round Robin,无法用于有写的场景
    • 应用场景:数据库负载均衡,也是只有读的场景
  • 哈希方式根据 key 来计算需要落在的结点上,可以保证一个同一个键一定落在相同的服务器上;
    • 优点:相同 key 一定落在同一个结点上,这样就可用于有写有读的缓存场景
    • 缺点:在某个结点故障后,会导致哈希键重新分布,扩展性较差。
    • 解决:一致性哈希 or 使用 keepalived 保证任何一个结点的高可用性,故障后会有其它结点顶上来
    • 应用场景:缓存,有读有写
  • 一致性哈希在服务器一个结点出现故障时,受影响的只有这个结点上的 key,最大程度的保证正确率;如 twemproxy 中的 ketama方案;生产实现中还可以规划指定子 key 哈希,从而保证局部相似特征的键能分布在同一个服务器上;
  • 根据键的范围来负载根据键的范围来负载,前 1 亿个键都存放到第一个服务器,1~2 亿在第二个结点。
    • 优点:水平扩展容易,存储不够用时,加服务器存放后续新增数据
    • 缺点:负载不均;数据库的分布不均衡;
    • (数据有冷热区分,一般最近注册的用户更加活跃,这样造成后续的服务器非常繁忙,而前期的结点空闲很多)
    • 适用场景:数据库分片负载均衡
  • 根据键对服务器结点数取模来负载根据键对服务器结点数取模来负载;比如有 4 台服务器,key 取模为 0 的落在第一个结点,1 落在第二个结点上。
    • 优点:数据冷热分布均衡,数据库结点负载均衡分布;
    • 缺点:水平扩展较难;
    • 适用场景:数据库分片负载均衡
  • 纯动态结点负载均衡根据 CPU、IO、网络的处理能力来决策接下来的请求如何调度。
    • 优点:充分利用服务器的资源,保证个结点上负载处理均衡
    • 缺点:实现起来复杂,真实使用较少
  • 比率(Ratio):给每个服务器分配一个加权值为比例,根椐这个比例,把用户的请求分配到每个服务器。当其中某个服务器发生第 2 到第 7 层的故障,BIG-IP 就把其从服务器队列中拿出,不参加下一次的用户请求的分配,直到其恢复正常。
  • 优先权(Priority):给所有服务器分组,给每个组定义优先权,BIG-IP 用户的请求,分配给优先级高的服务器组(在同一组内,采用轮询或比率算法,分配用户的请求);当高优先级中所有服务器出现故障,BIG-IP 才将请求送给次优先级的服务器组。这种方式,实际为用户提供一种热备份的方式。
  • 最少的连接方式(Least Connection)传递新的连接给那些进行最少连接处理的服务器。当其中某个服务器发生第 2 到第 7 层的故障,BIG-IP 就把其从服务器队列中拿出,不参加下一次的用户请求的分配,直到其恢复正常。
  • 最快模式(Fastest):传递连接给那些响应最快的服务器。当其中某个服务器发生第二到第7 层的故障,BIG-IP 就把其从服务器队列中拿出,不参加下一次的用户请求的分配,直到其恢复正常。

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

相关文章

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;  每个包安装了…

android 获取已安装应用(App)列表

效果图 获取手机上已安装应用列表&#xff0c;将获取到的信息用集合返回&#xff0c;可以自己定义是否过滤系统应用&#xff0c;Appinfo是一个实体类&#xff0c;包含应用的名称 包名 图标icon等等 /*** 获取手机已安装应用列表* param ctx* param isFilterSystem 是否过滤系统…

应用程序安装流程

https://maoao530.github.io/2017/01/18/package-install/ 本文介绍APK的安装流程。 一、安装流程图 APK安装流程&#xff0c;总体可以下图流程&#xff0c;用ProcessOn画的&#xff0c;凑合看&#xff1a; 从上图我们可以看到apk安装到最后都会调用到这个flow&#xff1a; PM…

app 安装方式

APK的安装方式主要有以下几种&#xff1a; 通过adb命令安装&#xff1a;adb 命令包括adb push/install用户下载的Apk&#xff0c;通过系统安装器PackageInstaller安装该Apk。PackageInstaller是系统内置的应用程序&#xff0c;用于安装和卸载应用程序。系统开机时安装系统应用…

安卓手机怎样安装apk应用

以华为手机为例 首先手机要关闭纯净模式&#xff0c;方法&#xff1a; 设置–系统和更新–纯净模式–关闭 然后下载/接收apk文件 &#xff08;如果是从浏览器下载的&#xff0c;可以直接安装&#xff0c;如果是从其他渠道下载&#xff0c;则安装方法如下&#xff09; 打开手机…