一致性 Hash 算法(分布式或均衡算法)

2023-11-04

简介

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

场景引入

比如你有 N 个 cache 服务器(后面简称 cache ),那么如何将一个对象 object 映射到 N 个 cache 上呢,你很可能会采用类似下面的通用方法计算 object 的 hash 值,然后均匀的映射到到 N 个 cache :
hash(object)%N1
上面取模的方法一般称为简单 hash 算法 。通过简单 hash 算法确实能够比较均匀地实现分布式布置(映射),但是我们来考虑下面两种情形:

  1. 某个 cache 服务器 m down 掉了(在实际应用中必须要考虑这种情况),这样所有映射到 cache m的对象都会失效,怎么办,需要把 cache m 从 cache 中移除,这时候 cache 是 N-1 台,映射公式变成了
    hash(object)%(N-1) ;
  2. 由于访问加重,需要添加 cache ,这时候 cache 是 N+1 台,映射公式变成了 hash(object)%(N+1);

1) 和 2) 意味着什么?这意味着无论是添加或移除 cache 服务器,突然之间几乎所有的 cache 都失效了。对于服务器而言,这是一场灾难,洪水般的访问都会直接冲向后台服务器;

为了解决上面的问题,我们引入一致性 Hash 算法(consistent hashing)。

hash 算法的单调性

Hash 算法的一个衡量指标是单调性( Monotonicity ),定义如下:

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

简单的说,单调性要求在移除 / 添加一个 cache(机器,ip)时,它能够尽可能小的改变已存在 key 映射关系。

容易看到,上面的简单 hash 算法 hash(object)%N 难以满足单调性要求。因为 N 的变化会使取模结果发生变化。

一致性 Hash 算法原理:
一致性 Hash 算法简单的说,在移除 / 添加一个 cache 时,它能够尽可能小的改变已存在 key 映射关系,尽可能的满足单调性的要求。

下面就来按照 6 个步骤简单讲讲一致性 Hash 算法的基本原理。

步骤一:环形 hash 空间

考虑通常的 hash 算法都是将 value 映射到一个 32 位的 key 值(然后取模),也即是 0~2^32-1 次方的数值空间;我们可以将这个空间想象成一个首( 0 )尾( 2^32-1 )相接的圆环。如下图所示:
在这里插入图片描述

步骤二:把对象处理成整数并映射到环形 hash 空间

例如现在我们有四个对象 object1~object4,通过 hash 函数将四个对象处理成整数 key:

key1 = hash(object1);
key2 = hash(object2);
key3 = hash(object3);
key4 = hash(object4);

然后将这些对象按照 key 的值映射到环形 hash 空间上:
在这里插入图片描述

步骤三:把 cache 映射到环形 hash 空间

一致性 Hash 算法的基本思想就是将对象和 cache 都映射到同一个 hash 数值空间中,并且使用相同的 hash 算法。

假设现在有三台 cache 服务器:cacheA、cacheB、cacheC,通过 hash 函数处理获取对应的key值:

keyA = hash(cacheA);
keyB = hash(cacheB);
keyC = hash(cacheC);

将三个 cache 服务器按照 key 的值映射到环形 hash 空间上:
在这里插入图片描述

说到这里,顺便提一下 cache 的 hash 计算,一般的方法可以使用 cache 机器的 IP 地址或者机器名作为 hash 输入。

经过上面的步骤,我们把对象和cache 服务器都映射到同一个环形 hash 空间上。下面考虑的是如何将对象映射到 cache 服务器上。

步骤四:将对象映射到 cache 服务器

我们沿着圆环顺时针方向的对象 key (图中的 key1)出发,直到遇到一个cache服务器为止(cacheB),把对象key对应的对象映射到这个服务器上。因为对象和 cache 的 hash 值是固定的,因此这个 cache 必然是唯一和确定的。按照这样的方法,可以得出:对象 object 1 映射到 cacheB,object2、object3 映射到 cacheC,object4 映射到 cacheA。如图:
在这里插入图片描述

前面讲过,普通 hash 算法(通过 hash 然后求余的方法)带来的最大问题就在于不能满足单调性,当 cache 数量有所变动时(添加/移除), 几乎所有的 cache 会失效,进而对后台服务器造成巨大的冲击,接下来分析一致 hash 算法。

步骤五:添加 cache 服务器

现在假如访问加重,需要增加 cacheD 服务器,经过 hash 函数计算(keyD = hash(cacheD))发现数值介于 key3 和 key2 之间,即在圆环上的位置也是介于它们之间。这时候受到影响的是沿着 KeyD 逆时针出发直到遇到下一个 cache 服务器(keyB)之间的对象(这些对象原本是映射到 cacheC 上的),将这些对象重新映射到 cacheD 即可。

