深入浅出分布式技术原理
陈现麟
伴鱼技术中台负责人,前小米工程师
21241 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 39 讲
深入浅出分布式技术原理
15
15
1.0x
00:00/00:00
登录|注册

05|负载均衡:从状态的角度重新思考负载均衡

公平性:虚拟节点平衡实例负载
解决 Hash 问题
问题:实例变化影响路由稳定性
最少链接数
权重随机
随机
FAIR
公平性:适用于实例性能差异
公平性:适用于实例性能均等
数据分片机制
状态信息索引
路由服务
保证有状态实例的路由正确性
利用请求状态信息进行路由
一致性 Hash
Hash
正确性由后端实例保证
利用请求状态信息简单路由
其他策略
权重轮询
轮询
请求状态不影响路由
后端实例无状态
最少数据迁移实现扩容
如何保证路由正确性
实现
定义
策略
定义
策略
定义
特别关注有状态服务
路由到能正确处理请求的实例
避免资源浪费
确保各实例负载均衡
扩容 Hash 策略路由的 MySQL 集群
负载均衡与数据分片的关系
有状态实例:选择合适的半状态或全状态负载均衡策略
无状态实例:选择合适的无状态负载均衡策略
评价负载均衡策略:公平性和正确性
全状态的负载均衡
半状态的负载均衡
无状态的负载均衡
正确性
公平性
思考题
总结
负载均衡策略
关键点
负载均衡:从状态的角度重新思考负载均衡

该思维导图由 AI 生成,仅供参考

你好,我是陈现麟。
通过学习“注册发现”的内容,你已经明白了分布式系统为什么需要注册发现组件,也知道了在实现注册发现时要注意的两个关键点,并且理解了从 CAP 理论的角度来说,注册发现是一个 AP 模型。如果我们想把极客时间这个单体服务,改造成一个分布式系统,那么这些内容都将为我们打下一个良好的基础。
同时,极客时间为了实现系统的高可用和高性能,它所有的服务都会部署多个实例,那么这就会导致在极客时间的后端系统,调用方通过注册发现组件,去获得被调用服务实例的网络地址时,获取到包含多个服务实例的网络地址列表。这时你将面临一个新的问题,那就是调用方应该将请求,发向被调用服务的哪一个服务实例呢
在本节课里,我们就一起来解决分布式系统中,多个被调用服务实例的选择问题,即负载均衡策略。我们会先从负载均衡在架构设计中需要考虑的关键点出发,根据负载均衡策略是否关心请求中携带的信息,即请求是否有状态,将负载均衡策略分为无状态的负载均衡、半状态的负载均衡和全状态的负载均衡,从状态的角度来重新思考。

负载均衡的关键点

