算法——分布式——一致性哈希、一致性hash图解动画

news2024/9/22 14:29:16

分布式算法——一致性哈希、一致性Hash

  • 概述
  • 传统Hash算法
  • 算法步骤
    • 生成Hash环
    • 定位服务器
    • 定位数据和映射服务器
  • 服务器变更
  • Hash环倾斜
  • 虚拟节点
  • 总结

概述

         一致性哈希算法在1997年由麻省理工学院提出,是一种特殊的哈希算法,目的是解决分布式缓存的问题。在移除或者添加一个服务器时,能够尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系。一致性哈希解决了简单哈希算法在分布式哈希表( Distributed Hash Table,DHT) 中存在的动态伸缩等问题。

         整体流程大致分为三步。
         一:生成Hash环:首先,对存储节点的哈希值进行计算,其将存储空间抽象为一个环,将存储节点配置到环上。环上所有的节点都有一个值。
         二:对各个服务器使用Hash函数进行哈希计算,具体可以选择服务器的IP或主机名作为关键字进行哈希,从而确定每台机器在哈希环上的位置。
         二:对各个服务器使用Hash函数进行哈希计算,具体可以选择服务器的IP或主机名作为关键字进行哈希,从而确定每台机器在哈希环上的位置。
         三:对数据进行哈希计算,按顺时针方向将其映射到离其最近的节点上去。当有节点出现故障离线时,按照算法的映射方法,受影响的仅仅为环上故障节点开始逆时针方向至下一个节点之间区间的数据对象,而这些对象本身就是映射到故障节点之上的。

文章中使用的动画网站地址,限 pc: 一致性哈希 算法动画
http://www.donghuasuanfa.com/platform/portal?pc=consistent-hashing

传统Hash算法

        假设现在一共有3个服务器和n个数据,需要将数据存储到服务器上。那么传统的做法是将数据进行Hash算法,然后与3取模。取模结果为数据映射服务器的结果。

        数据计算和定位服务器过程如下图1-1所示
在这里插入图片描述

图1-1

        映射计算结果如下图1-2所示
在这里插入图片描述

图1-2

        如果新增加一个服务器,因为服务器数量变更。则需要对n个数据重新进行映射。重新计算的过程耗时耗力。
        为了解决上述问题,则发明出一致性hash算法。

算法步骤

生成Hash环

         一:首先将232的节点生成一个虚拟圆环,称为Hash 环。Hash环的节点为0、1、2…232-1 。
        类似钟表,钟表是12个小时节点组成的圆环。而 Hash 环是是由 232幂组成的圆环。详情如图2-1所示
请添加图片描述

图2-1

定位服务器

         服务器需要加入到集群中。则需要定位服务的节点位置,定位过程为通过服务器ip计算Hash结果。然后结果与232取模。结果肯定为0~232-1中的某一个数字。取模结果对应的环中的位置就是服务器的所在位置。

详情如图2-2所示
请添加图片描述

图2-2

定位数据和映射服务器

         现在有数据需要定位到服务器,传统的方式可以为与服务器个数进行取模预算,取模结果为映射到的服务器。例如共有3个服务器。数据与3进行取模,结果为0。则数据定位到第一个服务器。
一致性hash处理数据的步骤如下:
         一:将数据进行Hash计算。计算结果与232次幂取模,取模结果定位到Hash环上。
         二:通过数据所在位置,沿顺时针寻找最近的服务器,然后数据定位到对应的服务器。

详情如图2-3所示
请添加图片描述

图2-3

服务器变更

         现集群中有3个服务器和4个数据。其中张三、李四、王五定位的服务器为第一台红色服务器,赵六定位的服务器为第二台绿色服务器。
         假设第二个服务器宕机了,则逆时针寻找宕机的服务器与存活服务器时间的数据。图中需要处理的数据为赵六数据节点。重新定位的逻辑依旧为顺时针定位寻找存活的服务器。图中赵六重新定位的结果为第3个蓝色服务器。
         新增服务器时同理,只需要重新计算新服务器和新服务器逆时针顺序的第一个服务器的中间数据即可。不用全量重新计算所有数据。

详情如图3-1所示
请添加图片描述

图3-1

