一致性哈希算法小结

news2024/11/17 11:54:19

在实际生产应用中,经常会设置多台服务器共同组成一个集成对外提供服务,为了确保合理的分配来自客户端的请求,我们会采取负载均衡的策略。例如采用「轮询」的方式让每个节点都能公平的接收到请求;采用「加权轮询」的方式让硬件配置高的节点承担更多的请求。
但是,在分布式系统的环境下,数据有可能是经过「水平切分」后放在不同的节点上的,每个节点存储的数据都是不同的,所以需要采取一种新的策略来保证请求能唯一准确地打到对应的节点上。

哈希算法

最容易想到的方式就是采取「哈希算法」,因为对同一个关键字进行哈希计算,每次计算得到的都是相同的值,这样就可以将某个 key 确定到一个节点上了,可以满足分布式系统的负载均衡需求。
哈希算法最简单的做法就是进行取模运算,假设分布式系统中有 3 个节点,基于hash(key) % 3公式对数据进行了映射,如果客户端要获取指定 key 的数据,同样通过上述公式就可以定位到该节点,如果经过公式计算后得到的值是 0,就说明该 key 需要去第一个节点获取。
然而,当服务器节点增加或减少时,原有的映射将失效,大部分数据都需要重新映射到新的服务器节点上,这会导致大规模的数据迁移,影响系统性能和可用性。

一致性哈希算法

「一致性哈希算法(Consistent Hashing)」是一种用于分布式系统中数据分片和负载均衡的哈希算法。它解决了传统哈希算法带来的服务器节点增减时数据重新分布的问题,同时在保持负载均衡的情况下,尽量少地迁移数据。
一致性哈希算法也采用了取模运算,但与哈希算法不同的是,哈希算法是针对节点的数量进行取模运算,而一致性哈希算法是对2^32进行取模运算,是一个固定的值。
我们可以把一致性哈希算法对2^32进行取模运算的结果值组织成一个圆环,就像钟表一样,通过将哈希空间设计为一个环形结构,这个圆环也被称为哈希环。

在这里插入图片描述

为什么要选择对2^32进行取模运算呢?

  • 哈希环的均匀性:2^32是一个很大的数值,取模运算可以将哈希值分散在整个哈希环上,使得数据在哈希环上的分布更均匀。这样可以保持节点负载均衡,减少数据倾斜的可能性;
  • 范围的大小:2^32等于 4294967296,这个范围足够大,可以容纳绝大多数哈希值。即使在非常大规模的系统中,仍然可以通过取模运算对节点进行充分的分布;
  • 效率的考虑:取模运算是一种简单高效的运算,可以在常数时间内完成,不会造成太大的计算开销;
  • 可扩展性的考虑:当需要增加或删除服务器节点时,可以方便地调整哈希环的大小(例如 2^32)来适应节点数量的变化,而不会影响已有数据的映射关系

总之,选择对2^32进行取模运算是为了保证哈希环的均匀性、范围的大小、计算效率以及可扩展性。这样可以提高一致性哈希算法的分布均衡性和系统的性能。
一致性哈希算法要进行两步哈希:

  1. 对存储节点进行哈希计算,即对存储节点做哈希映射,比如根据节点的 IP 地址进行哈希;
  2. 当需要对数据进行存储或访问时,对数据进行哈希映射

所以,一致性哈希是指将「存储节点」和「数据」都映射到一个首尾相连的哈希环上。
那么,对「数据」进行哈希映射得到一个结果,要怎样找到存储该数据的节点呢?答案是:映射的结果值往顺时针的方向找到的第一个节点,就是存储该数据的节点。

在这里插入图片描述

如上图所示,有 3 个节点经过哈希计算,映射到了哈希环上不同的位置。接着,对要查询的 key-1 进行哈希计算,确定 key-1 映射在哈希环上的位置后,从这个位置往顺时针的方向找到的第一个节点,就是存储该 key-1 数据的节点。
由于哈希环是一个闭合的环形结构,增加或删除一个服务器节点,只会影响到环上和该节点相邻的部分,而不会影响整个环。因此,当服务器节点发生变化时,只需要重新映射和迁移少量的数据即可,而不会对整个系统产生重大影响。

在这里插入图片描述

在这里插入图片描述

引入虚拟节点

但是一致性哈希算法并不能保证节点都能够在哈希环上分布均匀,这样就会带来一个问题,会有大量的请求都集中在一个节点上。在这种节点分布不均匀的情况下,进行容灾与扩容时,哈希环上的相邻节点容易受到过大影响,发生雪崩式的连锁反应。
比如,下图中如果节点 A 被移除了,当节点 A 宕机后,根据一致性哈希算法的规则,其上的数据应该全部迁移到相邻的节点 B 上,这样节点 B 的数据量、访问量都会迅速增加,而一旦新增的压力超过了节点 B 的处理能力上限,就会导致节点 B 的崩溃,进而形成雪崩式的连锁反应。

