【问题标题】:Inconsistent cache values using Zend Cache with AWS ElastiCache across multiple servers跨多个服务器使用 Zend Cache 和 AWS ElastiCache 的缓存值不一致
【发布时间】:2012-09-10 02:14:48
【问题描述】:

我们正在使用 Zend Cache 和一个 memcached 后端,该后端指向一个具有 2 个缓存节点的 AWS ElastiCache 集群。我们的缓存设置如下所示:

$frontend = array(
    'lifetime' => (60*60*48),
    'automatic_serialization' => true,
    'cache_id_prefix' => $prefix
);
$backend = array(
    'servers' => array(
        array( 'host' => $node1 ),
        array( 'host' => $node2 )
    )
);
$cache = Zend_Cache::factory('Output', 'memecached', $frontend, $backend);

过去我们在使用单个 EC2 服务器写入和读取缓存时没有注意到缓存有任何问题。

但是,我们最近推出了第二台 EC2 服务器,突然我们发现从一台服务器写入缓存并从另一台服务器读取时出现问题。两台服务器都由同一个 AWS 账户管理,两台服务器都没有单独写入或读取缓存的问题。两者使用相同的缓存配置。

服务器 A 执行 $cache->save('hello', 'message');

服务器 A$cache->load('message'); 的后续调用返回 hello 的预期结果。

但是,当 Server B 执行 $cache->load('message'); 时,我们得到 false

就我对 ElastiCache 的理解而言,发出读取请求的服务器应该与返回的缓存值无关。任何人都可以对此有所了解吗?

【问题讨论】:

  • 我认为这是一个延迟问题,您是否尝试过休眠(xxxx)然后从 B 执行 $cache->load?
  • 不幸的是,事实并非如此。甚至几个小时后,从 A 中设置的值也无法从 B 中读取。
  • 您使用的是哪个版本的 PHP?我认为序列化是在这里发挥作用的。尝试禁用自动序列化,看看会发生什么。不幸的副作用是您必须手动序列化不是字符串的所有内容。
  • 另外,cache_id_prefix 是相同的还是生成的值?
  • 我会尝试使用 PHP 的 Memcache 编写一些测试代码,从等式中删除 Zend_Cache。我从不太喜欢 Memcache 扩展并且一直偏爱Memcached(但不要让我开始了解他们为什么要向客户端添加“d”)。一方面,它支持比较和交换操作。

标签: php zend-framework caching amazon-web-services amazon-elasticache


【解决方案1】:

使用普通的散列算法,改变服务器的数量会导致许多键被重新映射到不同的服务器,从而导致大量的缓存未命中。

假设您的缓存集群中有 5 个 ElastiCache 节点,添加第六个服务器可能会导致 40% 以上的密钥突然指向不同的服务器。此活动是不可取的,可能会导致缓存未命中并最终用请求淹没您的后端数据库。为了尽量减少这种重新映射,建议在您的缓存客户端中遵循一致的哈希模型。

一致哈希是一种模型,它允许在添加或删除服务器的情况下更稳定地分配密钥。一致散列描述了将键映射到服务器列表的方法,其中添加或删除服务器会导致键映射到的位置发生非常小的变化。使用这种方法,添加第十一个服务器应该会导致不到 10% 的密钥被重新分配。这个百分比在生产中可能会有所不同,但与普通哈希算法相比,在这种弹性场景中它的效率要高得多。还建议在所有客户端配置中保持 memcached 服务器顺序和服务器数量相同,同时使用一致的哈希。 Java 应用程序可以通过 spymemcached 使用“Ketama 库”将该算法集成到他们的系统中。有关一致性哈希的更多信息,请访问http://www.last.fm/user/RJ/journal/2007/04/10/rz_libketama_-_a_consistent_hashing_algo_for_memcache_clients

【讨论】:

    【解决方案2】:

    你能说出你在内存缓存中使用的 hash_strategy 吗?过去我在使用默认 standard 时遇到过问题,但自从更改为 consistent 后一切都很好:

    http://php.net/manual/en/memcache.ini.php#ini.memcache.hash-strategy

    【讨论】:

      猜你喜欢
      • 2016-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-20
      • 2012-05-27
      • 2019-03-22
      • 1970-01-01
      • 2021-03-31
      相关资源
      最近更新 更多