分布式技术之负载均衡技术

文章目录

    • 什么是负载均衡?
    • 服务请求的负载均衡方法
      • 轮询策略
      • 随机策略
      • 哈希和一致性哈希策略
      • 对比分析

  • 负载均衡是分布式可靠性中非常关键的一个问题或技术,在一定程度上反映了分布式系统对业务处理的能力。比如,早期的电商抢购活动,当流量过大时,可能就会发现有些地区可以购买,而有些地区因为服务崩溃而不能抢购。这其实就是系统的负载均衡出现了问题。

什么是负载均衡?

  • 通常情况下,负载均衡可以分为两种:
    • 一种是请求负载均衡,即将用户的请求均衡地分发到不同的服务器进行处理;
    • 另一种是数据负载均衡,即将用户更新的数据分发到不同的存储服务器。
  • 分布式系统中,服务请求的负载均衡是指,当处理大量用户请求时,请求应尽量均衡地分配到多台服务器进行处理,每台服务器处理其中一部分而不是所有的用户请求,以完成高并发的请求处理,避免因单机处理能力的上限,导致系统崩溃而无法提供服务的问题。比如,有 N 个请求、M 个节点,负载均衡就是将 N 个请求,均衡地转发到这 M 个节点进行处理。

在这里插入图片描述

服务请求的负载均衡方法

  • 通常情况下,计算机领域中,在不同层有不同的负载均衡方法。比如,从网络层的角度,通常有基于 DNS、IP 报文等的负载均衡方法;在中间件层,常见的负载均衡策略主要包括轮询策略、随机策略、哈希和一致性哈希等策略。

轮询策略

  • 轮询策略是一种实现简单,却很常用的负载均衡策略,核心思想是服务器轮流处理用户请求,以尽可能使每个服务器处理的请求数相同。生活中也有很多类似的场景,比如,学校宿舍里,学生每周轮流打扫卫生,就是一个典型的轮询策略。
  • 在负载均衡领域中,轮询策略主要包括顺序轮询和加权轮询两种方式。
    • 顺序轮询:假设有 6 个请求,编号为请求 1~6,有 3 台服务器可以处理请求,编号为服务器 1~3,如果采用顺序轮询策略,则会按照服务器 1、2、3 的顺序轮流进行请求。
    • 加权轮询:为每个服务器设置了优先级,每次请求过来时会挑选优先级最高的服务器进行处理。比如服务器 1~3 分配了优先级{4,1,1},这 6 个请求到来时,还当成 6 个步骤,如下所示。
      • 请求 1 由优先级最高的服务器 1 处理,服务器 1 的优先级相应减 1,此时各服务器优先级为{3,1,1};
      • 请求 2 由目前优先级最高的服务器 1 进行处理,服务器 1 优先级相应减 1,此时各服务器优先级为{2,1,1}。
      • 以此类推,直到处理完这 6 个请求。每个请求处理完后,相应服务器的优先级会减 1。
      • 最终的处理结果是,服务器 1 处理请求 1~4,服务器 2 处理请求 5,服务器 3 会处理请求 6。

Nginx 默认的负载均衡策略就是一种改进的加权轮询策略

  • Nginx 轮询策略需要用到的变量:
    • weight:配置文件中为每个服务节点设置的服务节点权重,固定不变。
    • effective_weight:服务节点的有效权重,初始值为 weight。 在 Nginx 的源码中有一个最大失败数的变量 max_fails,当服务发生异常时,则减少相应服务节点的有效权重,公式为 effective_weight = effective_weight - weight / max_fails;之后再次选取本节点,若服务调用成功,则增加有效权重,effective_weight ++ ,直至恢复到 weight。
    • current_weight:服务节点当前权重,初始值均为 0,之后会根据系统运行情况动态变化。
  • 假设,各服务器的优先级是{4,1,1},还是将 6 个请求分为 6 步来进行,如下所示:
    • 遍历集群中所有服务节点,使用 current_weight = current_weight + effective_weight,计算此时每个服务节点的 current_weight,得到 current_weight 为{4,1,1},total 为 4+1+1=6。选出 current_weight 值最大的服务节点即服务器 1 来处理请求,随后服务器 1 对应的 current_weight 减去此时的 total 值,即 4 - 6,变为了 -2 。
    • 按照上述步骤执行,首先遍历,按照 current_weight = current_weight + effective_weight 计算每个服务节点 current_weight 的值,结果为{2,2,2},total 为 6,选出 current_weight 值最大的服务节点。current_weight 最大值有多个服务节点时,直接选择第一个节点即可,在这里选择服务器 1 来处理请求,随后服务器 1 对应的 current_weight 值减去此时的 total,即 2 - 6,结果为 -4。
    • 以此类推,直到处理完这 6 个请求。
    • 最终的处理结果为,服务器 1 处理请求 1、2、4、6,服务器 2 处理请求 3,服务器 3 会处理请求 5。
  • 可以看到,与普通的加权轮询策略相比,这种轮询策略的优势在于,当部分请求到来时,不会集中落在优先级较高的那个服务节点。
  • 轮询策略的优点就是,实现简单,且对于请求所需开销差不多时,负载均衡效果比较明显,同时加权轮询策略还考虑了服务器节点的异构性,即可以让性能更好的服务器具有更高的优先级,从而可以处理更多的请求,使得分布更加均衡。
  • 轮询策略的缺点是,每次请求到达的目的节点不确定,不适用于有状态请求的场景。并且,轮询策略主要强调请求数的均衡性,所以不适用于处理请求所需开销不同的场景。
  • 轮询策略适用于用户请求所需资源比较接近的场景。

