面试场景题系列:设计一致性哈希系统

为了实现横向扩展,在服务器之间高效和均匀地分配请求/数据是很重要的。一致性哈希是为了达成这个目标而被广泛使用的技术。首先,我们看一下什么是重新哈希问题。

1 重新哈希的问题

如果你有n个缓存服务器,常见的平衡负载的方法是使用如下哈希方法:

服务器序号=hash(key)%N(N代表服务器池的大小)

我们用一个示例来说明它是如何工作的。如表-1所示,我们有4个服务器,有8个字符串型的键(key)及其对应的哈希值(hash)。

表-1

为了获取存储了某个键的服务器的序号,我们需要做求余运算f(key)%4。比如,hash(key0)%4=1,表示客户端必须联系server1以获取缓存的数据。图-1基于表-1展示了键的分布。

图-1

这个方法在服务器池的大小固定不变的时候效果很好,并且数据的分布是均匀的。但是,当添加服务器或现有服务器被移除时问题就产生了。举个例子,如果server1下线,服务器池的大小就变成3。使用同样的哈希函数,对于同一个键,我们得到的哈希值不变。但是因为服务器数量减1,通过求余操作计算出的服务器序号就与之前的不同了。这可能会导致数据分布不均匀或错误地分配给错误的服务器。“哈希值%3”得到的结果如表-2所示。

表-2

图-2展示了表-2中键的分布。

图-2

如图-2所示,大部分的键都被重新分配了,不仅仅是原来存储在宕机服务器(server1)中的那些键。这意味着当server1宕机时,大部分缓存客户端都会连接错误的服务器来获取数据。这会导致大量的缓存未命中(Cache Miss)。一致性哈希是缓解这个问题的有效技术。

2 一致性哈希

根据维基百科中的定义,“一致性哈希是一种特殊的哈希。如果一个哈希表被调整了大小,那么使用一致性哈希,则平均只需要重新映射k/n个键,这里k是键的数量,n是槽(Slot)的数量。对比来看,在大多数传统的哈希表中,只要槽的数量有变化,几乎所有的键都需要重新映射一遍”。

2.1 哈希空间和哈希环

现在我们了解了一致性哈希的定义,接下来看看它是如何工作的。假设我们使用SHA-1作为哈希函数f,哈希函数的输出值范围是:x0,x1,x2,x3,…,xn。在密码学里,SHA-1的哈希空间是0到2160-1。这意味着x0对应0,xn对应2160-1。图-3展示了哈希空间。

连接x0和xn两端,我们可以得到一个如图-4所示的哈希环。

图-3

图-4

2.2 哈希服务器

使用同样的哈希函数f,我们根据服务器的IP地址或者名字将其映射到哈希环上。图-5展示了4个服务器被映射到哈希环上的情况。

图-5

2.3 哈希键

值得一提的是,这里使用的哈希函数跟第1节中的不一样,这里没有求余运算。如图-6所示,4个键(key0、key1、key2和key3)被映射到哈希环上。

图-6

2.4 查找服务器

为了确定某个键存储在哪个服务器上,我们从这个键在环上的位置开始顺时针查找,直到找到一个服务器为止。图-7解释了这个过程,通过顺时针查找可知:key0存储在server0上;key1存储在server1上;key2存储在server2上;key3存储在server3上。

图-7

2.5 添加服务器

按照上面描述的逻辑,如果要在哈希环中添加一个新的服务器,只有少部分键需要被重新映射到新的服务器上,大部分键的位置保持不变。

如图-8所示,添加新的服务器后(server4),只有key0需要重新分配位置。key1、key2和key3都保留在原来的服务器上。我们仔细看一下这个逻辑。在添加server4之前,key0存储在server0上。现在,因为server4是从key0在哈希环上的位置开始顺时针查找时遇到的第一个服务器,所以key0会被存储到server4上。根据一致性哈希算法,其他的键不需要重新分配位置。

图-8

2.6 移除服务器

当一个服务器被移除时,如果使用一致性哈希,就只有一小部分键需要重新分配位置。如图-9所示,当移除server1时,只有key1需要重新映射到server2上,其他键则不受影响。

图-9

2.7 两个问题

一致性哈希算法是麻省理工学院的David Karger等人首先提出的。它的基本步骤如下:

•使用均匀分布的哈希函数将服务器和键映射到哈希环上。

•要找出某个键被映射到了哪个服务器上,就从这个键的位置开始顺时针查找,直到找到哈希环上的第一个服务器。

这里有两个问题。第一,考虑到可以添加或移除服务器,所以很难保证哈希环上所有服务器的分区大小相同。分区是相邻服务器之间的哈希空间。在哈希环上分配给每个服务器的分区可能很小,也可能很大。如图-10所示,如果server1被移除,server2的分区(用双向箭头标记)就是server0和server3的两倍大。

图-10

第二,有可能键在哈希环上是非均匀分布的。举个例子,如果服务器映射的位置如图-11所示,则大部分键都会被存储在server2上,而server1和server3上没有数据。

图-11

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

2.8 虚拟节点