Hash环倾斜

         当环上服务器较少时,容易造成数据与服务器分布均匀。如图4-1所示。张三、李四、王五三个数据都映射到了红色服务器,但是其他服务器所对应的数据较少。这种分布不均匀的情况称为Hash环倾斜。

在这里插入图片描述

图4-1

虚拟节点

         为了解决Hash环倾斜的问题,一致性hash算法增加了虚拟节点解决问题。即对服务器节点计算多个Hash值,然后将多个Hash结果定位到Hash环上。环上的服务器节点越多,则数据映射服务器越均匀。详情如图5-1所示。
请添加图片描述

图5-1

总结

  1. 算法解决的问题:解决集群中数据映射定位服务器,当集群中增加或减少服务器数量时,需要重新对所有数据进行计算的问题。

  2. 算法过程:
    2.1 首先将232的节点生成一个虚拟圆环,称为Hash 环。
    2.2 对服务器进行hash计算并与232进行取模计算,取模结果为hash环所在位置。
    2.3 对数据进行hash计算并与232进行取模计算,然后顺时针寻找的第一个服务器为数据映射服务器。

  3. 服务器节点变更:只需变动新增或删除服务器与hash环上逆时针的第一个服务器之间的数据即可,无需处理所有数据。

  4. Hash环倾斜:当服务器节点减少时,容易出现大量数据映射到一个服务器上。

  5. 虚拟节点:为了避免Hash环倾斜。所以对服务器计算多个Hash值并取模,将计算的结果映射到Hash环上。通过增加服务器的数量让数据均匀分布到服务器。

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

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

相关文章

使用bert4keras出现的问题(Process finished with exit code -1073741819 (0xC0000005))

1、环境 python 3.7.12 tensorflow 1.15 keras 2.3.1 bert4keras 0.9.7 protobuf 3.19.0 numpy 1.16.5 2、出现问题 numpy版本不兼容问题所以你就直接按照我的版本就可以了(numpy 1.16.5) Process finished with exit code -1073741819 (0xC0000005) …

关于储存器的笔记

存储器是许多存储单元的集合,按单元号顺序排列。每个单元由若干二进制位构成,以表示存储单元中存放的数值,通常由数组描述存储器。 存储器可分为主存储器(简称主存或内存)和辅助存储器(简称辅存或外存)两大类。和CPU直接交换信息的是主存。 …

HDCTF KEEP ON

