系统设计(架构师)指南5设计一致哈希(HASHING)

这篇具有很好参考价值的文章主要介绍了系统设计(架构师)指南5设计一致哈希(HASHING)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

5 设计一致哈希(HASHING)

要实现横向扩展,就必须在服务器之间高效、均匀地分配请求/数据。一致哈希是实现这一目标的常用技术。不过,首先让我们深入了解一下这个问题。

5.1 重散列(rehashing)问题

如果有n台缓存服务器,平衡负载的常用方法是使用下面的散列方法:

serverIndex = hash(key)%N,其中N是服务器池的大小。

系统设计(架构师)指南5设计一致哈希(HASHING)

系统设计(架构师)指南5设计一致哈希(HASHING)

当服务器池的大小固定且数据分布均匀时,这种方法效果很好。但是,当添加新服务器或移除现有服务器时,问题就会出现。例如,如果服务器1离线,服务器池的大小就会变成3。这意味着当服务器1离线时,大多数缓存客户端会连接到错误的服务器来获取数据。这将导致缓存丢失风暴。一致性散列是缓解这一问题的有效技术。

5.2 一致散列(Consistent hashing)

引自维基百科:"一致散列是一种特殊的散列方式,当重新调整哈希表大小并使用一致散列时,平均只需重新映射 k/n 个键,其中k是键的个数,n是槽的个数。相比之下,在大多数传统哈希表中,数组槽数的变化会导致几乎所有的键都要重新映射"。

5.3 散列空间和散列环

既然我们已经理解了一致散列的定义,那就让我们来看看它是如何工作的。假设使用SHA-1作为散列函数f,散列函数的输出范围为:x0, x1, x2, x3, ..., xn。在密码学中,SHA-1 的散列空间从 0 到 2^160 - 1。也就是说,x0 对应 0,xn 对应 2^160 - 1,中间的所有其他散列值都在 0 和 2^160 - 1 之间。

5.4 散列服务器

使用相同的哈希函数f,我们根据服务器IP或名称将服务器映射到哈希环上。
系统设计(架构师)指南5设计一致哈希(HASHING)

5.5 散列键

值得一提的是,这里使用的哈希函数与 "重洗问题 "中的哈希函数不同,没有模块化操作。
系统设计(架构师)指南5设计一致哈希(HASHING)

5.6 服务器查询

要确定密钥存储在哪个服务器上,我们要从密钥在哈希环上的位置开始顺时针查找,直到找到服务器为止。下图解释了这一过程。按顺时针方向,0存放在服务器0上;1存放在服务器1上;2存放在服务器2上;3存放在服务器3上。

系统设计(架构师)指南5设计一致哈希(HASHING)

5.7 添加服务器

使用上述逻辑,添加新服务器只需重新分配一部分密钥。

添加新服务器 4后,只需重新分配0,而 k1、k2 和 k3 仍保存在相同的服务器上。让我们仔细看看其中的逻辑。在服务器4添加之前,0保存在服务器0上。现在,密钥0将被保存在服务器4上,因为服务器4是它从密钥0在环上的位置顺时针旋转遇到的第一个服务器。其他Key不会根据一致的哈希算法重新分配。

系统设计(架构师)指南5设计一致哈希(HASHING)

5.8 移除服务器

移除服务器时,只有一小部分Key需要使用一致散列算法重新分配。下图中,当服务器1被移除时,只有key1必须重新映射到服务器2。其余的密钥不受影响。

系统设计(架构师)指南5设计一致哈希(HASHING)

5.9 基本方法中的两个问题

一致散列算法是由麻省理工学院的Karger等人提出的。基本步骤如下

  • 使用均匀分布的散列函数将服务器和密钥映射到环上。

  • 要找出密钥映射到哪个服务器上,就从密钥位置开始顺时针查找,直到找到环上的第一个服务器为止。

这种方法存在两个问题。首先,考虑到服务器可以添加或删除,环上所有服务器的分区大小不可能保持一致。分区是相邻服务器之间的散列空间。分配给每个服务器的环上分区的大小有可能非常小,也有可能相当大。下图如果删除 s1,s2 的分区(双向箭头突出显示)将是 s0 和 s3 分区的两倍。

系统设计(架构师)指南5设计一致哈希(HASHING)

其次,环上有可能出现密钥分布不均匀的情况。例如,如果将服务器映射到下图所列的位置,则大部分密钥都存储在服务器 2 上。然而,服务器 1 和服务器 3 却没有数据。

系统设计(架构师)指南5设计一致哈希(HASHING)

一种称为虚拟节点或副本的技术可用于解决这些问题。

