Memcache Consistent Hashing,Cluster,PHP代码,Ketama以及所有相关内容

 手机用户2502919951 发布于 2023-02-07 12:03

我一直在努力用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处理剩下的事情?

请大家,我需要您真正的支持,以便尽快了解并实施我的生产环境.你的答案让我明白我应该为什么编码更好.

2 个回答
  • 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.扩展程序负责将项目分发给不同的服务器,以便最大限度地减少缓存损失.删除或添加服务器时将始终存在影响.

    2023-02-07 12:05 回答
  • 那些问题一下子让我尽力一个接一个地回答.

    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.

    2023-02-07 12:05 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有