随机策略

  • 随机策略也比较容易理解,指的就是当用户请求到来时,会随机发到某个服务节点进行处理,可以采用随机函数实现。这里,随机函数的作用就是,让请求尽可能分散到不同节点,防止所有请求放到同一节点或少量几个节点上。
  • 如图所示,假设有 5 台服务器 Server 1~5 可以处理用户请求,每次请求到来时,都会先调用一个随机函数来计算出处理节点。这里,随机函数的结果只能是{1,2,3,4,5}这五个值,然后再根据计算结果分发到相应的服务器进行处理。比如,图中随机函数计算结果为 2,因此该请求会由 Server2 处理。
    在这里插入图片描述
  • 这种方式的优点是,实现简单,但缺点也很明显,与轮询策略一样,每次请求到达的目的节点不确定,不适用于有状态的场景,而且没有考虑到处理请求所需开销。除此之外,随机策略也没有考虑服务器节点的异构性,即性能差距较大的服务器可能处理的请求差不多。
  • 因此,随机策略适用于,集群中服务器节点处理能力相差不大,用户请求所需资源比较接近的场景。比如,RPC 框架 Dubbo,当注册中心将服务提供方地址列表返回给调用方时,调用方会通过负载均衡算法选择其中一个服务提供方进行远程调用。关于负载均衡算法,Dubbo 提供了随机策略、轮询策略等。

哈希和一致性哈希策略

  • 无论是轮询还是随机策略,对于一个客户端的多次请求,每次落到的服务器很大可能是不同的,如果这是一台缓存服务器,就会对缓存同步带来很大挑战。尤其是系统繁忙时,主从延迟带来的同步缓慢,可能会造成同一客户端两次访问得到不同的结果。解决方案就是,利用哈希算法定位到对应的服务器。
  • 哈希和一致性哈希,是数据负载均衡的常用算法。数据分布算法的均匀性,一方面指数据的存储均匀,另一方面也指数据请求的均匀。数据请求就是用户请求的一种,哈希、一致性哈希、带有限负载的一致性哈希和带虚拟节点的一致性哈希算法,同样适用于请求负载均衡。
  • 所以,哈希与一致性策略的优点是,哈希函数设置合理的话,负载会比较均衡。而且,相同 key 的请求会落在同一个服务节点上,可以用于有状态请求的场景。除此之外,带虚拟节点的一致性哈希策略还可以解决服务器节点异构的问题。但其缺点是,当某个节点出现故障时,采用哈希策略会出现数据大规模迁移的情况,采用一致性哈希策略可能会造成一定的数据倾斜问题。同样的,这两种策略也没考虑请求开销不同造成的不均衡问题。
  • 应用哈希和一致性哈希策略的框架有很多,比如 Redis、Memcached、Cassandra 等。除了以上这些策略,还有一些负载均衡策略比较常用。比如,根据服务节点中的资源信息(CPU,内存等)进行判断,服务节点资源越多,就越有可能处理下一个请求;再比如,根据请求的特定需求,如请求需要使用 GPU 资源,那就需要由具有 GPU 资源的节点进行处理等。

对比分析

在这里插入图片描述

