ketama一致性哈希
哈希算法是一种从任何一种数据中创建小的数字“指纹”的方法,解决如何将数据映射到固定槽问题。而一致性哈希算法是为了解决当槽数目变化的时候如何将映射结果的变化降到最小。那么为什么要将变化降到最小呢?可以考虑分布式缓存的场景,一个key对应一台server,如果一台server挂掉或者需要扩展一台新server,那么传统的哈希就会使原先的映射关系全部失效,而一致性哈希就是为了将影响降至最低,从而缓存没必要全部失效。
一致性hash算法 - consistent hashing图文并茂的描述了一致性哈希算法的出发点及解决方案,主要是使传统的哈希算法同时满足单调性和平衡性。
- 单调性是指当新加槽位后,key还是映射到原先的槽或是新加的槽,这样就将影响范围缩小到一个槽位。
- 平衡性是指尽可能平衡的分布到所有槽位中去。
Kentama
kentama是一致性哈希的一种实现,主要思想如下:
- 将server和key同时映射到环形连续统(0~2^32)
- 为了将key->server,找到第一个比key的映射值大的server的映射值,则key就映射到这台server上,如果没找到,则映射至第一台server
- 为了平衡性,可以添加一层虚拟节点到物理节点的映射,将key首先映射到虚拟节点,然后再映射到物理节点
其中的策略就是将哈希空间固定并分段,段分割点就是新的映射值,将映射到段中间的所有key都映射到段分割点。这样段分割点如果失效,那么只影响映射到该段分割点的key,而不影响其他key,添加段分割点是同样的逻辑。
memcache的client就是通过一致性哈希进行server的选择的,下面介绍一下其源码的实现,代码摘自xmemcached