虚拟节点是实际节点在哈希环上的逻辑划分或映射。每个服务器都可以用多个虚拟节点来表示。如图-12所示,服务器server0和server1都有3个虚拟节点。“3”这个数字是任意选的,在真实世界中,虚拟节点的数量要大得多。这里,我们不用s0而是改用s0_0、s0_1和s0_2来表示哈希环上的server0;用s1_0、s1_1和s1_2来表示哈希环上的server1。通过虚拟节点,每个服务器都对应多个分区。标记为s0的分区(边缘)是由server0来管理的。标记为s1的分区是由server1来管理的。

图-12

为了找到某个键存储在哪个服务器上,我们从这个键所在的位置开始,顺时针找到第一个虚拟节点。如图-13所示,为了确定key0键存储在哪个服务器上,我们从key0所在的位置出发,顺时针查找并找到虚拟节点s1_1,它对应的是server1。

当虚拟节点的数量增加时,键的分布就会变得更均匀。这是因为有更多虚拟节点以后,标准差会变小,从而导致数据分布更均匀。标准差衡量的是数据的分散程度。一个线上研究[插图]所做的实验显示:使用100个或200个虚拟节点时,标准差的均值约为10%(100个虚拟节点)和5%(200个虚拟节点)。当我们增加虚拟节点的数量时,标准差会更小。但是,这也意味着需要更多的空间来存储虚拟节点的数据。这需要权衡,我们可以调整虚拟节点的数量来满足系统的需求。

图-13

2.9 找到受影响的键

当添加或移除服务器时,有一部分键需要重新分配位置。如何找到受影响的键的范围并重新为它们分配位置呢?

如图-14所示,服务器server4被添加到哈希环上。从server4(新添加的节点)开始,沿着哈希环逆时针移动,直到遇到另一个服务器(图中为server3)为止,这就是受影响的键的范围。从图5-14可以看出,位于server3和server4之间的键需要重新分配给server4。

如图-15所示,服务器server1被移除。从server1(被移除的节点)开始,沿着哈希环逆时针移动,直到遇到另一个服务器(图中为server0)为止,这就是受影响的键的范围。从图-15可以看出,位于server0和server1之间的键需要重新分配给server2。

图-14

图-15

总结

在本章中,我们对一致性哈希进行了深入的讨论,包括为什么需要进行一致性哈希和它是怎么工作的。一致性哈希有如下好处:

•添加或者移除服务器的时候,需要重新分配的键最少。

•更容易横向扩展,因为数据分布得更均匀。

•减轻了热点键问题。过多访问一个特定分区可能会导致服务器过载。想象一下,如果Katy Perry、Justin Bieber和Lady Gaga的数据都被存储在同一个分区上会是什么情形。一致性哈希通过使数据更均匀地分布来减轻这个问题。

一致性哈希被广泛地应用于现实世界的系统中,包括一些非常出名的系统,例如:

•亚马逊Dynamo数据库的分区组件。

•Apache Cassandra集群的数据分区。

•Discord聊天应用。

•Akamai内容分发网络。

•Maglev网络负载均衡器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/495376.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

778-批量删除指定文件夹下指定格式文件(包含子孙文件夹下的)

778-批量删除指定文件夹下指定格式文件(包含子孙文件夹下的) 批量删除指定文件夹下所有指定格式文件,包括子孙文件夹下 文件扩展名输入时一行一个,可以同时删除多个格式文件, 输入格式是可以带.也可以不带&#xff…

MarkItDown的使用(将Word、Excel、PDF等转换为Markdown格式)

MarkItDown的使用(将Word、Excel、PDF等转换为Markdown格式) 本文目录: 零、时光宝盒🌻 一、简介 二、安装 三、使用方法 3.1、使用命令行形式 3.2、用 Python 调用 四、总结 五、参考资料 零、时光宝盒🌻 &a…

数字工厂管理系统就是ERP系统吗

在制造业数字化转型的进程中,数字工厂管理系统与ERP系统常常被提及,不少人疑惑这两者是否为同一概念。事实上,它们虽有联系,却存在诸多显著差异。 ERP系统,即企业资源计划系统,其核心在于对企业全方位资源的…

【Linux】Linux开发利器:make与Makefile自动化构建详解

Linux相关知识点可以通过点击以下链接进行学习一起加油!初识指令指令进阶权限管理yum包管理与vim编辑器GCC/G编译器 在现代软件开发中,自动化构建工具显得尤为重要,make和Makefile是Linux环境下的常用选择。它们通过定义规则和依赖关系&#…

【MinIO系列】MinIO Client (mc) 完全指南

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

在跨平台开发环境中构建高效的C++项目:从基础到最佳实践20241225

在跨平台开发环境中构建高效的C项目:从基础到最佳实践 引言 在现代软件开发中,跨平台兼容性和高效开发流程是每个工程师追求的目标。尤其是对于 C 开发者,管理代码的跨平台构建以及调试流程可能成为一项棘手的挑战。在本文中,我…

2. SQL窗口函数使用

背景 窗口函数也叫分析函数,主要用于处理相对复杂的报表统计分析场景,这个功能在大多商业数据库和部分开源数据库中已经支持,mysql从8.0开始支持窗口函数。经典使用场景是数据错位相减的场景,比如求查询每年支付时间间隔最长的用…