知识扩展:如果要考虑请求所需资源不同的话,应该如何设计负载均衡策略呢?
轮询策略、随机策略,以及哈希和一致性哈希策略,主要考虑的是请求数的均衡,并未考虑请求所需资源不同造成的不均衡问题。那么,如何设计负载均衡策略,才能解决这个问题呢?
其实,这个问题的解决方案有很多,常见的思路主要是对请求所需资源与服务器空闲资源进行匹配,也称调度。
关于调度,我们可以使用单体调度的思路,让集群选举一个主节点,每个从节点会向主节点汇报自己的空闲资源;当请求到来时,主节点通过资源调度算法选择一个合适的从节点来处理该请求。
最差匹配和最佳匹配算法。这两种算法各有利弊,最差匹配算法可以尽量将请求分配到不同机器,但可能会造成资源碎片问题;而最佳匹配算法,虽然可以留出一些“空”机器来处理开销很大的请求,但会造成负载不均的问题。因此,它们适用于不同的场景。
除此之外,一致性哈希策略也可以解决这个问题:让请求所需的资源和服务器节点的空闲资源,与哈希函数挂钩,即通过将资源作为自变量,带入哈希函数进行计算,从而映射到哈希环中。
比如,我们设置的哈希函数结果与资源正相关,这样就可以让资源开销大的请求由空闲资源多的服务器进行处理,以实现负载均衡。但这种方式也有个缺点,即哈希环上的节点资源变化后,需要进行哈希环的更新。

你知道的越多,你不知道的越多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/587296.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4.36 构建onnx结构模型-Where

前言 构建onnx方式通常有两种: 1、通过代码转换成onnx结构,比如pytorch —> onnx 2、通过onnx 自定义结点,图,生成onnx结构 本文主要是简单学习和使用两种不同onnx结构, 下面以 Where 结点进行分析 方式 方法一…

记录一下imx6ull linux 5.10.9多点电容触摸屏驱动报错问题解决方法

最近再研究如何将linux 5.10.9移植到imx6ull,用的原子的开发板,在移植电容触摸屏驱动时报错gpio gpiochip0: (209c000.gpio): gpiochip_lock_as_irq: tried to flag a GPIO set as output for IRQ,如下图: 该错误的意思就是尝试将…

数据库系统概论SQL编程题合集(包含期末题、考研初试题以及复试题)

二、现有数据库casemanage中表结构如下图 1)请编写sql语句对年龄进行升序排列 select * from afinfo order by birth;2)请编写sql语句查询对“徐”姓开头的人员名单 select * from afinfo where name like 徐%;3)请编写sql语句修改“陈晓”…

【在大厂做测试外包这一年】

​ 在大厂做测试外包这一年 大厂外包是一种趋势,以后可能会越来越多,最起码测试行业是这样,像我们的测试工作,我所在的项目领导是大厂内部的,组长是OD外包,组员是普通外包。   1、关于办公方式 有两种方…

2024年【茶艺师(初级)】考试技巧及茶艺师(初级)试题及解析

题库来源:安全生产模拟考试一点通公众号小程序 茶艺师(初级)考试技巧是安全生产模拟考试一点通生成的,茶艺师(初级)证模拟考试题库是根据茶艺师(初级)最新版教材汇编出茶艺师&#…

「Kafka」入门篇

「Kafka」入门篇 基础架构 Kafka 快速入门 集群规划 集群部署 官方下载地址:http://kafka.apache.org/downloads.html 解压安装包: [atguiguhadoop102 software]$ tar -zxvf kafka_2.12-3.0.0.tgz -C /opt/module/修改解压后的文件名称: [a…

Vue3使用WangEditor编辑器

WangEditor的基本使用&#xff0c;图片上传功能 没详细讲解&#xff0c;只是做个记录。 Componets 下定义 WangEditor.vue 文件 <template><div style"border: 1px solid #ccc;"><Toolbar style"border-bottom: 1px solid #ccc" :editor&q…

关于HTTPS

目录 什么是加密 对称加密 非对称加密 中间人攻击 引入证书 HTTPS是一个应用层的协议,是在HTTP协议的基础上引入了一个加密层. HTTP协议内容都是按照文本的方式明文传输,这就导致在传输的过程中出现一些被篡改的情况. 运营商劫持事件 未被劫持的效果,点击下载按钮,就会…

Mybatis分页插件之PageHelper生效and失效原理解析