每一个被调用服务(后面简称为后端服务)都会有多个实例,那么服务的调用方应该将请求,发向被调用服务的哪一个服务实例,这就是负载均衡的业务场景。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文从状态的角度重新思考负载均衡,探讨了负载均衡在架构设计中需要考虑的关键点,并根据负载均衡策略是否关心请求中携带的信息,将负载均衡策略分为无状态的负载均衡、半状态的负载均衡和全状态的负载均衡。文章首先介绍了负载均衡的关键点,包括公平性和正确性,然后针对无状态的负载均衡策略进行了详细讨论,包括轮询和权重轮询两种策略。轮询策略按顺序分配请求给多个实例,适用于请求的工作负载和实例的处理能力差异较小的情况;而权重轮询策略根据实例的权重比例来分配请求,可解决实例的处理能力差异问题,具有更好的公平性。除此之外,无状态的负载均衡策略还包括FAIR、随机、权重随机和最少链接数等策略。通过对这些策略的分析,读者可以更好地理解负载均衡的概念和实际应用。 半状态的负载均衡策略利用请求的状态信息进行路由,但仅进行简单的规则处理,如 Hash 运算加求模来路由请求。一致性 Hash 策略可以解决 Hash 策略在实例数量变化后的正确性问题,同时通过增加虚拟节点来解决公平性问题。全状态的负载均衡策略在后端实例有状态的情况下,依然会保证路由的正确性,通常以路由服务的形式存在。 总结来说,本文深入探讨了负载均衡策略在分布式系统中的应用,涵盖了无状态、半状态和全状态的负载均衡策略,以及各种具体的策略实现和应用场景。读者可以通过本文全面了解负载均衡的关键概念和策略选择,为实际应用提供了有益的指导和思路。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入浅出分布式技术原理》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(15)

  • 最新
  • 精选
  • 啊树
    置顶
    服务路由是指etcd eureka这样的注册组件么?还是建立在注册组件之上的服务?

    作者回复: 服务路由是指通过服务的唯一标识找到服务的ip和port,所以它就是服务注册发现~

    2022-02-07
    2
  • 努力努力再努力
    今天 才有空 整理,出本节的那天就看了 总结: 1. 负载均衡策略 1.1 无状态 1.2 半状态 1.3 全状态 2. 关键点: 2.1 公平性 2.2 正确性 (请求调度到能正确处理它的后端实例上) 3. 无状态的负载均衡 4. 负载均衡策略: 4.1 无状态 4.1.1 轮训 (请求的工作负载和实例的处理能力差异都较小的情况) 4.1.2 权重轮询 (解决实例的处理能力差异的问题) 4.1.3 FAIR 、随机、权重随机和最少链接数 (可以看gateway / ribbon) 4.2 半状态 (正确性由后端实例来保证 将请求按一定的策略进行路由,后端实例可以利用路由规则来进行优化) 4.2.1 hash 4.2.1.1 正确性: 当实例数发生变化的时候,正确性将会出现问题 4.2.1.2 公平性: 公平 4.2.2 一致性 Hash 4.2.2.1 一句话: 一个圆,但是可能把压力给到某一个节点,怎么办? 添加虚拟节点 4.3 全状态(正确性由路由服务 来保证 ) 应用场景: 1. 无状态 我们正常服务都是 2. 半状态 分库分表的时候 hash id 和 时间戳进行分,属于半状态 3. 全状态 想到了 Kafka的Controller模型 数据分片 / 正常分布式系统 leader/follower 的选举其实也算 全状态 思考题: 就是 分库分表之后 怎么扩容 hash的 属于半状态 1. 升级从库 (这种的最少迁移量) 2. 双写迁移

    作者回复: 赞~ 1、滚动升级从库,是从提高硬件能力的角度来扩容 2、双写迁移,不能减少迁移的量,只是让迁移平滑一点,一般是 2 倍扩容,比如之前分了 4 张表,那么扩容为分 8 张表,就只需要迁移一半的数据。

    2022-02-08
    2
    14
  • wd
    思考题:“我们利用 Hash 策略路由的 MySQL 集群,如果需要对集群进行扩容,我们怎么做才能在最少迁移数据的情况下,依然保证路由的正确性呢?” 是不是可以考虑采取每次倍增扩容的方式来减少必要的数据迁移?比如从两个实例扩容到四个实例,只需要迁移一半的数据到新节点上。

    作者回复: 是的,非常正确

    2022-02-07
    9
  • peter
    请教老师三个问题: Q1:SpringCloud的负载均衡组件,一个是Ribbon,一个是LoadBalencer,他们是有状态的还是无状态的? Q2:半状态负载均衡有哪些例子? Q3:全状态负载均衡等同于数据分片吗? 本文中有这样一句话:“其实全状态的负载均衡和数据分片是同一件事情”,那么,全状态负载均衡就等同于数据分片吗?如果不等同,还有其他什么情况?

    作者回复: Q1:SpringCloud Ribbon 是一个负责均衡组件,可以通过配置选择负载均衡算法:com.netflix.loadbalancer.****,比如com.netflix.loadbalancer.RandomRule 是随机算法,com.netflix.loadbalancer. RoundRobinRule 是轮询算法,这些算法可以是讨论是否有无状态的 Q2:mysql的 分区分表一般都是采用 hash 算法的半状态负载均衡 Q3:是的,数据分片的问题从负载均衡的角度来看,就是全状态负载均衡

    2022-02-07
    2
  • study的程序员
    感觉全状态和半状态有点难以区分,能否这样理解:半状态下,负载均衡只保证某一key路由到一个节点;全状态下,负载均衡要保证某一个key路由到固定的一个节点。

    作者回复: 是的,这是一个区别之一,全状态的粒度更细。

    2022-03-22
    1
  • Ronnie
    一致性哈希,不过一致性哈希也存在不公平性,这个可以通过虚拟节点来实现

    作者回复: 是的,还有一种处理公平性的策略,不过使用的比较少,它不引入虚拟节点,而是去调整节点在hash环上的位置(节点在hash环上的位置不是通过hash计算来确定,而是维护好节点的位置信息),只不过这种策略使用比较少一点

    2022-02-24
    1
  • Jxin
    还有自适应负载均衡。虽然这玩意在应对高并发时并不是很靠谱。

    作者回复: 是的,容易导致雪崩

    2022-02-23
    1
  • Noah
    陈老师,您好,关于“请求的状态”中的“状态”的定义,我感到有点困惑,文中以查询用户的年龄作为有状态的请求的示例,请问这里的状态指的是什么?用户的年龄数据么?您能否给出一个“不带状态“的请求示例呢?

    作者回复: 这个状态是由后端提供服务的实例是否对等来决定的。 文中查询用户的年龄的例子,是假设在用户信息是按一定的策略存储在后端的服务上,每一个后端服务只存储一部分。 如果用户的年龄信息是存储在一个外部的数据库中,所有的后端服务实例都可以访问到,那么这些后端服务的对等的,这个时候,请求就是无状态的。

    2022-02-16
    2
    1
  • Jay
    思考题的答案,作者是否可以给下呢?不是后端开发,但对分布式技术很感兴趣,感觉思考题里面可能需要后端方面的背景知识才能回答呢……

    作者回复: 好的,这几天就会提供

    2022-05-14
  • 花花大脸猫
    思考题应该是以2的幂次方倍数进行扩容,其实跟最新的hashmap扩容原理一样,可以有效降低元素的迁移数量
    2022-05-31
    2
收起评论
显示
设置
留言
15
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部