分布式算法 - 一致性Hash算法

news2025/8/2 10:31:49
一致性Hash算法是个经典算法,Hash环的引入是为解决 单调性(Monotonicity) 的问题;虚拟节点的引入是为了解决 平衡性(Balance) 问题。

一致性Hash算法引入

在分布式集群中,对机器的添加删除,或者机器故障后自动脱离集群这些操作是分布式集群管理最基本的功能。如果采用常用的hash(object)%N算法,那么在有机器添加或者删除后,很多原有的数据就无法找到了,这样严重的违反了单调性原则。

一致性Hash算法简介

一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用。

一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义:

  • 平衡性(Balance): 平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。很多哈希算法都能够满足这一条件。

  • 单调性(Monotonicity): 单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲加入到系统中。哈希的结果应能够保证原有已分配的内容可以被映射到原有的或者新的缓冲中去,而不会被映射到旧的缓冲集合中的其他缓冲区。

  • 分散性(Spread): 在分布式环境中,终端有可能看不到所有的缓冲,而是只能看到其中的一部分。当终端希望通过哈希过程将内容映射到缓冲上时,由于不同终端所见的缓冲范围有可能不同,从而导致哈希的结果不一致,最终的结果是相同的内容被不同的终端映射到不同的缓冲区中。这种情况显然是应该避免的,因为它导致相同内容被存储到不同缓冲中去,降低了系统存储的效率。分散性的定义就是上述情况发生的严重程度。好的哈希算法应能够尽量避免不一致的情况发生,也就是尽量降低分散性。

  • 负载(Load): 负载问题实际上是从另一个角度看待分散性问题。既然不同的终端可能将相同的内容映射到不同的缓冲区中,那么对于一个特定的缓冲区而言,也可能被不同的用户映射为不同 的内容。与分散性一样,这种情况也是应当避免的,因此好的哈希算法应能够尽量降低缓冲的负荷。

一致性Hash算法

Hash环

使用常见的hash算法可以把一个key值哈希到一个具有2^32个桶的空间中。也可以理解成,将key值哈希到 [0, 2^32) 的一个数字空间中。 我们假设这个是个首尾连接的环形空间。如下图:

假设我们现在有key1,key2,key3,key4 4个key值,我们通过一定的hash算法,将其对应到上面的环形hash空间中。

k1=hash(key1);
k2=hash(key2);
k3=hash(key3);
k4=hash(key4);

同样的,假设我们有3台cache服务器,把缓存服务器通过hash算法,加入到上述的环中。一般情况下是根据机器的IP地址或者唯一的计算机别名进行哈希。

c1=hash(cache1);
c2=hash(cache2);
c3=hash(cache3);

接下来就是数据如何存储到cache服务器上了,key值哈希之后的结果顺时针找上述环形hash空间中,距离自己最近的机器节点,然后将数据存储到上面, 如上图所示,k1 存储到 c3 服务器上, k4,k3存储到c1服务器上, k2存储在c2服务器上。用图表示如下:

删除节点

假设cache3服务器宕机,这时候需要从集群中将其摘除。那么,之前存储再c3上的k1,将会顺时针寻找距离它最近的一个节点,也就是c1节点,这样,k1就会存储到c1上了,看一看下下面的图,比较清晰。

摘除c3节点之后,只影响到了原先存储再c3上的k1,而k3、k4、k2都没有受到影响,也就意味着解决了最开始的解决方案(hash(key)%N)中可能带来的雪崩问题。

增加节点

新增C4节点之后,原先存储到C1的k4,迁移到了C4,分担了C1上的存储压力和流量压力。

不平衡的问题

上面的简单的一致性hash的方案在某些情况下但依旧存在问题: 一个节点宕机之后,数据需要落到距离他最近的节点上,会导致下个节点的压力突然增大,可能导致雪崩,整个服务挂掉。

如下图所示:

当节点C3摘除之后,之前再C3上的k1就要迁移到C1上,这时候带来了两部分的压力:

  • 之前请求到C3上的流量转嫁到了C1上,会导致C1的流量增加,如果之前C3上存在热点数据,则可能导致C1扛不住压力挂掉。

  • 之前存储到C3上的key值转义到了C1,会导致C1的内容占用量增加,可能存在瓶颈。

