05|负载均衡:从状态的角度重新思考负载均衡
该思维导图由 AI 生成,仅供参考
负载均衡的关键点
- 深入了解
- 翻译
- 解释
- 总结
本文从状态的角度重新思考负载均衡,探讨了负载均衡在架构设计中需要考虑的关键点,并根据负载均衡策略是否关心请求中携带的信息,将负载均衡策略分为无状态的负载均衡、半状态的负载均衡和全状态的负载均衡。文章首先介绍了负载均衡的关键点,包括公平性和正确性,然后针对无状态的负载均衡策略进行了详细讨论,包括轮询和权重轮询两种策略。轮询策略按顺序分配请求给多个实例,适用于请求的工作负载和实例的处理能力差异较小的情况;而权重轮询策略根据实例的权重比例来分配请求,可解决实例的处理能力差异问题,具有更好的公平性。除此之外,无状态的负载均衡策略还包括FAIR、随机、权重随机和最少链接数等策略。通过对这些策略的分析,读者可以更好地理解负载均衡的概念和实际应用。 半状态的负载均衡策略利用请求的状态信息进行路由,但仅进行简单的规则处理,如 Hash 运算加求模来路由请求。一致性 Hash 策略可以解决 Hash 策略在实例数量变化后的正确性问题,同时通过增加虚拟节点来解决公平性问题。全状态的负载均衡策略在后端实例有状态的情况下,依然会保证路由的正确性,通常以路由服务的形式存在。 总结来说,本文深入探讨了负载均衡策略在分布式系统中的应用,涵盖了无状态、半状态和全状态的负载均衡策略,以及各种具体的策略实现和应用场景。读者可以通过本文全面了解负载均衡的关键概念和策略选择,为实际应用提供了有益的指导和思路。
《深入浅出分布式技术原理》,新⼈⾸单¥59
全部留言(15)
- 最新
- 精选
- 啊树置顶服务路由是指etcd eureka这样的注册组件么?还是建立在注册组件之上的服务?
作者回复: 服务路由是指通过服务的唯一标识找到服务的ip和port,所以它就是服务注册发现~
2022-02-072 - 努力努力再努力今天 才有空 整理,出本节的那天就看了 总结: 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-08214 - wd思考题:“我们利用 Hash 策略路由的 MySQL 集群,如果需要对集群进行扩容,我们怎么做才能在最少迁移数据的情况下,依然保证路由的正确性呢?” 是不是可以考虑采取每次倍增扩容的方式来减少必要的数据迁移?比如从两个实例扩容到四个实例,只需要迁移一半的数据到新节点上。
作者回复: 是的,非常正确
2022-02-079 - 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-072 - study的程序员感觉全状态和半状态有点难以区分,能否这样理解:半状态下,负载均衡只保证某一key路由到一个节点;全状态下,负载均衡要保证某一个key路由到固定的一个节点。
作者回复: 是的,这是一个区别之一,全状态的粒度更细。
2022-03-221 - Ronnie一致性哈希,不过一致性哈希也存在不公平性,这个可以通过虚拟节点来实现
作者回复: 是的,还有一种处理公平性的策略,不过使用的比较少,它不引入虚拟节点,而是去调整节点在hash环上的位置(节点在hash环上的位置不是通过hash计算来确定,而是维护好节点的位置信息),只不过这种策略使用比较少一点
2022-02-241 - Jxin还有自适应负载均衡。虽然这玩意在应对高并发时并不是很靠谱。
作者回复: 是的,容易导致雪崩
2022-02-231 - Noah陈老师,您好,关于“请求的状态”中的“状态”的定义,我感到有点困惑,文中以查询用户的年龄作为有状态的请求的示例,请问这里的状态指的是什么?用户的年龄数据么?您能否给出一个“不带状态“的请求示例呢?
作者回复: 这个状态是由后端提供服务的实例是否对等来决定的。 文中查询用户的年龄的例子,是假设在用户信息是按一定的策略存储在后端的服务上,每一个后端服务只存储一部分。 如果用户的年龄信息是存储在一个外部的数据库中,所有的后端服务实例都可以访问到,那么这些后端服务的对等的,这个时候,请求就是无状态的。
2022-02-1621 - Jay思考题的答案,作者是否可以给下呢?不是后端开发,但对分布式技术很感兴趣,感觉思考题里面可能需要后端方面的背景知识才能回答呢……
作者回复: 好的,这几天就会提供
2022-05-14 - 花花大脸猫思考题应该是以2的幂次方倍数进行扩容,其实跟最新的hashmap扩容原理一样,可以有效降低元素的迁移数量2022-05-312