zoukankan      html  css  js  c++  java
  • 一致性哈希算法

    数据均衡分布技术是分布式存储系统技术中的一个重要分支,按照一定的策略将数据尽可能均匀分布到所有的存储节点上去,使得系统具有良好的负载均衡性和扩展性,高性能的数据均衡技术对于分布式存储系统而而言意义重大。

    简单的哈希算法

    哈希计算是常见的数据分布技术,其通过求模运算来计算哈希值,然后据此将数据映射到存储空间中。
    假设有N个存储节点组成的存储空间,采用简单哈希计算将一个数据对象object映射到存储空间上的公式为:hash(object)%N

    简单哈希计算不足

    1. 增删节点时,更新效率低。当系统中存储节点数量发生增加或减少时,映射公式将发生变化为hash(object)%(N+/-1),这将使得所有object的映射位置发生变化,整个系统数据对象的映射位置都需要重新进行计算,系统无法对外界进行正常响应,将导致系统处于崩溃状态.

    2. 平衡性差,未考虑节点性能差异。由于硬件性能的提升,新添加的节点具有更好的承载能力,如何对算法进行改进,使节点性能可以得到较好的利用,也是亟待解决的一个问题。

    3. 单调性不足。衡量数据分布技术的一项重要指标就是单调性。单调性是指如果已经有一些内容通过哈希计算分派到了相应的缓冲中,当又有新的缓冲加入到系统中时,哈希的结果应能够保证原有已分配的内容可以被映射到新的缓冲中去,而不会被映射到旧的缓冲集合中的其他缓冲区。

    由上述分析可知,简单地采用模运算来计算object的hash值的算法显得过于简单,存在节点冲突,且难以满足单调性要求。

    一致性哈希(consistent hashing)

    一致性哈希算法是当前较主流的分布式哈希表协议之一,它对简单哈希算法进行了修正,解决了热点(hot pot)问题。

    • 首先,对存储节点的哈希值进行计算,其将存储空间抽象成一个环,将存储节点配置到环上。环上所有的节点都有一个值。

    • 其次,对数据进行哈希计算,按照顺时针方向将其映射到离其最近的节点上去。

    当有节点出现故障离线时,按照算法的映射方法,受影响的仅仅为环上故障节点开始逆时针方向至下一个节点之间区间的数据对象,而这些对象本身就是映射到故障节点之上的。当有节点增加时,如,在节点A和B之间重新添加一个节点H,受影响的也仅仅是H逆时针遍历直到B之间的数据对象,将这些重新映射到H上即可,因此,当有节点出现变动时,不会使得整个存储空间上的数据都进行重新映射,解决了简单哈希算法增删节点,重新映射所有数据带来的效率低下的问题。

    一致性哈希算法不足:

    1. 在查询的过程中,查询消息要经过O(n)步(n代表系统内节点总数)才能达到被查询的节点。当系统规模非常大时,这样的查询显然难以满足使用的需求。

    2. 当应用一致性哈希算法的分布式存储系统中添加或者删除新的物理节点时,要将下一个节点与之相关的数据迁移过来,查询命中率和存放效率下降,影响系统的整体性能。

    一致性哈希算法的改进

    一致性哈希算法具有随机性,当节点数量较少时节点在环上分布不够均匀,对于节点可能存在的性能差异也没有考虑,为了解决这个问题,提出了基于虚拟节点的改进算法,其核心思路是引入虚拟节点,每个虚拟节点都有一个对应的物理节点,而每个物理节点可以对应若干个虚拟节点。

    将圆环划分成了M等分,若加入物理节点为N个,则每个物理节点拥有V=M/N个节点数。当有物理节点离线时,由于该节点对应的节点均匀的分布在环上,其附近的节点会均匀地分担这个节点的原有负载,当有新节点加入时,同理,其他节点的负担也将均匀转移到其上。此外依据物理节点的实际性能为权值分配环上的虚拟节点数目给物理节点,也解决了存储节点性能差异的问题。

    为解决数据迁移带来的效率降低问题,可以将新增节点完成的数据迁移分布在每一次的查询任务中去,相当于每一次查询都可以迁移一小部分数据,此外,还可以在系统闲暇时间进行数据迁移,这样可以有效地提高效率。

  • 相关阅读:
    Django-ORM和MySQL事务及三大范式介绍
    django-视图层与模板层
    django初步--+urls解析
    django前戏
    python web开发中跨域问题的解决思路
    MySQL显示ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)解决方法
    xpath
    HTTP请求方法
    JavaScript 对象
    JavaScript 关键字
  • 原文地址:https://www.cnblogs.com/lgfeng/p/5050064.html
Copyright © 2011-2022 走看看