一致性哈希

对于键值的哈希算法,一般是将得到的哈希值对哈希空间长度取余,即

hash(key) % len; //key为键值,len为哈希空间长度

然后将键值按哈希值存储在数组下标中。

这种哈希处理有个问题,即当哈希空间长度动态变化时,已存储的键值对(key-value)无法再通过键值获得,为了防止这种情况,需要对整个哈希空间的键值对进行rehashing。在分布式系统中,数据经常以跨节点(如主机等)的方式存储。系统的可扩展性要求能够动态地添加或删除(主要是添加)节点,这样造成哈希空间也会随着动态变化,从而造成整个系统内数据的rehashing。

为了解决这个问题,一致性哈希(consistent hashing)提出了不同的哈希处理方式,下面将具体介绍一致性哈希的设计:

  1. 环形哈希空间

    与传统哈希空间不同,在一致性哈希算法中,哈希空间被设计成一个环形空间,空间首尾相连。

  2. 键值对哈希映射

    通过哈希算法将输入的键值对映射到环形哈希空间上去。

  3. 节点哈希映射

    和键值对类似的,将系统内的节点也映射到同一个哈希空间上去(节点的键值可以是节点的IP或者唯一的别名)。

  4. 键值对-节点映射

    通过以上步骤,我们会得到一个环形哈希空间。在这个空间里,键值对和节点交错嵌入其中。接下来,我们把所有的键值对都映射到沿着环形空间顺时针遇到的第一个节点上。

  5. 增添/删除节点

    当需要增添一个新节点A时,我们按步骤3将新节点映射到环形哈希空间上来,然后从这个位置开始,逆时针一直遍历到下个节点B为止,将之间的键值对都映射到新节点A上来。

    需要删除一个节点A时,我们首先找到顺时针的下个节点B,从A的位置开始,逆时针一直遍历到下个节点C为止,将之间的键值对都映射到节点B上来。

在一致性哈希中,当增添或删除一个节点时,只需要部分数据的rehashing,从而大大降低了系统负载。

你可能感兴趣的:(缓存,一致性哈希)