Index KEEP ONChecksec & IDA漏洞分析完整EXP KEEP ON Checksec & IDA __int64 vuln() {char s[80]; // [rsp0h] [rbp-50h] BYREFmemset(s, 0, sizeof(s));puts("please show me your name: ");read(0, s, 0x48uLL);printf("hello,");printf(s);p…

2.5 习题分析

类型一、 通过收敛阶的定义分析迭代方法的收敛速度 例6 分析简单迭代法与牛顿迭代法的收敛速度 我的答案: 一、信息 1.分析简单迭代 2.分析牛顿迭代 3.二者的收敛速度 二、分析 条件1和条件2:告诉我此次分析的目标 条件3告诉我分析的方向即为收…

剑指 Offer 67. 把字符串转换成整数及复制带随机指针的链表

文章目录 一、剑指 Offer 67. 把字符串转换成整数二、Leetcode 138. 复制带随机指针的链表 一、剑指 Offer 67. 把字符串转换成整数 题目是这样的 字符串转换为整数,是连续的数字字符转换,如果数字字符不连续,只转换最前面连续的那部分 其实…

Axios的介绍与使用

Axios的介绍 get请求 Axios配置对象 创建实例发送请求 取消请求 Axios的介绍 目前前端最流行的 ajax 请求库 、react/vue 官方都推荐使用 axios 发 ajax 请求 特点: 基于 xhr promise 的异步 ajax 请求库浏览器端/node 端都可以使用支持请求/…

20.Java序列化

Java序列化 一、序列化和反序列化 序列化:指堆内存中的java对象数据,通过某种方式把对存储到磁盘文件中,或者传递给其他网络节点(网络传输)。这个过程称为序列化,通常是指将数据结构或对象转化成二进制的…

IPC行业信息汇总

IPC:“网络摄像机”,是IP Camera的简称。它是在前一代模拟摄像机的基础上,集成了编码模块后的摄像机。它和模拟摄像机的区别,就是在新增的“编码模块”上。 模拟摄像机,顾名思义,输出的是模拟视频信号。模拟…

大数据系列——Spark理论

概述 Apache Spark,全称伯克利数据分析栈,是一个开源的基于内存的通用分布式计算引擎,内部集成大量的通用算法,包括通用计算、机器学习、图计算等,用于处理大数据应用。 主要由下面几个核心构件组成,具体包…

C++、STL标准模板库和泛型编程 ——适配器、补充(侯捷)

C、STL标准模板库和泛型编程 ——适配器 (侯捷)--- 持续更新 适配器(Adapters)容器适配器(Container Adapters)仿函数适配器(Functor Adapters)bind2nd(绑定第二实参&…

Tomcat源码:Pipeline与Valve

参考资料: 《Tomcat组成与工作原理》 《Tomcat - Container的管道机制:责任链模式》 《Tomcat源码解析系列 Pipeline 与 Valve》 前文: 《Tomcat源码:启动类Bootstrap与Catalina的加载》 《Tomcat源码:容器的生命…

Mybatis源码01-Executor

前言 为了方便公司业务排查问题,要求打印执行的sql,以及执行时间。编写了一个Mybatis的拦截器,此前从未看过mybatis的源码,在调试的过程中不断阅读源码,后边想更深刻了解一下,看了鲁班大叔的视频&#xff…

OSCP-Nickel(爆破pdf、本地http提权)

目录 扫描 HTTP 提权 扫描 FileZilla不接受匿名FTP登录。 端口21上的SSH和3389上的RDP很少是初始入口点,但是如果遇到一些凭据,可以记住这一点。 HTTP 打开Web浏览器并导航到端口8089和3333,用于的HTTP服务器。端口8089似乎是某种类型的开发环境。 单击一个按钮重定向到…

boot-admin整合Quartz实现动态管理定时任务

淄博烧烤爆红出了圈,当你坐在八大局的烧烤摊,面前是火炉、烤串、小饼和蘸料,音乐响起,啤酒倒满,烧烤灵魂的party即将开场的时候,你系统中的Scheduler(调试器),也自动根据…

在函数中使用变量

shell脚本编程系列 向函数传递参数 函数可以使用标准的位置变量来表示在命令行中传给函数的任何参数。其中函数名保存在$0变量中,函数参数则依次保存在$1、$2等变量当中,也可以使用特殊变量$#来确定参数的个数 在脚本中调用函数时,必须将参…

day3 TCP/IP协议与五层体系结构

TCP / IP 四层体系结构 TCP / IP工作流程: 现在互联网使用的 TCP/IP 体系结构已经发生了演变,即某些应用程序可以直接使用 IP 层,或甚至直接使用最下面的网络接口层。 沙漏型展示: 五层体系结构 各层的主要功能 应用层&#xff1…

C++ Primer阅读笔记--语句的使用

① 空语句 最简单的语句是空语句,其只含有一个单独的分号; ② switch语句 case 关键字和它对应的值一起被称为 case 标签,case 标签必须是整型常量表达式; char ch getVal(); int iVal 42; switch(ch){case 3.14: // 错误&#…

ZmosHarmony buildroot移植与使用

前言 移植过程 1、添加编译选项编译buildroot。 2、开机启动时设置 LD库的环境变量与PATH路径。 是什么原因需要这样操作? 主要使用busybox,使用buildroot的瑞士军dao。 使用busybox 为buildroot下的使用 第一次启动时设置 由于是在vendor分区因此 …

01 openEuler虚拟化-KVM虚拟化简介

文章目录 01 openEuler虚拟化-KVM虚拟化简介1.1 简介1.2 虚拟化架构1.3 虚拟化组件1.4 虚拟化特点1.5 虚拟化优势1.6 openEuler虚拟化 01 openEuler虚拟化-KVM虚拟化简介 1.1 简介 在计算机技术中,虚拟化是一种资源管理技术,它将计算机的各种实体资源&…

ActiveMQ 反序列化漏洞 (CVE-2015-5254)漏洞复现

当前漏洞环境部署在vulhub,当前验证环境为vulhub靶场(所有实验均为虚拟环境) 实验环境:攻击机----kali 靶机:centos7 需要的jar包:jmet-0.1.0-all.jar 1、启动docker,进入vulhub(靶机&#xff0…