了解更多Greenplum相关内容,欢迎访问Greenplum中文社区网站
一致性哈希(consistent hashing)是分布式系统中非常重要的算法,在平滑扩缩容、动态负载均衡等方向有大量应用。相对于传统的线性(取模)哈希算法,一致性哈希可以保证在分布式哈希表中的桶数量发生变化时,受到影响需要重新映射的key尽量少。本文先简要复习下经典的割环一致性哈希方案,然后介绍它的变种——跳跃一致性哈希(jump consistent hash)。
割环一致性哈希
一致性哈希的概念最初在1997年由David Karger等大佬提出,原始论文见Consistent Hashing and Random Trees: Distributed Caching Protocols for Relieving Hot Spots on the World Wide Web,起初是为了解决网络中的热点问题,后来发展成分布式系统中通用的算法。为了与此后出现的其他一致性哈希算法相区别,一般将这个经典方法称为“割环法”。该算法能够满足论文中提出的两大目标,即平衡性(balance)和单调性(monotonicity)。
顾名思义,割环法将整个哈希空间组织成一个首尾相接的圆环,一般设为[1,2^32-1]。以分布式K-V存储为例,哈希桶即为存储节点。将节点N的编号或IP等按哈希函数hash(N)映射在环上,再将数据的key按同样的哈希函数hash(k)映射在环上,数据就会存储在环上以顺时针方向遍历找到的第一个节点。当节点扩容或缩容时,仍然按照顺时针原则,将受到影响的区间内的数据重新分布到相邻的节点上去,达到增量更新的目的,即满足单调性。以下3张图能够简单地说明。
虽然哈希函数的结果是均匀的,但节点映射在环上可能不均匀,节点数越少,数据倾斜的可能性就越大。解决此问题的方法是将物理节点虚拟成多个影子节点,数据经过哈希后按顺时针原则落到影子节点指向的物理节点上。如果我们想要人为干预各节点上数据量的权重,还可以指定不同的影子节点数量。如下图所示