在这里插入图片描述

所以,一致性哈希算法虽然减少了数据迁移量,但是会存在节点分布不均匀的问题,这时我们可以引入虚拟节点的概念。
要想解决节点在哈希环上分布不均匀的问题,就是需要有大量的节点,节点数越多,哈希环上的节点分布地就越均匀。具体做法是:不再将真实节点映射到哈希环上,而是将虚拟节点映射到哈希环上,并将虚拟节点映射到真实节点,即这里有两层映射关系。

在这里插入图片描述

可以看到,随着节点数量的增多,节点在哈希环上的分布就相对均匀了。这时,如果有请求寻址到 A-01 这个虚拟节点,接着再通过 A-01 虚拟节点找到其真实节点 A,这样请求就能打到真实节点 A 上了。
上图中每个真实节点仅包含 3 个虚拟节点,实际上这样能起到的均衡效果很有限。在实际的工程中,虚拟节点的数量会有很多,比如 Nginx 的一致性哈希算法,每个权重为 1 的真实节点就包含了 160 个虚拟节点。
另外,虚拟节点除了会提高节点的均衡度之外,还会提高系统的稳定性。当节点发生变化时,会有不同的节点来共同分担系统的变化,因此稳定性会更高。比如,当某个节点被移除时,对应的该节点的多个虚拟节点也会被移除,而这些虚拟节点按顺时针方向找到的下一个虚拟节点,可能会对应着不同的真实节点,即这些不同的真实节点可以共同分担因节点变化而产生的压力。而且,有了虚拟节点之后,还可以为硬件配置更好的节点增加权重,比如对权重更高的节点增加更多的虚拟节点。
因此,引入虚拟节点的一致性哈希算法不仅适合于硬件配置不同的节点的场景,而且适合于节点规模会发生变化的场景。

参考资料

  • https://xiaolincoding.com/os/8_network_system/hash.html#_9-4-%E4%BB%80%E4%B9%88%E6%98%AF%E4%B8%80%E8%87%B4%E6%80%A7%E5%93%88%E5%B8%8C

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL-MySQL分组查询每组最新的一条数据

方法一: 1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘se_jck的博客-CSDN博客 这个错误是由于 MySQL 的新版本中默认开启了ONLY_FULL_GROUP_BY模式,即在 GROUP BY 语句中的 SELECT 列表中&am…

[MMDetection]测试模型

以下是基于MMdetection3.10版本 1、简单测试模型 测试模型一般使用tools中的test.py,一般使用方式 python tools/test.py config文件路径 权重文件路径 可以通过--show 来以gui展示检测结果 python tools/test.py config文件路径 权重文件路径 --show 可以通过--s…

【Linux】部署Prometheus + Grafana简介、监控及设置告警详细操作(多种方式安装,亲测无问题)

🍁博主简介 🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 文章目录 一、环境准备二、部署 Prometheus&am…

优思学院|精益管理入门书籍有哪些推荐?

精益管理是一门易学难精的学问,如果对其基本原则了解不正确,可能会误入歧途,不但不能发挥精益工具的威力,甚至会令企业走向错误的方向,反带来更多的浪费和捐失。以下将介绍几本经典的书籍,可以让你有效地、…

python简单使用【mac-ide:pycharm】

小白实用快捷键记录 一、Mac下安装并配置python3开发环境二、python学习三、pycharm常用快捷键记录 一、Mac下安装并配置python3开发环境 点我查看python及pycharm下载安装、环境配置 二、python学习 不是很推荐,想系统学习的同学可以做个参考: Pytho…

排序之玩转qsort函数——【C语言】

说起排序,我们会想起许多算法,在之前的博客中我也写到过,比如:冒泡排序法、快速排序法、选择排序法等等。其实在C语言中一直有一个可以将数组中的内容进行排序的函数且功能完善内容齐全的库函数——qsort函数。今天就让我们来探索…

OpenPCDet系列 | 8.2 nuScenes数据集的eval流程

0. eval转换的目标 模型的训练和测试过程输出结果是不一样的,对于训练过程是为了构建损失函数来进行训练,而对于测试过程是为了对object进行预测生成预测内容。下面以VoxelNeX检测器的类代码可见,training和testing将会输出两个内容。 clas…

C++数据结构笔记(7)——队列的顺序结构实现