参考资料

  • 软件测试精品书籍文档下载持续更新 https://github.com/china-testing/python-testing-examples 请点赞,谢谢!
  • 本文涉及的python测试开发库 谢谢点赞! https://github.com/china-testing/python_cn_resouce
  • python精品书籍下载 https://github.com/china-testing/python_cn_resouce/blob/main/python_good_books.md
  • Linux精品书籍下载 https://www.cnblogs.com/testing-/p/17438558.html
  • 一致散列:https://en.wikipedia.org/wiki/Consistent_hashing
  • 一致散列:
    https://tom-e-white.com/2007/11/consistent-hashing.html
  • Dynamo: 亚马逊的高可用键值存储:
    https://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf
  • Cassandra - 一种分散的结构化存储系统:
    http://www.cs.cornell.edu/Projects/ladis2009/papers/Lakshman-ladis2009.PDF
  • Discord 如何将 Elixir 扩展到 5,000,000 并发用户:
    https://blog.discord.com/scaling-elixir-f9b8e1e7c29b
  • CS168: 现代算法工具箱讲座 #1:导论和一致性
    哈希算法:http://theory.stanford.edu/~tim/s16/l/l1.pdf
  • Maglev: A Fast and Reliable Software Network Load Balancer:
    https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/44824.pdf

5.10 虚拟节点

虚拟节点指的是真实节点,每个服务器都由环上的多个虚拟节点表示。下图中,服务器 0 和服务器 1 都有 3 个虚拟节点。3 是任意选择的;而在实际系统中,虚拟节点的数量要大得多。我们不用 s0,而是用 s0_0、s0_1 和 s0_2 来表示环上的服务器 0。同样,s1_0、s1_1 和 s1_2 代表环上的服务器 1。通过虚拟节点,每个服务器负责多个分区。标签为 s0 的分区(边)由服务器 0 管理,而标签为 s1 的分区则由服务器 1 管理。

系统设计(架构师)指南5设计一致哈希(HASHING)

要查找密钥存储在哪台服务器上,我们可以从密钥所在位置出发,顺时针方向查找环上遇到的第一个虚拟节点。下图,要找出 k0 存放在哪个服务器上,我们从 k0 所在位置开始顺时针方向查找虚拟节点 s1_1,它指的是服务器 1。

系统设计(架构师)指南5设计一致哈希(HASHING)

随着虚拟节点数量的增加,密钥的分布也变得更加均衡。这是因为虚拟节点越多,标准偏差就越小,从而导致数据分布均衡。标准偏差衡量数据的分布情况。在线研究[2]的实验结果表明,在有一两百个虚拟节点的情况下,标准偏差介于平均值的 5%(200 个虚拟节点)和 10%(100 个虚拟节点)之间。当我们增加虚拟节点的数量时,标准偏差会更小。但是,需要更多空间来存储虚拟节点的数据。这是一个权衡问题,我们可以根据系统要求调整虚拟节点的数量。

5.11 找受影响的键

添加或删除服务器时,需要重新分配一部分数据。我们如何找到受影响的范围来重新分配密钥呢?

下图中,服务器 4 被添加到环上。受影响的范围从 s4(新添加的节点)开始,围绕环逆时针移动,直到找到一个服务器(s3)。因此,位于 s3 和 s4 之间的密钥需要重新分配到 s4。

系统设计(架构师)指南5设计一致哈希(HASHING)

下图当服务器(s1)被移除时,受影响的范围从 s1(被移除的节点)开始,围绕环路逆时针移动,直到找到服务器(s0)为止。因此,位于 s0 和 s1 之间的密钥必须重新分配到 s2。

系统设计(架构师)指南5设计一致哈希(HASHING)

5.12 总结

在本章中,我们深入讨论了一致散列,包括为什么需要一致散列以及一致散列的工作原理。一致散列的好处包括

  • 当服务器添加或删除时,最小化的密钥会重新分配。
  • 由于数据分布更均匀,因此易于横向扩展。
  • 缓解热点密钥问题。对特定分片的过度访问可能会导致服务器过载。想象一下,凯蒂-佩里、贾斯汀-比伯和 Lady Gaga 的数据最终都在同一个分片上。一致散列法通过更均匀地分配数据,有助于缓解这一问题。

一致散列在现实世界的系统中得到了广泛应用,其中包括一些著名的系统:文章来源地址https://www.toymoban.com/news/detail-698346.html

  • 亚马逊Dynamo数据库的分区组件。
  • Apache Cassandra 中跨集群的数据分区。
  • Discord 聊天应用程序
  • Akamai 内容交付网络
  • Maglev 网络负载平衡器

