一致性hash

什么是一致性hash?

维基定义:一致哈希是一种特殊的哈希算法。在使用一致哈希算法后,哈希表槽位数(大小)的改变平均只需要对 K/n个关键字重新映射,其中K是关键字的数量, n是槽位数量。然而在传统的哈希表中,添加或删除一个槽位的几乎需要对所有关键字进行重新映射。

从定义里可以看出consistent hashing的作用和优势在于和传统hash相比添加和删除节点造成的系统震荡也就是hash定位尽量少的移动。因此适用于对分布式服务的请求进行分发,尽量保证同一个来源的请求被命中到同一个后台服务上。

一致性hash原理

1将每个节点(node)映射到数值空间 [0, 2^32 - 1],映射的规则可为 IP、hostname 等。

2将每个 object 映射到数值空间 [0, 2^32 - 1]。

3对于某个 object,对于所有满足 hash(node) <= hash(object) 的节点,选择 hash(node) 最大的节点存放 object。如果没有满足上述条件的节点,选择 hash(node) 最小的节点存放该 object.如图(图片来自网络)

这样一个节点宕机的话只有这一个节点部分的object需要重新分配。同样新增一个节点时也只影响一个节点部分的object。

一致性hash_第1张图片

虚节点与平衡性

由于节点的位置是由hash决定的,因此他们的分布并不均匀,特别是节点数较少时会造成object分配很不均匀,这种情况就是平衡性低。为了缓解这种情况引入虚节点的概念。虚节点实际上是物理节点的复制品,一个物理节点包含多个虚拟节点,将虚拟节点映射到hash空间,在根据虚拟节点映射到物理节点。虚拟节点的数目越多其位置分布也就越均匀,相应的对应的object被分配到的物理节点也就越平衡。如图表示两个物理节点分别有三个虚拟节点的分布情况(图片来自网络)

一致性hash_第2张图片

你可能感兴趣的:(一致性hash)