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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • IntelliJ IDEA集成svn

    IntelliJ IDEA集成svnEclipse集成svn相信大家已经非常熟悉了,但是IntelliJIDEA如何集成svn呢?下面简单介绍一下(其他的版本控制工具的集成类似):1.首先配置下载并配置svn软件,推荐使用SlikSvn。2.在IntelliJIDEA集成svn,选择Subversion。3.配置完成之后就可以从svn服务器上checkout代码。4.修改代码之后,在该文件或

    2022年10月18日
    2
  • drone无人机操作教程_无人机怎么起飞教程

    drone无人机操作教程_无人机怎么起飞教程教程:使用DroneKit在室内控制无人机DroneKit-Python是一个用于控制无人机的Python库。DroneKit提供了用于控制无人机的API,其代码独立于飞控,单独运行在机载电脑(CompanionComputer)或其他设备之上,通过串口或无线的方式经MAVLink协议与飞控板通信。除了DroneKit-Python以外,还有DroneKit-Android以及DroneKit-C

    2022年8月15日
    58
  • sqrt mysql_MySQL中的SQRT函数的使用方法「建议收藏」

    sqrt mysql_MySQL中的SQRT函数的使用方法「建议收藏」推荐:MySQL中的SUM函数使用教程这篇文章主要介绍了MySQL中的SUM函数使用教程,是MySQL入门学习中的基础知识,需要的朋友可以参考下MySQL的SUM函数是用来找出记录中各种的字段的总和。要了解SUM函数考虑EMPLOYEE_TBL表具有以下记录:?现在,假设根据上面的表想来计算所有的dialy_typing_pages的总数这篇文章主要介绍了详解MySQL中的SQRT函数的使…

    2022年5月27日
    34
  • linux(6)查看进程ps命令「建议收藏」

    linux(6)查看进程ps命令「建议收藏」ps命令Linuxps(英文全拼:processstatus)命令用于显示当前进程的状态,类似于windows的任务管理器查看所有进程ps-A显示所有进程信息,连同命令行ps-

    2022年7月28日
    3
  • 一步一步写算法(之排序二叉树)[通俗易懂]

    一步一步写算法(之排序二叉树)[通俗易懂]【声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing@163.com】   前面我们讲过双向链表的数据结构。每一个循环节点有两个指针,一个指向前面一个节点,一个指向后继节点,这样所有的节点像一颗颗珍珠一样被一根线穿在了一起。然而今天

    2022年7月25日
    12
  • python京东自动签到领金豆_docker 京东自动签到

    python京东自动签到领金豆_docker 京东自动签到项目紧张的忙完了,早上签到时突然想到自动签到~~’人生苦短,我用python’网上看了下,很简单。对于小白来说,主要难度是环境的搭建。主要用到:1selenium模拟浏览器2chromedriver(chrome驱动)上面网友已经实现飞猪京东签到,依葫芦画瓢嘛,实现了苏宁易购的签到。备注:只是很简单签到代码,没有登录的滑动签到的校验码(第一次登录签到)参照上面的,自己实现了苏宁易购的…

    2022年9月18日
    2

发表回复

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

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