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 了)