文章目录 前言整合PageHelperPageHelper生效原理PageHelper的分页参数和线程绑定核心拦截逻辑生成分页SQLdialect.afterAll() PageHelper失效原理分页失效案例分页失效原理总结 Mybatis拦截器系列文章&#xff1a;从零开始的 MyBatis 拦截器之旅&#xff1a;实战经验分享 构建自…

探索 3D 图形处理的奥秘

最近一年多来&#xff0c;在 3Dfx、Intel 们的狂轰滥炸中&#xff0c;在 Quake、古墓丽影们的推波助澜下&#xff0c;三维图形已经成为计算机迷眼中的又一个热点。3D 世界到底是怎样的神奇&#xff0c;我们又是怎样享受它的乐趣呢&#xff1f;就让我们来一探究竟吧。 图形基础…

K8s资源管理介绍

用这个官网下的&#xff0c;kube-flannel.yml &#xff0c;就不会nodes not-ready --- kind: Namespace apiVersion: v1 metadata:name: kube-flannellabels:k8s-app: flannelpod-security.kubernetes.io/enforce: privileged --- kind: ClusterRole apiVersion: rbac.author…

递归详解之青蛙跳台阶和汉诺塔问题

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

51单片机三种编译模式的相互关系

51单片机三种编译模式的相互关系 编译模式默认存储类型RAM使用规模变量使用特点SAMLLdata128B片内RAM使用规模CPU访问数据速度快&#xff0c;但存储容量较小COMPACTpdata258B片外分页RAM速度和容量介于上下两者之间LARGExdata64KB片外RAMCPU访问数据的速度较慢&#xff0c;但存…

idea利用JRebel插件,无需重启,实现Spring Boot项目热重载,节省开发时间和精力!

插件介绍 官方介绍 翻译过来的意思是&#xff1a; JRebel 是一款提高开发效率的工具&#xff0c;允许开发者立即重新加载代码更改。它跳过了在Java开发中常见的重新构建、重启和重新部署循环。JRebel 能够让开发者在相同的时间内完成更多工作&#xff0c;并且在编码时能够保持…

Linux Ubuntu 和 Mac ,Windows 部署离线通义千问1.8B参数 4-bit量化大模型详细教程 全网唯一

代码为我自己写的 python 程序,应该是全网最简单的大模型部署方案,一个模型文件1.3GB,一个python代码即可开始玩耍~ 首先说明,本文下面的内容需要一点点python基础,需要会安装 python和 pip 安装依赖库,如果你不会或者不想这么麻烦,只想要下载就能马上使用的大模型离线整…

【Unity3D】Unity3D技术栈

1 前言 本文梳理了笔者在学习 Unity3D 的过程中&#xff0c;对 Unity3D 的理解和学习路线&#xff0c;以帮助读者循序渐进地学习 Unity3D&#xff0c;后续笔者仍会持续更新 Unity3D 相关技术栈&#xff0c;并同步到本文中。 1.1 专栏文章特点 知识系统&#xff1a;专栏从资源…

python------Pymysql模块

查询 总结&#xff1a; fetchall(): 获取所有查询到的内容。返回结果是嵌套的元组 fetchone(): 获取一条数据。返回结果就是一个非嵌套的元组 fetchmany(num): 返回结果是元组嵌套&#xff0c;底层也是有游标的。如果不传递参数num&#xff0c;默认读取一条数据 注意: 与文件…

CSS与JavaScript的简单认识

CSS&#xff1a;是一门语言&#xff0c;用于控制网页表现&#xff0c;让页面更好看的。 CSS&#xff08;Cascading Style Sheet&#xff09;&#xff1a;层叠样式表 CSS与html结合的三种方式&#xff1a; 1、内部样式&#xff1a;用style标签&#xff0c;在标签内部定义CSS样式…

vim学习笔记

vim学习笔记 Linux Vim编辑器的基本使用 显示行号 set nu 自动补全 CTRL-N或CTRL-P $到当前行的末尾 u 撤销上一步的操作 Ctrlr 恢复上一步被撤销的操作 vim下配置tab缩进格数 原始文件&#xff1a; helloworld nice 普通缩进 shift > &#xff08;或者 Shift <…

springcloud微服务篇--6.网关Gateway

一、为什么需要网关&#xff1f; 网关功能&#xff1a; 身份认证和权限校验 服务路由、负载均衡 请求限流 在SpringCloud中网关的实现包括两种&#xff1a; gateway zuul Zuul是基于Servlet的实现&#xff0c;属于阻塞式编程。而SpringCloudGateway则是基于Spring5中提供的Web…