一致性哈希算法

解决的问题

当数据过多时, 可以对数据进行水平拆分, 比如有4个Cache cache0, cache1, cache2, cache3部署在不同的node上, 我们可以根据数据的特征(比如id)进行hash, 来使数据品均分配在4个cache上.
然鹅, 当我们想增加或减少一个node时候, 问题就来了, rehash 需要大量的时间, 这段时间内会导致数据无法被找到.
一致性Hash就是为了解决这个问题

基本概念

可以想像一致性Hash 为一个换, 坐标为 0 到 2^32 -1, 从 0 到 2^32 -1 为顺时针, 而我们的节点就分布在这个环上(根据IP 或其他信息 进行Hash), 当查询数据时, 会先进性Hash, 认定改数据位于顺指针方向上找到的第一个节点. 比如一个环为 A -> B -> C -> D -> A, 其中数据T hash 位于A B 之间, 则会在B上寻找数据T

这样, 当B 挂了的时候, 影响的只有 A->C, 而B->C, C->D, D->A不收影响, 同样的, 如果我们想在 D -> A 之间加一个Node, 那么影响的只有D-> A, 而另外三个分段不收影响.

一致性Hash可能会造成数据不均匀的问题, 比如当节点很少的时候, 假定只有 A B 两个节点,
A->B->A, 那么 当 A -> B 范围较小的时候, 有可能大量数据分散在 B -> A, 所以有虚拟节点的概念, A1->B1->A2->B2->A3->B3->A4->B4->A1, 这样A1, A2, A3, A4会被定为到A

节点的添加与删除

在D->A中添加 E 时 变为 D->E->A, 则需要对A进行rehash, 将D到E的部分复制到E
若删除E,则需要将E中的数据拷贝给A

你可能感兴趣的:(一致性哈希算法)