分布式概念:一致性哈希

存储方案选型时,通常会考虑这三个维度
数据均匀:

(1)不同存储节点中存储的数据要尽量均衡,避免让某一个或某几个节点存储压力过大,而其他节点却几乎没什么数据。
(2)用户访问也要做到均衡,避免出现某一个或某几个节点的访问量很大,但其他节点却无人问津的情况。
数据稳定:
当存储节点出现故障需要移除或者扩增时,数据按照分布规则得到的结果应该尽量保持稳定,不要出现大范围的数据迁移。
节点异构性:
根据不同存储节点的硬件配置,分配不同权重比例的数据量。

一个好的数据分布算法,应该为每个数据映射一组存储节点,这些节点应该尽量在不同的故障域,比如不同机房、不同机架等。


哈希是指,将数据按照提前规定好的函数(哈希函数)映射到相应的存储节点。
一致性哈希同样是采用哈希函数,进行两步哈希:(1)对存储节点进行哈希计算,也就是对存储节点做哈希映射;(2)当对数据进行存储或访问时,首先对数据进行映射得到一个结果,然后找到比该结果大的第一个存储节点,就是该数据应该存储的地方。

哈希

优点:只要哈希函数设置得当,可以很好地保证数据均匀性缺点:稳定性较差。如,随着数据量的增加,三个节点的容量无法再满足存储需求了,需要再添加一个节点。这时,哈希函数变成了 id%4,原先存储在那三个节点的数据需要重新计算,然后存入相应节点,即需要大规模的数据迁移,显然会降低稳定性。

一致性哈希

存储节点和数据都映射到一个首尾相连的哈希环上,存储节点可以根据 IP 地址进行哈希数据通常通过顺时针方向寻找的方式,来确定自己所属的存储节点,即从数据映射在环上的位置开始,顺时针方向找到的第一个存储节点。

示例1:

假设D0~D7 数据按照 ID 进行等值映射,即映射值与 ID 值相等,比如数据 D0 映射到哈希环上的值为 100,数据 D1 映射到哈希环上的值为 200······;
假设存储节点 Node1、Node2 和 Node3 映射到哈希环上的值分别为 400、600、900。
按照规则,D0,D1,D2 和 D3 顺时针方向的下一个存储节点为 Node1,因此 ,
Node1 将存储数据 D0(id = 100)、D1(id = 200)、D2(id = 300)和 D3(id = 400);
Node2 将存取数据 D4(id = 500)和 D5(id = 600),
Node3 将存取数据 D6(id = 700)和D7(id=800)。

当节点加入或退出时,仅影响该节点在哈希环上顺时针相邻的后继节点。
比如,当 Node2 发生故障需要移除时,由于 Node3 是 Node2 顺时针方向的后继节点,本应存储到 Node2 的数据就会存储到 Node3 中,其他节点不会受到影响,因此不会发生大规模的数据迁移。

一致性哈希方法比较适合同类型节点、节点规模会发生变化的场景(Cassandra)。

缺点:即对后继节点的负载会变大。有节点退出后,该节点的后继节点需要承担该节点的所有负载,继续导致后继节点故障。

带有限负载的一致性哈希

给每个存储节点设置了一个存储上限值来控制存储节点添加或移除造成的数据不均匀。当数据按照一致性哈希算法找到相应的存储节点时,要先判断该存储节点是否达到了存储上限;如果已经达到了上限,则需要继续寻找该存储节点顺时针方向之后的节点进行存储。

比较适合同类型节点、节点规模会发生变化的场景(Google Cloud Pub/Sub)。

带虚拟节点的一致性哈希

根据每个节点的性能,为每个节点划分不同数量的虚拟节点,并将这些虚拟节点映射到哈希环中,然后再按照一致性哈希算法进行数据映射和存储。

示例:

(1)机器性能:Node1 性能最差,Node2 性能一般,Node3 性能最好。以 Node1 的性能作为参考基准,Node2 是 Node1 的 2 倍,Node3 是 Node1 的 3 倍。
(2)虚拟节点划分:Node1 对应一个虚拟节点 Node1_1,Node2 对应 2 个虚拟节点 Node2_1 和 Node2_2,Node3 对应 3 个虚拟节点 Node3_1、Node3_2 和 Node3_3。
(3)虚拟节点哈希映射:虚拟节点 Node1_1、Node2_1、Node2_2、Node3_1、Node3_2、Node3_3 的哈希值,分别为 100、200、300、400、500、600。
(4)数据哈希映射:按照带虚拟节点的哈希一致性方法, 数据 D0 和 D6 按顺时针方向的下一个虚拟存储节点为 Node 1-1,因此,
    节点 Node1 将会存储数据 D0(id = 100)和 D6(id = 700);
    节点 Node2 将会存储数据 D1(id = 200)和 D2(id = 300),
    节点 Node3 将会存储数据 D3(id = 400)、D4(id = 500)和 D5(id = 600)。

分布式概念:一致性哈希_第1张图片

带虚拟节点的一致性哈希方法比较适合异构节点、节点规模会发生变化的场景(memcahched)。

优点:解决了节点异构性问题,还提高了系统的稳定性。

缺点:增加了节点规模,从而增加了节点的维护和管理的复杂度。

 

 

 

 

你可能感兴趣的:(分布式)