我整天都在尝试用PHP理解和编写Memcache,但是我在某些时候感到困惑。我浏览了许多文章,几乎所有SO问题都与此相关,但找不到确切答案。
1)在PHP中创建一致的哈希密钥的代码是什么?我必须安装哪些库以及我真正需要做什么?有什么好文章要经历吗?
2)假设我已经成功存储了一个一致的哈希密钥,现在,如果我的任何一台服务器宕机或添加了一个新服务器,即使我正在使用一致的哈希密钥等,它也会有所不同吗?
3)将使用了Memcached :: addServers()代替Memcached的:: addServer()作出一致性哈希的情况下,任何差别在规定http://ru.php.net/manual/en/memcached.addserver.php如果那不是什么意思?
$m = new Memcached();
$m->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
$m->addServers($servers);
4)使用以上代码是否足以进行一致性哈希,然后添加/删除服务器对密钥没有任何影响?
5)什么是Ketama图书馆?如果Memcached :: DISTRIBUTION_CONSISTENT可以更好地工作,为什么还要使用它呢?以下http://www.last.fm/user/RJ/journal/2007/04/10/rz_libketama_-__a_consistent_hashing_algo_for_memcache_clients
6)我是否必须以某种方式对密钥进行哈希处理,还是只提供密钥并让Memcached处理其余的密钥?
拜托,我需要您的真正支持,以便尽快在我的生产环境中理解和实施它。您的答案将使我理解应该如何编写更好的代码。
好吧,这些问题太多了,让我尽力一一回答。
1)在PHP中创建一致的哈希密钥的代码是什么?我必须安装哪些库以及我真正需要做什么?有什么好文章要经历吗?
当您对代码提出疑问时,此代码足以实现PHP中的“一致性哈希”。您只需要使用LibMemcached客户端库即可对Memcached使用一致哈希。只需在代码下方添加以下行
$m->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
如果要使用一致的哈希,强烈建议启用此选项,并且在将来的版本中可能默认启用此选项。请按照此说明一堆常量及其定义,以更好地理解http://www.php.net/manual/en/memcached.constants.php
尽管可以通过在php.ini中全局设置来获得更好的性能(我尚未测试)。
memcache.hash_strategy = consistent;
如http://blog.fedecarg.com/2008/12/24/memcached-consistent-hashing-mechanism/中所建议的那样,则无需在每个memcached调用中单独指定。默认值为“标准”,并且使用“模量”计算,如果添加或删除服务器,则无济于事。
2)假设我已经成功存储了一个一致的哈希密钥,现在,如果我的任何一台服务器宕机或添加了一个新服务器,即使我正在使用一致的哈希密钥等,它也会有所不同吗?
尽管正如lsmooth所说,在卸下或添加服务器时总会产生影响,但是如果假设将1台服务器添加到3台服务器中,影响最小,那么它将大约1/4 =丢失密钥的25%,因此丢失密钥的机会越少,服务器越多。
3)将使用了Memcached :: addServers()代替Memcached的:: addServer()作出一致性哈希的情况下,任何差别在规定http://ru.php.net/manual/en/memcached.addserver.php如果那不是什么意思?
正如伊斯莫斯所说。他是正确的。最好使用addServers。请注意,在使用setOption设置所有选项之后,必须调用«addServers()»,否则这些选项将不适用于这些服务器。
4)使用以上代码是否足以进行一致性哈希,然后添加/删除服务器对密钥没有任何影响?
已经在问题1的答案中回答了。
5)什么是Ketama图书馆?如果Memcached :: DISTRIBUTION_CONSISTENT可以更好地工作,为什么还要使用它呢?http://www.last.fm/user/RJ/journal/2007/04/10/rz_libketama_-__a_consistent_hashing_algo_for_memcache_clients
LibKetama是一致性哈希密钥分发算法所基于的库。因此,在Memcached中使用一致性哈希意味着要使用LibKetama,这就是事实。
6)我是否必须以某种方式对密钥进行哈希处理,还是只提供密钥并让Memcached处理其余的密钥?
Yvan表示:“ Memcached客户端将自动对密钥进行哈希处理。假设您有3个服务器,A,B和C,以及3个密钥«K1»至«K9»。例如,客户端哈希算法将存储如下:K1 / K2 / K3存储在A上,/ K4 / K5 / K6存储在B上,K7 / K8 / K9存储在C上。如果服务器B出现故障,其密钥(K4 / K5 / K6)将平均存储在其余2台服务器上( A和C)。例如,K4将转到A,而K5 / K6将转到服务器C。
那只是一个例子,不是真正的算法。您可以使用函数$ memcached-> getServerByKey('K4')找出哪个密钥在哪个服务器上。然后使一台服务器停机,并查看此失败后getServerByKey()向您发送的消息。”,网址为http://www.dugwood.com/895442.html#dwCmtForm。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句