DHT和一致性哈希算法总结

DHT和一致性哈希算法总结 Hash算法比较重要的考量点有两个:1.单调性(新增或者减少映射节点时,尽量不影响原有映射关系)2.平衡性(尽量均匀分布) 分布式领域常见负载均衡算法:(1)取余法:%n如果有3个节点,Hash之后取模求余 Hash(x)%3,如果加一个节点,则Hash(x)%4。 这种方法带来的问题:1一个cache服务器mdown掉了(在实际应用中必…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

 

Hash算法比较重要的考量点有两个:

1.单调性(新增或者减少映射节点时,尽量不影响原有映射关系) 2.平衡性(尽量均匀分布)

 

分布式领域常见负载均衡算法:

(1)取余法:%n

如果有3个节点,Hash之后取模求余  Hash(x)%3,

如果加一个节点,则 Hash(x)%4。

 

这种方法带来的问题:

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 都失效了。对于服务器而言,这是一场灾难,洪水般的访问都会直接冲向后台服务器; 再来考虑第三个问题,由于硬件能力越来越强,你可能想让后面添加的节点多做点活,显然上面的 hash 算法也做不到。 有什么方法可以改变这个状况呢,这就是 consistent hashing…

 解释下为什么cache会失效:

  假如有6个数据分别是1,2,3,4,5,6,有3台机器,用取余算法%3。设定余数为0对应的是第一台机器,余数为1对应的是第二台机器,余数为2对应的是第三台机器。那么数据3和6存储在第一台机器,1和4存储在第二台机器,2和5存储在第三台机器。如果这时候增加一台机器变成4台,用取余算法%4实现,映射到某台机器的规则和之前的类似,那么数据4存储在第一台机器,数据1和5存储在第二台机器,数据2和6存储在第三台机器,数据3存储在第4台机器。

  原来3台机器: M1:(3,6) M2: (1,4)  M3: (2,5)

  变成4台机器:M1: (4) M2: (1,5) M3: (2,6) M4: (3) 

   可以看到1,2,3,4台机器的数据都将会有变化。

而如果采用一致性hash算法,则能减少数据变化的机器。

 

(2)一致性hash算法

  实现步骤:

第一步:采用一种hash算法,把服务器地址或者主机名映射到一个2的32次方的环上。为什么是2的32次方?IPv4的ip地址占4个字节,可以存储2的32次方比特位信息。

第二步:把要存储的key采用同样的hash算法映射到环上,如果命中某个服务器地址则存在该台服务器,如果在服务器1和服务器2的地址的中间,则按从小到大去搜索,找到的第一个服务器,就映射到该台服务器上。

好处:增加和减少节点时,只影响附近的一个节点,不会像取余法一样影响全部节点的数据。

 

改进:

另外,一致性哈希算法在服务节点太少时,容易因为节点分部不均匀而造成数据倾斜问题。例如系统中只有两台服务器,可能大量的数据都存在一台服务器,另一台服务器只存储了很少的数据。为了解决这种情况,可以增加虚拟环。

DHT和一致性哈希算法总结

为了解决这种数据倾斜问题,一致性哈希算法引入了虚拟节点机制,即对每一个服务节点计算多个哈希,注意,这里的多个哈希算法应该使得结果尽量分布均匀,才能最大程度减少数据倾斜的情况。每个计算结果位置都放置一个此服务节点,称为虚拟节点。具体做法可以在服务器ip或主机名的后面增加编号来实现。例如上面的情况,可以为每台服务器计算三个虚拟节点,于是可以分别计算 “Node A#1”、“Node A#2”、“Node A#3”、“Node B#1”、“Node B#2”、“Node B#3”的哈希值。同时数据定位算法不变,只是多了一步虚拟节点到实际节点的映射,例如定位到“Node A#1”、“Node A#2”、“Node A#3”三个虚拟节点的数据均定位到Node A上。这样就解决了服务节点少时数据倾斜的问题。在实际应用中,通常将虚拟节点数设置为32甚至更大,因此即使很少的服务节点也能做到相对均匀的数据分布。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/164579.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Qt 之图形(QPainter 的基本绘图)「建议收藏」

    Qt 之图形(QPainter 的基本绘图)「建议收藏」Qt中提供了强大的2D绘图系统,可以使用相同的API在屏幕和绘图设备上进行绘制,它主要基于QPainter、QPaintDevice和QPaintEngine这三个类。-QPainter用于执行绘图操作,其提供的API在GUI或QImage、QOpenGLPaintDevice、QWidget和QPaintDevice显示图形(线、形状、渐变等)、文本和图像。

    2025年8月2日
    0
  • stl merge函数使用

    stl merge函数使用merge函数的作用是:将两个已经排好序的序列合并为一个有序的序列。函数参数:merge(first1,last1,first2,last2,result,compare);firs1t为第一个容器的首迭代器,last1为第一个容器的末迭代器;first2为第二个容器的首迭代器,last2为容器的末迭代器;result为存放结果的容器,comapre为比较函数(可略写,默认为合并为…

    2022年6月8日
    40
  • polkit启动失败_zabbix4.4 启动失败分析

    polkit启动失败_zabbix4.4 启动失败分析zabbix是基于WEB界面提供分布式系统监视以及网络监视功能的企业级开源解决方案,能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。做为开源用户的支持者,我们大部分环境用的软件包含监控软件、数据库、继承应用、操作系统等都是用开源的,例如centos、PG、zabbix、openshift等,但是开源的在成熟度上是不错,但是安装软件有时比…

    2022年6月22日
    22
  • HBASE的MAPREDUCE任务运行异常解决办法,无需CYGWIN,纯WINDOWS环境

    HBASE的MAPREDUCE任务运行异常解决办法,无需CYGWIN,纯WINDOWS环境

    2021年8月22日
    66
  • MATLAB语音信号处理系统GUI

    MATLAB语音信号处理系统GUI基于MATLAB的语音信号处理【摘 要】Matlab语音信号处理是指利用matlab软件对音频信号进行读取,并对音频信号进行采样分析及离散傅里叶变换,以方便对其在频域上进行调制滤波等相关的操作。本次实验在提取音频信号后会对该信号使用在MATLAB软件中设计的滤波器进行滤波,并观察其效果,验证滤波器是否可行。本次使用了MATLAB软件,综合运用GUI界面设计、各种函数调用等来实现音频信号的傅里叶变…

    2022年5月25日
    91
  • merging dua II audio interface_power of one

    merging dua II audio interface_power of one题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=6623MinimalPowerofPrimeTimeLimit:2000/1000MS(Java/Others)MemoryLimit:65536/65536K(Java/Others)TotalSubmission(s):1935AcceptedSub…

    2022年9月16日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号