分布式寻址算法

分布式寻址算法_第1张图片

Hash

  亦称作散列或杂凑

  一种压缩映射

    散列值的空间通常远小于输入的空间

    不同的输入可能会散列成相同的输出

        碰撞

                无法从散列值来确定唯一的输入

  场景

    文件校验

        数字指纹 md5 命令可校验文件的完整性(并不意味着未被篡改)

    数字签名

    分布式寻址

  算法

    MD5

    SHA家族

普通 hash寻址

  shard = hash(id_or_key) % number_of_primary_shards

  适合

    分区或节点数量固定(取模右边的数固定)

  不足

    增减节点须搬大量数据(n1/n2, n1为扩容前的节点,n2 为扩容后的节点)(又称缓存重建,重新生成缓存数据)

一致性hash  

    将 node进行 hash,这能确定每个节点在哈希环上的位置

    对待保存的 key,首先计算 hash 值,并确定此数据在环上的位置, 从此位置沿环顺时针“行走”,遇到的第一个 node节点就是 key 所在位置

    一致性

        新加节点对已有节点的影响一致

  初衷

    分布式若不支持动态扩缩容,分布式=鸡肋

    解决普通 hash 算法 动态扩缩容问题而诞生的

  适合

    需动态扩缩容

        可减少需搬迁的数据量(1/n, n为扩缩容前的分区或节点数)

  不足

    一致性哈希算法在节点太少时, 容易因为节点分布不均匀而造成缓存热点的问题

        虚拟节点

                即对每一个节点计算多个 hash, 每个计算结果位置都放置一个虚拟节点(如 IP+后缀)

        增加一个节点,只会减轻下游紧挨着节点的压力, 并不会分担其他节点的压力

hash slot

  在寻址和节点间加了一层映射关系(slot)

  节点动态变化只需要改变hash slot => 节点的映射

    只需要迁移指定slot到新添加的节点即可

        迁移数据量变小

  相对一致性hash也使得负载均衡效果更加明显

    数据和 hash slot 绑定的,而非节点

    若其中一个节点挂了,有将近 2/3的数据不受影响

        普通 hash算法中,若一个节点挂了, 几乎所有数据都会受影响(取模对象变成 2 了)

你可能感兴趣的:(分布式寻址算法)