博客
关于我
腾讯面试官问我“一致性哈希”,我丢给他 18 张图
阅读量:704 次
发布时间:2019-03-16

本文共 1280 字,大约阅读时间需要 4 分钟。

一致性哈希:解决分布式系统的消息乱序问题

当架构师大刘看到实习生小李提交的记账流水乱序问题时,他知道这次必须用一致性哈希来解决这个问题了。一致性哈希是分布式架构师的必备良药,让我们一起来探索它。

从哈希开始

在N年前,互联网的分布式架构方兴未艾。大刘所在的公司由于业务需要,引入了一套由IBM团队设计的业务架构。这套架构采用了分布式的思想,通过RabbitMQ的消息中间件来通信。在当时的年代,这被视为思想超前的黑科技。

然而,随着时间的推移,这套架构暴露了两个主要问题:

  • RabbitMQ是一个单点,一旦它坏了,整个系统就会瘫痪。
  • 收发消息的业务系统也是单点,任何一点出现问题都会导致消息堆积或无法消费。
  • 为了解决RabbitMQ的单点问题,他们使用了Keepalived配合两台无关系的RabbitMQ实现了高可用。但对业务系统的单点问题,最初的解决方案并不理想。通过简单地部署多个应用集群化,问题反而变得更复杂。

    新问题出现

    随着公司的发展,IM工具的用户数量急剧增加,新的问题出现了:

  • 收消息的集群机器不够用,导致消息处理速度变慢。
  • 论有时IM系统整体不可用,尤其是当客户也在使用时,这对公司的产品形象造成了严重影响。
  • 思路转变

    为了解决这些问题,开发人员们想到了一种动态检测配置的方案。通过定时检测配置文件的变化,当发现变动时,自动刷新规则。这样一来,集群机器的增加只需要以下三个步骤:

  • 增加一个队列。
  • 修改分配消息的规则。
  • 部署新的机器。
  • 然而,这种方案仍然存在一些问题:

  • 随着系统的扩展,手工修改规则的系统也越来越多。
  • 消费机器宕机后,需要删除队列并恢复原有的分配规则,这增加了运维的复杂性。
  • 一致性哈希的思想

    为了进一步优化,他们开始思考如何让分配规则更加自动化。最终,引入了一致性哈希的思想。具体实现如下:

  • MQ中有100个队列,处于一个环状结构。
  • 发送消息的应用计算m = hash(id) mod 100。
  • 如果对应的队列不存在,顺时针查找环中的下一个真实队列。
  • 这种方法解决了动态增加或减少队列的问题,但当真实队列数量远小于假设的队列数量时,会出现严重的失衡问题。

    失衡的圆环

    假设只有5个真实队列,而分配规则是m = hash(id) mod 100。m大于5的概率高达95%,这些信息最终会映射到环中的第一个队列,导致雪崩效应。

    虚拟节点的解决方案

    为了缓解这一问题,他们采用了虚拟节点的方法:

  • 真实的队列分布在环上。
  • 使用哈希算法将虚拟节点映射到真实节点。
  • 虚拟节点的数量远大于真实节点数量。
  • 这样一来,真实存在的队列可以均匀分布在环上,极大地减少了失衡的可能性。

    一致性哈希的核心思想

    一致性哈希是一种经典的分布式算法思想,广泛应用于分片和任务分发问题。但需要注意的是,Redis并没有使用哈希算法来计算分布,只是借用了其思想。理解一致性哈希的核心思想,才能更灵活地应用到实际项目中。

    通过这篇文章,我们从哈希开始,一路走到虚拟节点的分布,最终理解了一致性哈希的思想。希望这篇文章能帮助您更好地理解分布式系统的挑战以及解决方案。

    转载地址:http://ddhqz.baihongyu.com/

    你可能感兴趣的文章
    Python在def函数中使用for循环
    查看>>
    Python在Conda环境中,但在Windows虚拟环境中没有激活
    查看>>
    python系列【仅供参考】:python pip 错误 ModuleNotFoundError: No module named pip._internal 解决办法
    查看>>
    python图像条状状噪声,使用PYTHON PIL从验证码图像中删除背景嘈杂的线条
    查看>>
    Python图像处理:从内存加载jpeg
    查看>>
    python固定后缀(名物化词汇)词频统计:抽取+统计+可视化
    查看>>
    python商品评论数据采集与分析可视化系统 Flask框架 requests爬虫 NLP情感分析 毕业设计 源码
    查看>>
    python商品数据分析可视化系统(带爬虫)京东销售数据分析 计算机毕业设计 源码下载
    查看>>
    python商品库存管理系统 django框架 商品网站 MySQL数据库 源码下载 计算机毕业设计
    查看>>
    Python哪个版本最稳定好用2023.10.19
    查看>>
    Python和黑客技术的渊源
    查看>>
    Python和RF编写接口自动化
    查看>>
    Python和RF编写web自动化
    查看>>
    python和js哪个难_【Python】记一次学习,Python 与 js 在实现闭包时的差异
    查看>>
    python和java哪个更值得学——来自知乎高赞回答
    查看>>
    python和c混合编程 github_在pycharm中使用git版本管理以及同步github的方法
    查看>>
    python命名空间更改_Python模块xml.etree.ElementTree自动修改xml命名空间键
    查看>>
    Python命名中尾随下划线有什么好处?
    查看>>
    Python启动脚本
    查看>>
    Python听写汇总结果
    查看>>