0

我正在从单个 memcache 服务器迁移到 AWS 上的多个服务器。我需要从内部网络和外部访问 memcache 服务器。所以我正在使用

// get data from memcache for counter
$memcache = new Memcache;
$memcache->addServer('server1_internal_IP', 11211);
$memcache->addServer('server2_internal_IP', 11211);

从另一个区域上的应用服务器,我正在使用以下方式访问相同的服务器:

$memcache->addServer('server1_external_IP', 11211);
$memcache->addServer('server2_external_IP', 11211);

当本地服务器写入 memcache 而远程读取时,看起来路由没有转到相同的服务器

可能是因为我使用不同的 IP 地址(亚马逊内部和外部)来访问服务器吗?那么路由机制在进行路由时会考虑实际的IP地址吗?我认为它应该是按键上的简单 CRC32

4

2 回答 2

1

发现当 memcache.hash_strategy=consistent 时,IP 地址用于哈希算法,因此您无法路由到具有不同地址的相同服务器(每个服务器的 AWS 内部和外部 IP 地址就是这种情况)。

解决方案是切换到标准散列。在 php.ini 中添加:

[memcached] memcache.hash_strategy=标准

于 2012-09-02T17:11:53.423 回答
0

这并不理想。如果可能的话,您应该根据您存储的内容将数据隔离到单独的内存缓存服务器中。

如果您使用内置的散列算法将数据分布在服务器之间,则无法保证负载会均匀分布,并且添加/删除服务器将重置您在所有服务器上的整个缓存,这将导致您的站点出现重大问题(每个人都被记录如果您使用它来存储会话,则 out/ 会丢失他们的购物车内容)

于 2012-09-02T17:27:45.760 回答