我一直在努力用PHP来理解和编写Memcache,但我在几点上感到困惑.我已经阅读了很多文章,几乎所有与此相关的SO问题都找不到确切的答案.
1)在PHP中创建Consistent Hashed Key的代码是什么?我必须安装哪些库以及我真正需要做什么?有什么好文章要经历吗?
2)假设,我已经成功存储了一致的哈希密钥,现在如果我的任何服务器关闭或添加了新的服务器,即使我使用的是一致的哈希密钥等,它会有什么不同吗?
3)如果在http://ru.php.net/manual/en/memcached.addserver.php中说明,使用Memcached :: addServers()而不是Memcached :: addServer()会对Consistent Hashing产生任何影响.那不是什么意思?
$m = new Memcached(); $m->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT); $m->addServers($servers);
4)使用上面的代码是否足以进行Consistent Hashing,然后添加/删除服务器对密钥没有任何影响?
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处理剩下的事情?
请大家,我需要您真正的支持,以便尽快了解并实施我的生产环境.你的答案让我明白我应该为什么编码更好.
PHP的memcached扩展支持Consistent Hashing.除了在代码中使用它之外,您不必执行任何操作,如下所示:
<?php $servers = array( array('memcache1.example.com', 11211), array('memcache2.example.com', 11211) ); $m = new Memcached(); $m->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT); $m->addServers($servers); ?>
然后,当您开始向缓存添加项目时,扩展会自动将它们分发到服务器,以便在您添加服务器时最大限度地减少缓存损失.如果它无法从服务器中检索项目 - 例如服务器已关闭 - 您必须自己在PHP代码中处理它.
使用addServers而不是addServer对Consistent Hashing没有任何影响.如文档中所述,您应该在添加多个服务器时使用addServers,以便内部数据结构仅更新一次.
PHP的Consistent Hashing实现基于 libketama,它根本不需要libketama.扩展程序负责将项目分发给不同的服务器,以便最大限度地减少缓存损失.删除或添加服务器时将始终存在影响.
那些问题一下子让我尽力一个接一个地回答.
1)在PHP中创建Consistent Hashed Key的代码是什么?我必须安装哪些库以及我真正需要做什么?有什么好文章要经历吗?
好吧,当您将代码置于问题时,此代码足以支持PHP中的Consistent Hashing.您只需使用LibMemcached客户端库即可将Memsistent Hashing与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所说,当删除或添加服务器时总是会产生影响,但是假设将3台服务器添加到3台服务器中它将大约1/4 = 25%的密钥丢失,因此许多服务器减少丢失密钥的可能性.
3)如果在http://ru.php.net/manual/en/memcached.addserver.php中说明,使用Memcached :: addServers()而不是Memcached :: addServer()会对Consistent Hashing产生任何影响.那不是什么意思?
正如Ismooth所说.他是对的.最好使用addServers.请注意,必须在使用setOption设置所有选项后调用«addServers()»,否则这些选项将不适用于这些服务器.
4)使用上面的代码是否足以进行Consistent Hashing,然后添加/删除服务器对密钥没有任何影响?
已在问题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是Consistent Hashing密钥分发算法所基于的库.因此,在Memcached中使用Consistent Hashing意味着使用LibKetama,就是这样.
6)我是否必须以某种方式哈希我的密钥或只提供我的密钥并让Memcached处理剩下的事情?
Yvan说:"Memcached客户端将自动哈希你的密钥.假设你有3台服务器,A,B和C以及3个密钥«K1»到«K9».例如,客户端哈希算法将存储如下:K1/K2/K3存储在存储在B上的A,K4/K5/K6上,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.