在我们的例子中仅仅是 object2(key2)需要变动,将其重新映射到 cacheD 即可:
在这里插入图片描述

步骤六:移除 cache 服务器

还是按照原来的图(步骤五之前)分析,假如现在 cacheB 服务器 down 掉了,需要把 cacheB 服务器移除,这时候受到影响的仅是那些沿着 keyB 逆时针出发知道遇到下一个服务器(cacheA)之间的对象,也就是本来映射到 cacheB 上的那些对象。

我们的例子中仅仅是 object1(key1)需要变动,将其重新映射到 cacheC 即可:
在这里插入图片描述

hash算法的平衡性

考量 Hash 算法的另一个指标是平衡性 (Balance) ,定义如下:

平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。

hash 算法并不是保证绝对的平衡,如果 cache 较少的话,对象并不能被均匀的映射到 cache 上,比如在上面的例子中,仅部署 cache A 和 cache C 的情况下,在 4 个对象中, cache A 仅存储了 object1 ,而 cache C 则存储了 object2 、 object3 和 object4 ;分布是很不均衡的。

为了解决这种情况, 一致性 Hash 算法引入了“虚拟节点”的概念,它可以如下定义:

虚拟节点

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

仍以仅部署 cache A 和 cache C 的情况为例,在移除 cacheB 服务器图中我们已经看到, cache 分布并不均匀。现在我们引入虚拟节点,并设置“复制个数”为 2 ,这就意味着一共会存在 4 个“虚拟节点”, cache A1, cache A2 代表了 cache A ; cache C1, cache C2 代表了 cache C ;假设一种比较理想的情况,如图:
在这里插入图片描述

此时,对象到“虚拟节点”的映射关系为:

objec1->cache C2 ; objec2->cache A1 ; objec3->cache C1 ; objec4->cache A2 ;

因此对象 object4 和 object2 都被映射到了 cache A 上,而 object3 和 object1 映射到了 cache C 上;平衡性有了很大提高。

引入“虚拟节点”后,映射关系就从 { 对象 -> 节点 } 转换到了 { 对象 -> 虚拟节点 } 。查询物体所在 cache 时的映射关系如图所示。
在这里插入图片描述

“虚拟节点”的 hash 计算可以采用对应节点的 IP 地址加数字后缀的方式。例如假设 cache A 的 IP 地址为 202.168.14.241 。

引入“虚拟节点”前,计算 cache A 的 hash 值:

Hash(“202.168.14.241”);

引入“虚拟节点”后,计算“虚拟节”点 cache A1 和 cache A2 的 hash 值:

