memcached是不支持分布式的,要实现分布式的memcached是需要在客户端那边实现的。就是我运行多个memcached实例,在客户端那边注册多个memcached实例,key->value对具体保存在哪个memcached实例由客户端的哈希算法决定。
对于固定的memcached实例,任何hash函数都可以比较好的定位到固定的memcached实例,但是现实中,memcached实例有可能由于机器崩溃而减少,或者添加memcached实例。对于简单的余数哈希就不能很好的解决这个问题了。
余数哈希和一致性哈希的比较:
假设我们现在有4个memcached实例
余数哈希
一致性哈希
最上面一排是得到key的哈希值,下面两排分别是添加设备前key存放在的机器,添加设备后key存放的数据。
如上图的余数哈希,如果我们添加了一个设备,我们以前哈希值为6的数据是存放在第2台机器上的,现在添加了一台机器之后,要想访问此数据,就得到第1台机器上找。第一台机器却没有存放过这个数据。添加1台机器之后,会造成大部分机器的缓存失效,这是我们不希望的。如果机器越多,添加1台实例影响的机器就越多。
那我们看看一致性哈希,还是上面的例子,原来有4个memcached实例(如左图),添加了1个实例后(如右图)。缓存失效的只有红色圆圈圈的那部分hash(data)。这个哈希方法对于越多的机器,添加一台机器之后影响的机器就越少。
memcached客户端采用一致性哈希的算法来选择使用那个memcached服务器。