1.队列&#xff0c;和现实生活中的规则类似&#xff0c;先进先出 2.队尾只允许元素进入&#xff0c;队头只允许元素退出 3.用数组来实现队列的顺序存储&#xff0c;无论哪一段都可以作为队头或者队尾 SeqQueue.h头文件 #ifndef SEQQUEUE_H #define SEQQUEUE_H #include<…

仿大众点评项目 —— Day02【优惠券秒杀、分布式锁】

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…

Java字符串类

string类的理解(以JDK8为例说明) 1.1的声明 public final class String implements java.io.Serializable&#xff0c; Comparable<String>&#xff0c; CharSequence final:String是不可被继承的 Serializable:可序列化的接口。凡是实现此接口的类的对象就可以通过…

建筑施工脚手架安全技术统一标准

为统一建筑施工脚手架设计、施工、使用及管理&#xff0c;做到技术先进、安全适用、经济合理&#xff0c;制定本标准。 本标准适用于房屋建筑工程和市政工程施工用脚手架的设计、施工、使用及管理。 建筑施工脚手架的设计、施工、使用及管理&#xff0c;除应符合本标准外&…

第一百零二天学习记录:数据结构与算法基础:初识数据结构与算法

管理系统模型&#xff08;仓库管理系统&#xff09;—顺序表 操作对象之间的关系&#xff1a;线性关系 数据结构&#xff1a;线性数据结构、线性表 &#xff08;例如&#xff1a;学生成绩管理系统、人事管理系统、仓库管理系统、通讯录等。&#xff09; 操作对象&#xff1a;若…

OWASP 定义的大模型应用最常见的10个关键安全问题

7月15日之前入驻华为云&#xff0c;可参与Check抽奖活动&#xff0c;抽奖活动在文末 1. 《OWASP 大模型应用最常见的10个关键安全问题》项目简介&#xff08;OWASP TOP10 LLMs Project&#xff09; *OWASP Top 10 for Large Language Model Applications OWASP 大模型应用程序…

vue3使用腾讯地图(‘关键词搜索、逆地址解析‘)

1.登录腾讯地图位置服务进入控制台 申请腾讯地图开发者进入控制台申请自己的key 腾讯位置服务 - 立足生态&#xff0c;连接未来 2.进入vue项目的public文件下的index.html 引入腾讯资源包&#xff0c;并把申请的key填入 <script src"https://map.qq.com/api/js?v2…

文心一言 VS 讯飞星火 VS chatgpt (57)-- 算法导论6.4 1题

文心一言 VS 讯飞星火 VS chatgpt &#xff08;57&#xff09;-- 算法导论6.4 1题 一、参照图 6-4 的方法&#xff0c;说明 HEAPSORT 在数组 A(5&#xff0c;13&#xff0c;2&#xff0c;25&#xff0c;7&#xff0c;17&#xff0c;20&#xff0c;8&#xff0c;4)上的操作过程…

怎么修复损坏的视频文件?视频文件修复办法分享!

随着科技的不断发展&#xff0c;我们的生活中已经离不开各种类型的视频文件。因为各式各样的原因&#xff0c;有时候我们的视频文件可能会损坏。 而损坏的视频文件通常是无法正常播放&#xff0c;这无疑会给我们的生活和工作造成极大的困扰。那么&#xff0c;怎么修复损坏的视…

【Linux学习】记录下Linux的常用基本指令~

1、Linux是一个操作系统&#xff0c;和windows是“并列”关系。Linux已经成为"世界第一大操作系统"。 2、Linux这种使用命令的方式比图形化界面的好处&#xff1f; &#xff08;1&#xff09;节省系统资源&#xff1a;运行图形化界面需要让系统付出一些额外开销&am…

stm32(时钟和中断事件知识点)

一、复位和时钟控制&#xff08;RCC&#xff09; 复位 系统复位 当发生以下任一事件时&#xff0c;产生一个系统复位&#xff1a; 1. NRST引脚上的低电平(外部复位) 2. 窗口看门狗计数终止(WWDG复位) 3. 独立看门狗计数终止(IWDG复位) 4. 软件复位(SW复位) 5. 低功耗管…

软件为什么需要进行应急演练脚本?

软件为什么需要进行应急演练脚本&#xff1f;在当今互联网时代&#xff0c;安全问题愈加突出&#xff0c;不断有新的网络攻击方式不断涌现。针对软件系统的安全漏洞和攻击活动不断增加&#xff0c;软件应急演练变得尤为重要。 首先&#xff0c;应急演练可以帮助软件团队建立应急…

C++11可变参数模板,lambda表达式,包装器

目录 可变参数模板 lambda表达式 问题的引入 lambda表达式语法 捕捉列表的使用 函数对象和lambda表达式 function包装器 可变参数模板 C11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板&#xff0c;相比C98/&#xff0c;类模版和函数模版中只能…