当上面两个压力发生的时候,可能导致C1节点也宕机了。那么压力便会传递到C2上,又出现了类似滚雪球的情况,服务压力出现了雪崩,导致整个服务不可用。这一点违背了最开始提到的四个原则中的 平衡性, 节点宕机之后,流量及内存的分配方式打破了原有的平衡。

虚拟节点

“虚拟节点”( virtual node )是实际节点(机器)在 hash 空间的复制品( replica ),一实际个节点(机器)对应了若干个“虚拟节点”,这个对应个数也成为“复制个数”,“虚拟节点”在 hash 空间中以hash值排列。

依旧用图片来解释,假设存在以下的真实节点和虚拟节点的对应关系。

Visual100—> Real1
Visual101—> Real1
Visual200—> Real2
Visual201—> Real2
Visual300—> Real3
Visual301—> Real3

同样的,hash之后的结果如下:

hash(Visual100)—> V100  —> Real1
hash(Visual101)—> V101  —> Real1
hash(Visual200)—> V200  —> Real2
hash(Visual201)—> V201  —> Real2
hash(Visual300)—> V300  —> Real3
hash(Visual301)—> V301  —> Real3

key值的hash结果如上,这里暂时不写了。

和之前介绍的不添加虚拟节点的类似,主要聊下如果宕机之后的情况。

假设Real1机器宕机,则会发生一下情况。

  • 原先存储在虚拟节点V100上的k1数据将迁移到V301上,也就意味着迁移到了Real3机器上。

  • 原先存储再虚拟节点V101上的k4数据将迁移到V200上,也就意味着迁移到了Real2机器上。

结果如下图:

这个就解决之前的问题了,某个节点宕机之后,存储及流量压力并没有全部转移到某台机器上,而是分散到了多台节点上。解决了节点宕机可能存在的雪崩问题。

当物理节点多的时候,虚拟节点多,这个的雪崩可能就越小。

整理好的Java面试资料,推荐阅读:

最全的java面试题库

Java核心知识点整理

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

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

相关文章

MySQL索引类型及原理?一文读懂

一、什么是MySQL索引? MySQL索引是一种数据结构,用于提高数据库查询的性能。它类似于一本书的目录,通过在表中存储指向数据行的引用,使得查询数据的速度更快。 在MySQL中,索引通常是在表上定义的,它们可以…

本地新创建的项目,关联/上传到码云

以下示例以mac为例,window将相关步骤改为windows对应的操作即可1、打开终端,通过终端命令 cd 切换到新建的本地项目目录下,如:(/Users/wangcongming/Documents/TuoTuo/mobile_acitvity 为我的新建项目地址)…

使用 ChatGPT ,通过自然语言编写 eBPF 程序和追踪 Linux 系统

eBPF 是一项革命性的技术,起源于 Linux 内核,可以在操作系统的内核中运行沙盒程序。它被用来安全和有效地扩展内核的功能,而不需要改变内核的源代码或加载内核模块。今天,eBPF被广泛用于各类场景:在现代数据中心和云原…

「RISC-V Arch」SBI 规范解读

术语 SBI,Supervisor Binary Interface,管理二进制接口 U-Mode,User mode,用户模式 S-Mode,Supervisor mode,监督模式 VS-Mode,Virtualization Supervisor mode,虚拟机监督模式 …

嵌入式 Linux Shell编程

目录 1、shell脚本 2、执行shell脚本 3、shell脚本编写 3.1 shell变量 3.2 标准变量或环境变量 3.4 变量赋值有五种格式 3.5 运算符和表达式 关系运算符 布尔运算符 3.6 Test命令用法 1、判断表达式 2、判断字符串 3.判断整数 4、判断文件 3.7 数组 1、数组定义…

什么是 RPA ?What is robotic process automation (RPA)?

目录 前言 What is a business process? 什么是业务流程? What does "robotic process automation" mean?“机器人过程自动化”是什么意思? What is robotic process automation (RPA)?什么是机器人流程自动化 (RPA)? What

SGI 空间配置器

前言 空间配置器是 STL 六大组件之一,它总是隐藏在容器的背后,默默工作,默默付出。本文为《STL 源码剖析》读书笔记,主要讨论 SGI 版本空间的配置和释放,对代码进行解读时会改变一些写法,使其更易于阅读。…

