使用虚拟节点改进的一致性哈希算法
##分布式存储中的应用 在分布式存储系统中,将数据分布至多个节点的方式之一是使用哈希算法。假设初始节点数为 N,则传统的对 N 取模的映射方式存在一个问题在于:当节点增删,即 N 值变化时,整个 哈希表 (Hash Table)需要重新映射,这便意味着大部分数据需要在节点之间移动。 因此现在普遍使用的是被称为 一致性哈希 (Consistent Hashing)的一类算法。“一致性” 这个定语的意义在于:当增删节点时,只影响到与变动节点相邻的一个或两个节点,散列表的其他部分与原来保持 一致 。某种程度上可以将其理解为:一致性哈希算法的哈希函数与节点数 N 无关。 其他地方对一致性哈希配图的时候,都会选择一个圆环来解释,但我个人感觉哈希表更加直观: 上图左右分别表示增加一个 “节点 5” 前后的哈希表,哈希函数使用的是 md5 。md5 会根据 key 的值摘要出一个 128 bit 的哈希值(校验和),一般表示为一个 32 位的 16 进制数。这里我们取哈希值第一位的范围来将 key 映射到不同的节点,可以看到在拆分了 “节点 4” 的 md5 首位范围后,只需要将 “节点 4” 原本数据的约一半移动到 “节点 5” 上去就可以了,其他三个节点并未受到影响。 <br /> ##负载均衡改进 但这里其实仍有改进的空间。 问题在于,上面需要将 “节点 4” 的一半数据搬运到 “节点 5