业务开发算法 50 讲
黄清昊
Hashdata 数据库内核工程师,LeetCode 高赞答主,公众号微扰理论作者
23292 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 51 讲
业务开发算法 50 讲
15
15
1.0x
00:00/00:00
登录|注册

25|一致性哈希:如何在集群上合理分配流量?

数据搬迁开销大
需要重哈希
适用于分布式系统
减少重哈希和数据搬迁
稳定分配有状态请求
副本映射到环上
增加桶副本
找到最近的桶(服务器)
节点映射到环上
映射请求到大数字空间
节点数量变化问题
取模运算分配节点
基于客户端ID哈希
性能开销大
引入状态到负载均衡层
记录客户端上次请求的服务器
需要稳定指向同一台机器
随机或轮询策略不适用
长连接网关
分布式KV缓存系统
保持上下文连续性
需要特定节点处理
避免中间层开销
直接调用服务
加权随机(Weighted Random)
加权轮询(Weighted Round-Robin)
随机(Random)
轮询(Round-Robin)
发挥集群最大价值
避免单点过载
均衡分配流量
讨论和问题解答
实践一致性哈希算法
一致性哈希算法优势
简单高效
Golang 示例代码
负载均衡
分配策略
哈希环
解决节点变化问题
方案二:哈希算法
方案一:记录会话状态
负载均衡问题
例子
定义
客户端负载均衡
常规策略
目的
课后作业
总结
实现
一致性哈希
解决方案
有状态的请求
负载均衡问题
负载均衡与一致性哈希

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

你好,我是微扰君。
上一讲我们学习了在分布式系统中,生成全局唯一 ID 的两种方式,既可以通过引入独立组件远程调用申请 ID,也可以通过约定的方式让各个节点独立生成唯一 ID。
那对于有多个节点的服务,其他服务或者客户端在访问这个服务的时候,具体应该访问哪一个节点呢?

负载均衡问题

大部分情况下,我们都希望集群在分配流量时,能够比较均衡或者按照某种预期的权重比例,这样每个机器都可以得到比较充分的使用,也不容易出现单点服务过载的情况,能够发挥集群的最大价值。
如何分配流量的问题,也通常被称为负载均衡问题,根据不同的业务需要,解决的方式也很多。
比如最直接的,我们可以引入一个中间的负载均衡层,集中记录收到的请求序号;然后按照 Round-Robin 的轮询方式,轮流将外界的请求转发给内部的服务集群,或者直接用随机转发的方式也可以。当然你也可以引入权重,让这两种算法对流量的分配不是均匀的,而是按照一定比重分配在不同的机器上。这两种算法也被称为加权轮询和加权随机
其实,不止可以通过引入中间层实现,如果整个系统完全可信、可控,你也可以让客户端自己按照随机或轮询的策略,直接调用需要负载均衡的服务,同样可以达到负载均衡的效果。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

一致性哈希算法是解决分布式系统中负载均衡问题的有效方案。传统的负载均衡算法无法满足有状态请求或服务的需求,而一致性哈希算法通过哈希映射客户端ID到服务器节点,实现了对有状态请求的负载均衡,同时避免了引入额外的状态记录。该算法能够有效解决分布式系统中的负载均衡问题,保证请求能够正确地发送到指定的服务器节点,并且能够应对系统扩容等情况。文章通过实际案例和技术原理深入浅出地介绍了一致性哈希算法的应用和优势,对于理解分布式系统中负载均衡问题的读者具有很高的参考价值。文章还提到了一致性哈希算法的实现,通过Golang内置的数据结构和方法,简洁地解决了负载均衡问题。总之,一致性哈希算法是一种高效且可靠的负载均衡解决方案,对于分布式系统的设计和实现具有重要意义。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《业务开发算法 50 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(3)

  • 最新
  • 精选
  • peter
    请教老师两个问题: Q1:长连接网关的问题 A 长连接网关有开源框架吗? B 长连接是双向还是单向的? 比如客户端连接到长连接网关,网关到客户端一直有数据流量,需要一直处于连接状态, 但是,客户端到网关数据量小,需要一直处于连接状态吗? (不过好像连接不可能是一个方向通而一个方向不通啊,哈) Q2:节点2移除后为什么需要移动4和3? 在“节点数量变化问题”部分,节点2下线后,为什么要移动4和3? Q3:实现部分,例子是练习LRU吗? “能很好地帮助你练习 LRU”,这句话是说此例子可以用来练习LRU。 应该是练习一致性Hash吧。

    作者回复: Q1 网上有一些开源的推送组件 不过个人觉得和业务耦合比较紧密;开源的不多。 我们的长连是双工的。 Q2: 因为采用传统hash取模的方式,如果模数如果变化了,相应的节点数据肯定要搬迁的。 Q3: 我的项目里也实现了LRU。

    2022-02-17
    2
  • 尔冬橙
    没有讲扩容或者缩容时,本来请求路由的问题
    2022-10-19归属地:湖南
  • 尔冬橙
    讲的真好
    2022-10-19归属地:湖南
收起评论
显示
设置
留言
3
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部