__stack_chk_fail问题分析

一、问题进程收到SIGABRT信号异常退出,异常调用栈显示__stack_chk_fail*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** Build fingerprint: Pico/A7H10/PICOA7H10:10/5.5.0/smartcm.1676912090:userdebug/dev-keys Revision: 0 ABI: arm64 Times…

VS Code下载安装教程

VS Code下载安装使用教程 目录VS Code下载安装使用教程一、下载二、安装三、使用教程3.1 VS Code中的第一个页面HelloWorld.html3.2 VS Code插件安装3.2.1 安装中文界面3.2.3 安装 Open in Browser插件3.2.4 安装Auto Rename Tag插件注意:3.3 code .命令&#xff0c…

EasyNLP集成K-Global Pointer算法,支持中文信息抽取

作者:周纪咏、汪诚愚、严俊冰、黄俊 导读 信息抽取的三大任务是命名实体识别、关系抽取、事件抽取。命名实体识别是指识别文本中具有特定意义的实体,包括人名、地名、机构名、专有名词等;关系抽取是指识别文本中实体之间的关系;…

代码随想录算法训练营第十天 | 理论基础、232.用栈实现队列、225. 用队列实现栈

打卡第10天,今天学习栈和队列 今日任务 理论基础232.用栈实现队列 用队列实现栈 理论基础 栈:先进后出 队列:先进先出 栈和队列是STL(C标准库)里面的两个数据结构 在 SGI STL 中,栈和队列的底层实现 栈…

Android使用FrameLayout+RecyclerView实现悬浮置顶封装功能

一、实际开发效果图默认效果:滚动后的效果:二、效果实现方式CoordinatorLayout AppBarLayout RecyclerView(适用于简单的悬浮View不超过一屏的情况,头部固定,数据简单)FrameLayout RecyclerView(适用于复杂的多条目布局,且悬浮条目位置受后…

移动硬盘无法识别?恢复硬盘,问题已解决

移动硬盘和U盘比较,它的体积是比较大的,但是相应的存储位置就会大点。它作为可移动设备,对于存储大型的数据,还是非常方便的。 有时候用户会发现移动硬盘出现一些问题,移动硬盘与电脑连接后,在电脑桌面右下…

java自定义注解实现数据字典映射

一 :前言 在我们开发过程中,我们从前端页面接收的数据字典一般都是key(大多数为数字),但我们在页面显示的时候,想用其value值。如果我们每使用一次就要去写一些重复的代码去查询,这样会使我们的…

SharePoint Online CDN简介

前言 可能很多人并不了解CDN这个概念,不过作为Web从业人员着实不该,CDN就是内容分发网络,说白了就是第三方帮你托管静态资源,你可以在全球任何位置快速访问到对应的节点的资源。 正文 我们提到的SharePoint CDN,其实更…

高精度加减乘除

高精度加法 对于给定的两个特别大的数我们用两个字符串来接收 s1和s2。 例如:对于两个数 56215455和95425453,即 s1 "56215455" , s2 "95425453"。 对于这两个数,分别用两个列表 a和b来接收(例如&#x…

LeetCode-78. 子集

题目来源 78. 子集 题目思路 其实子集也是一种组合问题,因为它的集合是无序的,子集{1,2} 和 子集{2,1}是一样的。 那么既然是无序,取过的元素不会重复取,写回溯算法的时候,for就要从startIndex开始,而在这…

华为OD机试题,用 Java 解【比赛评分】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…

开源单点登录MaxKey和JeeSite 单点登录集成指南

1. JeeSite介绍 JeeSite 隶属于济南卓源软件有限公司,是一个 Java 快速开发平台, 基于经典技术组合(Spring Boot、Shiro、MyBatis、BeetlBootstrap or TSVue3)在线代码生成工具, 支持 Spring Cloud 架构,分…

MYSQL 索引失效的十个场景(一)

一、查询条件包含or,可能导致索引失效 新建一个student表,它有一个普通索引userId,结构如下: CREATE TABLE student (id varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL,name varchar(50) COLLATE utf8mb4_unicode_ci DEFAUL…