一致性哈希算法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一致性哈希算法相关的知识,希望对你有一定的参考价值。
一致性哈希要满足以下四性(以多cache节点环境为例):
1. 均衡性(Balance):哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用;
2. 单调性(Monotonicity):如果已经有一些内容通过哈希分派到了相应的缓冲节点中,又有新的缓冲节点加入到系统中,那么哈希的结果应能够保证原有已分配的内容(失效后)可以被映射到新的缓冲节点中去,而不会被(再次)映射到旧的缓冲节点中。在移除或添加一个 cache节点后,不损坏已有内容-节点间的映射关系;
3. 避免分散性(Spread):由于不同终端所见的缓冲范围有可能不同,从而导致哈希的结果不一致,最终的结果是相同的内容被不同的终端映射到不同的缓冲节点中。这种情况显然是应该避免的,因为它导致相同内容被存储到不同缓冲中去,降低了系统存储的效率;
4. 避免负载(Load):既然不同的终端可能将相同的内容映射到不同的缓冲节点中,那么对于一个特定的缓冲节点而言,也可能被不同的终端映射为不同的内容。与分散性一样,这种情况也是应当避免的,因此好的哈希算法应能够尽量降低缓冲的负荷。
一致性哈希路由算法:
1. 内容映射与节点映射:内容和节点都会被映射到同一个hash空间,并分别获得一个与他们唯一对应的ID(key),所以他们的ID(key)处于同一值域,如都属于0000到9999的整数集合。内容可被存储到与其所获得的ID(key)最接近的节点上,例如key为1001的内容,系统中有ID为1000,1010,1100的节点,该内容将被映射到1000节点;
2. 虚拟节点:hash 算法并不是保证绝对的平衡,如果节点较少的话,内容并不能被均匀的映射到各节点上。为了满足平衡性的要求,而在hash空间中增加平衡虚拟节点,即实际节点在 hash 空间的复制品(replica),一实际个节点对应了若干个虚拟节点,这个对应个数也成为复制个数,虚拟节点在 hash 空间中也拥有自己唯一对应的key,凡落在虚拟节点范围的内容将被映射到所属的物理节点;
3. 上下行节点:上行节点指ID值大于当前节点中最小值的节点,下行节点指ID值小于当前节点中最大值的节点。一致性哈希要求每个节点存储其上下行节点信息(如IP);
4. 内容搜索:收到查询请求的节点如果发现自己拥有被请求的目标,可以直接向发起查询请求的节点返回确认;如果没有找到,可以转发请求到自己的上下行节点;
5. 节点退出与加入:在节点退出或加入系统时,相邻的节点必须及时更新路由信息,这就要求节点不仅存储直接相连的上下行节点信息,还要知道一定深度n跳的间接上下行节点信息,并且动态地维护节点列表。
一致性哈希基本解决了在P2P环境中最为关键的问题——如何在动态的网络拓扑中分布存储和路由。每个节点仅需维护少量邻近节点的信息,并且在节点加入/退出系统时,仅有相关的少量节点参与到拓扑的维护中。但是一致性哈希的路由算法尚有不足之处,在查询过程中,查询消息要经过O(N)步(N代表系统内的节点总数)才能到达被查询的节点。不难想象,当系统规模非常大时,节点数量可能超过百万,这样的查询效率显然难以满足使用的需要。
以上是关于一致性哈希算法的主要内容,如果未能解决你的问题,请参考以下文章