Hash(“202.168.14.241#1”); // cache A1

Hash(“202.168.14.241#2”); // cache A2


本文来自 LSGOZJ 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/baidu_30000217/article/details/53671716?utm_source=copy

https://blog.csdn.net/sparkliang/article/details/5279393

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一致性 Hash 算法(分布式或均衡算法) 的相关文章

随机推荐

  • R语言深度学习:强化学习入门

    专栏内含有很多案例供参考 目录 1 强化学习基础 2 强化学习的一个简单例子 玩游戏 结论 在今天的博客中 我们将一起探索强化学习 Reinforcement Learning 的世界 强化学习是深度学习的一个重要领域 它让机器通过与环境的
  • 多层Unity3D物体模型穿透问题处理

    本文针对在一个界面中展示多层3D物体时遇到的模型穿透问题提出一些解决方案 如图 当我们想要在同一个界面中展示两层或以上3D物体时 有时会因为第一层物体材质上的 shader 渲染深度被破坏或其它原因导致第一层的物体穿透到第二层界面上来了 在
  • FTP-----局域网内部远程桌面

    此文包含详细的图文教程 有疑问评论区留言 博主第一时间解决 目录 一 被远程桌面的电脑 1 开启远程权限 2 添加账户 有本地账户跳过这步 3 帐号隶属于 远程桌面 4 帐号隶属于 本地用户组 二 本地电脑连接远程桌面 前提条件 1 两台电
  • 蚁剑jsp一句话木马

    参考链接 https github com yzddmr6 JspForAntSword 密码为 passwd
  • 【深度学习图像识别课程】keras实现CNN系列:(5)应用数据增强进行CIFAR10分类

    一 图像增强简介 如何保证图像的标度不变性 大小 平移不变性 位置 旋转不变性 角度 最大池化层 保证平移不变性 增强 训练集扩展 对训练图片进行随机旋转或者平移 保证平移不变性 旋转不变性 避免过拟合 keras文档 https kera
  • spark集群8080端口页面只显示master的情况

    电脑配置是一台物理机作为master 一台物理机作为slave 在master启动运行后 使用jps命令分别查看两台机器的运行状况 master与slave均运行正常 但是进入master 8080的web控制端查看运行状态时候 发现只有m
  • 写一个python函数 用cuda加速

    好的 下面是一个用 CUDA 加速的 Python 函数的示例 import numpy as np import cupy as cp def accelerate with cuda x y 将 numpy 数组转换为 cupy 数组
  • 【视觉slam十四讲笔记】Sophus库的使用

    Sophus库的使用 include
  • Day03 Python之 可迭代对象Iterable和迭代器Iterator、迭代器协议

    一 什么是可迭代对象 iterable 1 可迭代对象 iterable 可以通过for in 这类语句遍历读取数据的对象 如 列表 字符串 元组 字典 集合 2 for循环工作原理 在内部对可迭代对象调用iter 方法 获取到迭代器对象
  • 02_ue4界面介绍

    1 菜单栏 1 文件 加载保存项目和关卡等 2 编辑 项目设置 标准的复制和粘贴操作 3 窗口 打开视图和其他面板 如果不小心关了窗口 可以在里面找 4 帮助 获得在线文档等帮助 2 工具栏 快速访问常用工具 1 保存当前关卡 2 对当前关
  • Flink 水位线

    水位线是什么 窗口 有了 但是要知道我们面对的是实时数据 而这些数据随时会出现延迟的情况 从几秒到几小时都有可能 如果要忽略这些数据 那么显然对于结果的计算是不准确的 可是要等待这些延迟数据的话 那岂不是等同于批处理了 我们等不了那么久的
  • CentOS7上安装 Apache

    在 CentOS 7 上安装 Apache 的方法如下 1 首先打开终端 并使用 sudo 命令以 root 权限运行 sudo su 2 更新软件包列表 yum update 3 安装 Apache 服务器和常用工具 yum instal
  • C++【对象模型】

    文章目录 索引 一 默认构造函数 1 何时默认构造函数会自动生成 2 编译器合成有用的构造函数四种情况 2 1 类中内含带有默认构造的类成员 2 2 带有默认构造的基类 2 3 带有虚函数的类 2 4 带有一个虚基类的类 索引 C 对象模型
  • Jetbrain项目管理全家桶

    sudo mkdir p m 750 opt hub data opt hub conf opt hub logs opt hub backups sudo chown R 13001 13001 opt hub data opt hub
  • ppt地图分布图一块一块的怎么做_学会“地图话”,走遍天下都不怕!

    PPT是维他命 hi 这里是PPT是维他命 谢谢你的关注 我们一起进步 hello大家 又 好久不见了 心虚 距离上次更新已经快两个月了 说好的半月更 说好的尽快发地球公转 都是我的锅 从十一开始因为加课时一直在调整节奏 忙到原地陀螺转 这
  • Vue中使用七牛云上传报错o.upload.addEventListener is not a function以及其他报错问题

    1 运行提示o upload addEventListener is not a function 解决方案 此方法不是根本解决办法 问题3的解决办法是最终解决方案 找到node modules mockjs dist mock js 第8
  • 北京大学肖臻老师《区块链技术与应用》公开课 06-BTC-网络

    总述 用户将交易发布到比特币网络上 节点收到这些交易之后 将其打包到区块里 节点将区块发布到比特币网络中 新发布的区块在比特币网络中如何传播 The Bitcoin Network 比特币工作在应用层 application layer B
  • 羞羞的报告:2020年轻人性爱数据报告。

    VI 腾讯新闻谷雨数据出品 ID guyudata 转自 小蚊子数据分析 今天开工第一天 就来分享点数据相关的轻松的内容 2020年 多少人实现了性爱需求的满足 多少人处于性需求的 贫困线 以下 在性幻想 性需求的表达等方面 男女之间的抉择
  • 云杰恒指:7.29恒指期货实盘指导交易复盘

    对于一个成熟交易者来说 盈利是市场给的 没有属于我们的行情 我们坚持不会开仓 看不懂的行情不开仓 直到交易信号出现 然后精准出击 获得属于我们自己的利润 曾有人对技术分析过度依赖 在一次爆仓后找到我 我给出的答案是技术分析本来就是一会准一会
  • 一致性 Hash 算法(分布式或均衡算法)

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