Qt creator ,语言家功能缺失解决方法

1、找到工具->外部->配置 2、添加目录,双击命名语言家 3、在语言家目录下,添加工具 双击重命名lupdate,即更新翻译 %{CurrentDocument:Project:QT_INSTALL_BINS}\lupdate%{CurrentDocument:Project:FilePath}%{CurrentDocument:Projec…

软件测试之全链路压测详解

随着业务的快速发展我们日常遇到的系统性能压力问题也逐渐出现,甚至在部分场合会遇到一些突发的营销活动,会导致系统性能突然暴涨,可能导致我们系统的瘫痪。最近几年随着电商的各种促销活动,有一个词也渐渐进入我们眼帘&#xff0…

基于推理的目标检测 DetGPT

基于推理的目标检测 DetGPT flyfish detgpt.github.io 近年来,由于大型语言模型(LLMs)的发展,计算机视觉领域取得了重大进展。这些模型使人类与机器之间能够进行更有效、更复杂的交互,为模糊人类与机器智能界限的新技…

优化 invite_codes 表的 SQL 创建语句

-- auto-generated definition create table invite_codes (id int auto_incrementprimary key,invite_code varchar(6) not null comment 邀请码,6位整数,确保在有效期内…

如何在 Ubuntu 22.04 上安装以及使用 MongoDB

简介 MongoDB 因其灵活性、可扩展性、性能和生态系统而受到开发人员的青睐,这些都是构建和驱动现代应用程序的关键能力。通过几个配置步骤,你就可以在你的 Ubuntu 22.04 LTS 机器上安装 MongoDB,这是 Ubuntu Linux 发行版的最新长期支持版本…

小程序app封装公用顶部筛选区uv-drop-down

参考ui:DropDown 下拉筛选 | 我的资料管理-uv-ui 是全面兼容vue32、nvue、app、h5、小程序等多端的uni-app生态框架 样式示例&#xff1a; 封装公用文件代码 dropDownTemplete <template><!-- 顶部下拉筛选区封装公用组件 --><view><uv-drop-down ref&…

vulnhub靶场-matrix-breakout-2-morpheus攻略(截止至获取shell)

扫描出ip为192.168.121.161 访问该ip&#xff0c;发现只是一个静态页面什么也没有 使用dir dirsearch 御剑都只能扫描到/robots.txt /server-status 两个页面&#xff0c;前者提示我们什么也没有&#xff0c;后面两个没有权限访问 扫描端口&#xff0c;存在81端口 访问&#x…

探索多模态大语言模型(MLLMs)的推理能力

探索多模态大语言模型&#xff08;MLLMs&#xff09;的推理能力 Multimodal Large Language Models (MLLMs) flyfish 原文&#xff1a;Exploring the Reasoning Abilities of Multimodal Large Language Models (MLLMs): A Comprehensive Survey on Emerging Trends in Mult…

C++之红黑树模拟实现

目录 红黑树的概念 红黑树的性质 红黑树的查找效率 红黑树的实现 红黑树的定义 红黑树节点的插入 红黑树的平衡调整 判断红黑树是否平衡 红黑树整体代码 测试代码 上期我们学习了AVL树的模拟实现&#xff0c;在此基础上&#xff0c;我们本期将学习另一个数据结构-…

SDMTSP:粒子群优化算法PSO求解单仓库多旅行商问题,可以更改数据集和起点(MATLAB代码)

一、单仓库多旅行商问题 单仓库多旅行商问题&#xff08;Single-Depot Multiple Travelling Salesman Problem, SD-MTSP&#xff09;&#xff1a;&#x1d45a;个推销员从同一座中心城市出发&#xff0c;访问其中一定数量的城市并且每座城市只能被某一个推销员访问一次&#x…

【Yonghong 企业日常问题 06】上传的文件不在白名单,修改allow.jar.digest属性添加允许上传的文件SH256值?

文章目录 前言问题描述问题分析问题解决1.允许所有用户上传驱动文件2.如果是想只上传白名单的驱动 前言 该方法适合永洪BI系列产品&#xff0c;包括不限于vividime desktop&#xff0c;vividime z-suit&#xff0c;vividime x-suit产品。 问题描述 当我们连接数据源的时候&a…

决策树(理论知识3)

目录 评选算法信息增益&#xff08; ID3 算法选用的评估标准&#xff09;信息增益率&#xff08; C4.5 算法选用的评估标准&#xff09;基尼系数&#xff08; CART 算法选用的评估标准&#xff09;基尼增益基尼增益率 评选算法 决策树学习的关键在于&#xff1a;如何选择最优划…

Echarts连接数据库,实时绘制图表详解

文章目录 Echarts连接数据库&#xff0c;实时绘制图表详解一、引言二、步骤一&#xff1a;环境准备与数据库连接1、环境搭建2、数据库连接 三、步骤二&#xff1a;数据获取与处理1、查询数据库2、数据处理 四、步骤三&#xff1a;ECharts图表配置与渲染1、配置ECharts选项2、动…