到了这里,关于系统设计(架构师)指南5设计一致哈希(HASHING)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 系统设计(架构师)指南3系统设计面试

    你刚刚获得了梦想公司梦寐以求的现场面试机会。HR给你发来了当天的日程安排。扫了一眼名单,你感觉良好,直到你的目光落到了这个面试环节--系统设计面试。 系统设计面试通常让人望而生畏。可能是\\\"设计一款知名产品 X\\\"这样含糊不清的问题。问题模棱两可,似乎宽泛得

    2024年02月09日
    浏览(28)
  • 分布式系统架构设计之分布式数据存储的扩展方式、主从复制以及分布式一致性

    在分布式系统中,数据存储的扩展是为了适应业务的增长和提高系统的性能。分为水平扩展和垂直扩展两种方式,这两种方式在架构设计和应用场景上有着不同的优势和局限性。 水平扩展是通过增加节点或服务器的数量来扩大整个系统的容量和性能。在数据存储领域,水平扩

    2024年02月03日
    浏览(50)
  • 系统设计(架构师)指南4设计限速器

    在网络系统中,限速器用于控制客户端或服务发送流量的速率。在HTTP世界中,限速器限制在指定时间内允许发送的客户端请求数量。如果API请求数超过了限速器定义的阈值,超出调用都会被阻止。下面是几个例子: 用户每秒最多只能写2篇文章。 同一IP地址每天最多只能创建

    2024年02月09日
    浏览(40)
  • 系统设计(架构师)指南2封底估算&新浪微博实例

    在系统设计面试中,有时会要求你使用 \\\"封底估算\\\"(back-of-the-envelope estimation)来估算系统容量或性能需求。根据谷歌高级研究员杰夫-迪恩(Jeff Dean)的说法,\\\"封底估算是你结合思想实验和常见性能数字进行的估算,目的是让你对哪些设计能满足你的要求有一个良好的感觉

    2024年02月10日
    浏览(26)
  • 系统设计(架构师)指南A:PlatformIO云IDE实例

    PlatformIO是一个开源的物联网(IoT)开发平台,旨在提供跨平台的软件开发工具和框架,使开发者能够更轻松地构建和部署嵌入式系统和物联网设备。 PlatformIO提供了统一的开发环境,支持多种不同的开发板和微控制器平台,包括Arduino、Raspberry Pi、ESP8266、ESP32等等。开发者可以

    2024年02月05日
    浏览(50)
  • 系统设计(架构师)指南1从零扩展到百万用户

    设计支持数百万用户的系统是一项挑战,是需要不断完善和无止境改进的过程。在本章中,我们将构建一个支持单个用户的系统,并逐步将其扩展到为数百万用户提供服务。 下图展示了单服务器设置的示意图,其中所有内容都运行在一台服务器上:网络应用程序、数据库、缓

    2024年02月10日
    浏览(31)
  • 【漏洞复现】CVE-2004-2761:使用弱哈希算法签名的 SSL 证书(SSL Certificate Signed Using Weak Hashing Algorithm)

    概要:本次复现是针对编号为CVE-2004-2761的漏洞,由于条件有限,本次复现通过创建自签名证书进行操作。 问题描述:证书链中的 SSL 证书使用弱哈希算法进行签名。 本次复现环境在Linux平台下使用Nginx进行环境的搭建,通过 Openssl 组件生成自签名证书,并在 Nginx 配置文件中进

    2024年02月10日
    浏览(28)
  • 【分布式】一致性哈希和哈希槽

    当我们拥有了多台存储服务器之后,现在有多个key,希望可以将这些个key均匀的缓存到这些服务器上,可以使用哪些方案呢? 1.1 直接哈希取模 这是一种最容易想到的方法,使用取模算法hash(key)% N,对key进行hash运算后取模,N是机器的数量。key进行hash后的结果对3取模,得

    2024年02月03日
    浏览(35)
  • 一致性哈希(哈希环)解决数据分布问题

    哈希算法是程序开发过程中最广泛接触到的的算法之一,典型的应用有安全加密、数据校验、唯一标识、散列函数、负载均衡、数据分片、分布式存储。前些天遇到用一致性哈希(哈希环)的场景,不过我细想一下,对这个知识点好像了解过,但是又没太深印象,说不出具体

    2024年02月04日
    浏览(40)
  • 区块链:哈希算法与一致性哈希算法

    本篇主要介绍区块链中常用到的哈希算法。 1 哈希算法 1.1 定义及特性   哈希算法是指通过哈希函数(Hash Function)对任意长度的输入数据(比如文件、消息、数字等)进行转换,生成一个固定长度的哈希值(Hash Value)的过程。   在区块链中,哈希算法常用于区块验证及安全性保

    2024年02月17日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包