`
m635674608
  • 浏览: 5093872 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

使用虚拟节点改进的一致性哈希算法

 
阅读更多

分布式存储中的应用


在分布式存储系统中,将数据分布至多个节点的方式之一是使用哈希算法。假设初始节点数为 N,则传统的对 N 取模的映射方式存在一个问题在于:当节点增删,即 N 值变化时,整个哈希表(Hash Table)需要重新映射,这便意味着大部分数据需要在节点之间移动。

因此现在普遍使用的是被称为一致性哈希(Consistent Hashing)的一类算法。“一致性” 这个定语的意义在于:当增删节点时,只影响到与变动节点相邻的一个或两个节点,散列表的其他部分与原来保持一致。某种程度上可以将其理解为:一致性哈希算法的哈希函数与节点数 N 无关。

其他地方对一致性哈希配图的时候,都会选择一个圆环来解释,但我个人感觉哈希表更加直观:

一致性哈希

上图左右分别表示增加一个 “节点 5” 前后的哈希表,哈希函数使用的是 md5 。md5 会根据 key 的值摘要出一个 128 bit 的哈希值(校验和),一般表示为一个 32 位的 16 进制数。这里我们取哈希值第一位的范围来将 key 映射到不同的节点,可以看到在拆分了 “节点 4” 的 md5 首位范围后,只需要将 “节点 4” 原本数据的约一半移动到 “节点 5” 上去就可以了,其他三个节点并未受到影响。 

负载均衡改进


但这里其实仍有改进的空间。

问题在于,上面需要将 “节点 4” 的一半数据搬运到 “节点 5” 上,这个压力会比较大。以一个节点存有 3TB 的数据、节点间网络为千兆网(但只允许搬运进程使用 25% 负载)来算,搬运完 1.5TB 的数据最少需要 (1.5TB * 1024GB/TB * 1024MB/GB) / (125MB/s * 0.25) ≈ 14h;另一方面,“节点 5” 直接分担走了 “节点 4” 数据的一半,如果原来 4 个节点的负载是均衡的(md5 本身是一个很均匀的哈希函数),那么现在就变得不均衡了。

这两个问题有一个公共的解决方法:新增的 “节点 5” 不只从 “节点 4” 搬运数据,而从所有其他节点(或子集)处搬运数据,同时还要继续保持哈希一致性。

这种想法的一个实现方式就是,使用虚拟节点(virtual nodes)。上面 md5 哈希表实际可以分为两段:

  1. 通过 md5 将 key 哈希出一个 32 位的 16 进制哈希值
  2. 将这个哈希值映射到某个物理节点

当使用虚拟节点时,我们保持第一段不变,但会在第二段将哈希值映射到物理节点的过程中再插入一个虚拟节点中间件,从而将过程变为:

  1. 通过 md5 将 key 哈希出一个 32 位的 16 进制哈希值
  2. 将这个哈希值映射到一个虚拟节点
  3. 将这个虚拟节点映射到一个物理节点

新哈希表的关键之处在于虚拟节点的数量比物理节点数多得多,甚至很多时候会将虚拟节点的数量设置为 “尽可能多”。这样新哈希表的前两段就固定不变了,当增删物理节点时,只是对虚拟节点进行必要的重新分配的过程。

改进的一致性哈希

上图中我们依 md5 值的首位划分了 16 个虚拟节点,然后将它们映射到 4 个物理节点。(实际应用中,即使你当下只有 10 个物理节点,也大可以按 md5 的前三位划分出 4096 个虚拟节点)当我们增加物理 “节点 5” 的时候,就从节点 1、2、3 处各拿一个虚拟节点放到 “节点 5” 中。这个过程,“节点 5” 既可以使用 100% 的网络带宽来接收数据;新的哈希表也实现了负载均衡。当然一致性也得到了保证。

 

这种使用虚拟节点的一致性哈希算法我看到国内有人管它叫分布式一致性哈希(Distributed Consistent Hashing),但这个 “分布式” 叫法显得有些不合适,因为这种改进只涉及到算法的实现而与哈希过程发生的位置无关,并且 google 上也找不到这种叫法。所以一般就称改进的一致性哈希(Improved Consistent Hashing)好了。或者,使用虚拟节点的一致性哈希。

 

http://my.oschina.net/lionets/blog/288066

分享到:
评论

相关推荐

    TensorRT加速的YOLOv5智能监控平台:多线程多任务并行处理,视频监控与录像回放一体化管理

    内容概要:本文详细介绍了如何使用TensorRT加速YOLOv5模型推理,并结合QT框架搭建一个多任务并行处理的智能监控平台。主要内容包括:YOLOv5与TensorRT的融合,通过将YOLOv5模型转换为ONNX格式并进一步转化为TensorRT引擎,从而大幅提升推理速度;QT框架的应用,利用其跨平台特性实现视频监控、录像回放、电子地图等多种功能;16路视频并行检测的具体实现,通过多线程机制和CUDA流的支持,确保系统的高效运行。此外,文章还探讨了模型热更新、网络流处理、日志记录等方面的优化措施。 适合人群:具备一定编程基础,尤其是熟悉C++、Python和深度学习框架的研究人员和技术开发人员。 使用场景及目标:适用于需要高效、智能监控解决方案的企业和个人开发者。主要目标是提高视频监控系统的效率和智能化水平,如安防监控、交通监测等领域。 其他说明:文中提供了大量代码示例,帮助读者更好地理解和应用所介绍的技术。同时强调了系统设计中的性能优化技巧,如内存管理和多线程调度等。

    JiYuTrainer

    反极域和远程机惨的好工具

    基于Matlab GUI界面的电子双缝衍射实验模拟:缝宽、间距、电压与距离的参数设置与电子数目影响研究

    内容概要:本文详细介绍了如何利用MATLAB的GUI界面模拟电子双缝衍射实验。通过创建自定义的GUI界面,用户可以输入缝宽a、双缝间距b、加速电压U、缝屏距离D以及电子数目n等参数,实时观察衍射图样的变化。文中不仅提供了详细的代码实现步骤,还解释了各个参数对衍射图样的具体影响,如缝宽a的变化会影响条纹宽度,加速电压U的变化会影响条纹间距等。此外,文章还讨论了一些特殊情况下(如缝间距过大)的非预期现象及其背后的物理原因。 适合人群:物理学专业学生、教师以及对量子力学感兴趣的科研工作者。 使用场景及目标:①作为教学辅助工具,帮助学生更直观地理解电子双缝衍射实验及其背后的物理原理;②作为一种研究手段,探索不同参数条件下电子双缝衍射的具体表现形式。 其他说明:作者提醒使用者不要将电子数目n设得过高以免造成程序运行缓慢,并指出了一些常见的错误配置可能导致的异常情况。同时,提供了一个GitHub链接供有兴趣的读者进一步探讨和改进。

    实训商业源码-qui-pure.v2.5-毕业设计.zip

    实训商业源码-qui-pure.v2.5-毕业设计.zip

    scratch少儿编程逻辑思维游戏源码-有弹性的…猫.zip

    scratch少儿编程逻辑思维游戏源码-有弹性的…猫.zip

    汇川H3U标准程序:三轴伺服定位与总线控制,模块分明,清晰案例示范,包含多种定位与点动操作

    内容概要:本文详细介绍了汇川H3U系列可编程控制器在多轴伺服定位控制方面的应用案例。文章分为三个主要部分:一是本体脉冲控制的三轴伺服定位,展示了通过梯形图实现脉冲输出控制轴运动的方法;二是总线控制的16轴汇川伺服定位,利用结构体数组管理和初始化多个轴的数据,实现了高效的总线通信;三是具体的功能实现,包括轴点动、回零、相对定位与绝对定位等功能的代码示例及其工作原理。此外,文中强调了模块化设计的重要性,通过合理的分层架构提高了系统的灵活性和稳定性。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对伺服控制系统感兴趣的初学者和有一定经验的研发人员。 使用场景及目标:适用于需要理解和掌握多轴伺服定位控制原理的实际工程项目中,旨在帮助读者深入理解汇川H3U控制器的工作机制,掌握具体的编程技巧,以便更好地应用于实际生产环境。 其他说明:文章不仅提供了详细的代码示例,还分享了许多宝贵的实践经验,如状态机的应用、异常处理机制等,这些都是提高程序可靠性的关键因素。

    【数字电路设计】二进制比较器原理与实现:基于74LS85芯片的多位数值比较系统构建及位数扩展方法探讨

    内容概要:本文详细介绍了二进制比较器的设计原理与实现方法。文章首先讲解了二进制比较器的基本概念,包括32位数字比较器的原理图绘制方法。文中提到可以使用二进制比较芯片(如74LS85)组合实现大于、等于、小于的功能,其中不等是通过大于和小于的或逻辑并归实现,大于则是芯片固有的功能,小于等于则是等于和小于的或逻辑并归。对于门电路合成,文章提到了使用74LS04D+08+86等元件组成一位二进制比较器,但指出位数增加会使逻辑变得复杂,不推荐自行合成。此外,还介绍了2位二进制比较器的工作原理,当高位不同时无需比较低位,只有当高位相同时才需要比较低位。最后,文章讨论了集成数值比较器74LS85的功能及其位数扩展方式,包括串联和并联两种扩展方法。 适合人群:具有一定的数字电路基础,对二进制比较器感兴趣的电子工程学生或工程师。 使用场景及目标:①理解二进制比较器的基本原理和工作方式;②掌握二进制比较器的硬件实现方法,特别是如何利用现有芯片构建多位比较器;③学习如何通过逻辑门电路实现简单的二进制比较功能。 阅读建议:读者在学习过程中应结合实际电路图和逻辑表达式进行理解和验证,特别是对于不同位数的二进制比较器,可以通过实际搭建电路来加深理解。

    实训商业源码-昂图文10.2.20 公众号版-毕业设计.zip

    实训商业源码-昂图文10.2.20 公众号版-毕业设计.zip

    【SAR图像变化检测】多阶多水平连接异质图SAR图像变化检测【含Matlab源码 4669期】.md

    【实用脚本工具】相关内容与技巧的【VIP资源】,包

    scratch少儿编程逻辑思维游戏源码-宇宙幽灵 Boss 之战.zip

    scratch少儿编程逻辑思维游戏源码-宇宙幽灵 Boss 之战.zip

    基于S7-200 PLC与组态王技术的机械手搬运控制系统详解:梯形图程序、接线图与组态画面全解析

    内容概要:本文详细介绍了基于西门子S7-200 PLC和组态王的机械手搬运控制系统的实现方案。首先,文章展示了梯形图程序的关键逻辑,如急停连锁保护、水平移动互锁以及定时器的应用。接着,详细解释了IO分配的具体配置,包括数字输入、数字输出和模拟量接口的功能划分。此外,还讨论了接线图的设计注意事项,强调了电磁阀供电和继电器隔离的重要性。组态王的画面设计部分涵盖了三层画面结构(总览页、参数页、调试页)及其动画脚本的编写。最后,分享了调试过程中遇到的问题及解决方案,如传感器抖动、输出互锁设计等。 适合人群:从事自动化控制领域的工程师和技术人员,尤其是对PLC编程和组态软件有一定基础的读者。 使用场景及目标:适用于自动化生产线中机械手搬运控制系统的开发与调试。目标是帮助读者掌握从硬件接线到软件逻辑的完整实现过程,提高系统的稳定性和可靠性。 其他说明:文中提供了大量实践经验,包括常见的错误和解决方案,有助于读者在实际工作中少走弯路。

    MATLAB声发射波形分析:计算基本与特征参数并绘制单边振幅谱

    内容概要:本文详细介绍了如何使用MATLAB对声发射波形进行参数计算和单边振幅谱绘制。主要内容涵盖声发射波形的基本参数(如峰值振幅、上升时间和持续时间)、特征参数(如均方根振幅和能量)的计算方法,以及通过快速傅里叶变换(FFT)绘制单边振幅谱的具体步骤。文中提供了详细的MATLAB代码示例,帮助读者理解和实现这些操作。 适合人群:从事材料科学、无损检测等相关领域的研究人员和技术人员,尤其是有一定MATLAB基础的用户。 使用场景及目标:适用于需要对声发射信号进行深入分析的研究项目,旨在提高对声发射事件的理解和诊断能力。具体应用场景包括但不限于材料疲劳测试、结构健康监测等。 其他说明:文中还提到了一些实用技巧,如处理复数信号、使用窗函数减少频谱泄漏、去除直流分量等,有助于提升数据分析的准确性。此外,建议将整个分析流程封装成函数以便于重复使用。

    scratch少儿编程逻辑思维游戏源码-寻觅故事者.zip

    scratch少儿编程逻辑思维游戏源码-寻觅故事者.zip

    scratch少儿编程逻辑思维游戏源码-希望奔跑.zip

    scratch少儿编程逻辑思维游戏源码-希望奔跑.zip

    三相交流调压技术:探究触发角变化与带中性线桥式半控整流电路仿真中的波形差异

    内容概要:本文深入探讨了单相和三相交流调压技术,详细介绍了这两种技术的工作原理、应用场景以及波形变化规律。首先,文章解释了单相交流调压的基本概念,即通过对单一相位的交流电进行触发角调整来实现电压调节。接着,重点讨论了三相交流调压的特点,特别是在带有中性线的情况下,它能提供更稳定的参考点并支持复杂的工业应用。此外,文中还涉及了桥式半控整流电路的仿真实验,展示了不同触发角和负载条件下的波形变化情况。最后,文章展望了未来交流调压技术面临的挑战和发展机遇。 适合人群:从事电力电子相关行业的技术人员、研究人员及高校师生。 使用场景及目标:帮助读者深入了解单相和三相交流调压技术的具体实现方式,掌握波形变化规律,提升实际操作能力。 其他说明:文章结合理论与实践,既包含了基础知识介绍又涵盖了最新的研究成果和技术趋势。

    实训商业源码-【超人】商家联盟 3.2.2-毕业设计.zip

    实训商业源码-【超人】商家联盟 3.2.2-毕业设计.zip

    (Go)golang语言,window系统下安装go1.23.8语言包安装包

    Go语言,通常被称为Golang,是由Google开发的一种静态类型的、编译式的、并发型且具有垃圾回收功能的编程语言。它的设计目标是提高开发者的生产力和程序的运行效率,特别适合构建网络服务和分布式系统。在Windows操作系统下,安装Golang开发环境需要下载相应的安装包。这里提供的"Go开发工具,golang IDE安装包,windows系统下"包含了Golang的集成开发环境(IDE)——Goland以及相关的使用说明。 Goland是一款由JetBrains公司推出的专门针对Go语言的高效开发工具,它为Go开发者提供了强大的代码补全、调试、重构和代码审查等功能。Goland-2018.3.exe是该IDE的一个特定版本,可能包含了2018年第三季度的一些更新和改进,用户可以通过执行这个可执行文件来安装Goland。 在安装过程中,用户通常需要选择安装路径,确认是否添加到PATH环境变量,以便在命令行中直接使用go命令。安装完成后,Goland会自动检测并配置Go的编译环境,包括设置GOROOT(Go语言的安装目录)和GOPATH(工作区路径),这对于新手来说是非常方便的。 同时,压缩包中的"golang说明.txt"文件很可能是对如何使用Golang进行开发,以及如何操作Goland IDE的基本指导。这份文件可能涵盖了如何创建新项目、设置Go环境变量、使用内置的包管理器go mod、运行和调试程序等内容。对于初学者来说,这是理解并快速上手Go语言开发的重要参考资料。 在使用Golang进行开发时,有几个关键概念是需要了解的: 1. **GOPATH**:在早期版本中,GOPATH是存放项目源码、编译后的对象文件和第三方包的地方。从Go 1.11版本开始,引入了go modules,但理解GOPATH仍然有助于理解Go的工作方式。 2. **Go Mod

    scratch少儿编程逻辑思维游戏源码-西利斯通城堡.zip

    scratch少儿编程逻辑思维游戏源码-西利斯通城堡.zip

    西门子PLC1200博途V16程序详解:制药厂生物发酵系统工艺案例——涉及报警、模拟量处理、温度PID及数字量控制等自动化技术 注:电气控制原理图辅助参考,博图版本需V15.1及以上打开。

    内容概要:本文详细介绍了西门子PLC1200博途V16在制药厂生物发酵系统中的应用,涵盖硬件组态、报警功能、模拟量标定、温度PID控制以及称重仪表USS通讯等方面。硬件方面,采用ET200SP模块进行分布式I/O控制,称重仪表通过USS协议与PLC通信。软件方面,通过OB组织块、自定义数据块和函数块实现报警管理、模拟量处理、PID控制等功能。文中还提供了具体的代码示例,展示了如何处理报警、标定模拟量、实现PID控制和USS通讯。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对西门子PLC编程有一定基础的人群。 使用场景及目标:适用于制药厂生物发酵系统的自动化控制项目,帮助工程师理解和掌握PLC编程技巧,提高系统的稳定性和可靠性。具体应用场景包括但不限于:报警管理、模拟量处理、温度控制和称重仪表通讯等。 其他说明:本文不仅提供了详细的代码示例,还分享了许多实际工程中的经验和技巧,如PID参数调整、USS通讯调试、硬件组态注意事项等。对于初学者来说,这是一个很好的学习资料,能够帮助他们在实践中快速成长。

    【车道线检测】Hough变换和消失点车道线检测(判断左转 直行)【含Matlab源码 4084期】.md

    硬件开发教程&案例&相关项目资源,奖励仅限VIP资源

Global site tag (gtag.js) - Google Analytics