我一直在尝试用PHP来理解和编写Memcache,但我在几点上感到困惑。我已经阅读了很多文章,几乎所有与此相关的SO问题都找不到确切答案。
1)在PHP中创建Consistent Hashed Key的代码是什么?我必须安装哪些库以及我真正需要做什么?要经历的任何好文章吗?
2)假设,我已经成功存储了一致的哈希密钥,现在如果我的任何服务器关闭或添加了新的服务器,即使我使用的是一致的哈希密钥等,它会有什么不同吗?
3)使用Memcached :: addServers()而不是Memcached :: addServer()会对http://ru.php.net/manual/en/memcached.addserver.php中所述的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处理其余部分?
请大家,我需要您真正的支持,以便尽快理解并实施我的生产环境。你的答案让我明白我应该为什么编码更好。
答案 0 :(得分:18)
这些问题一下子让我尽力逐一回答。
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)将使用的Memcached :: addServers()代替Memcached的:: addServer()使在一致的散列的情况下的任何差异,如http://ru.php.net/manual/en/memcached.addserver.php如果没有,那么什么手段吗
正如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处理其余部分?
通过伊凡所述作为“Memcached的客户端将自动散列钥匙。假设有3台服务器,A,B和C和3个键«K1»到«K9»。例如,该客户机散列算法将存储如下:存储在K1 / K2 / K3,K4 / K5 / K6存储在B,存储在C. K7 / K8 / K9如果您的服务器B出现故障,它的键(K4 / K5 / K6)将平均存储在剩余的2台服务器(A和C)上。例如,K4将转到A,K5 / K6将转到服务器C.
这只是一个例子,而不是真正的算法。您可以使用函数$ memcached-> getServerByKey('K4')找出哪个密钥在哪个服务器上。然后让一台服务器关闭,看看getServerByKey()在失败后发送给你的是什么“。http://www.dugwood.com/895442.html#dwCmtForm。
答案 1 :(得分:8)
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在Conkettent Hashing上的实现基于在libketama上它根本不需要libketama。扩展程序负责将项目分发给不同的服务器,以便最大限度地减少缓存损失。删除或添加服务器时将始终存在影响。