Php 多个memcached服务器问题

Php 多个memcached服务器问题,php,memcached,Php,Memcached,假设-如果我有多个这样的memcached服务器: //PHP $MEMCACHE_SERVERS = array( "10.1.1.1", //web1 "10.1.1.2", //web2 "10.1.1.3", //web3 ); $memcache = new Memcache(); foreach($MEMCACHE_SERVERS as $server){ $memcache->addServer ( $server ); } $hug

假设-如果我有多个这样的memcached服务器:

//PHP 
$MEMCACHE_SERVERS = array(
    "10.1.1.1", //web1
    "10.1.1.2", //web2
    "10.1.1.3", //web3 
); 
$memcache = new Memcache();
foreach($MEMCACHE_SERVERS as $server){
    $memcache->addServer ( $server ); 
}
$huge_data_for_frong_page = 'some data blah blah blah';
$memcache->set("huge_data_for_frong_page", $huge_data_for_frong_page);
$huge_data_for_frong_page = $memcache->get("huge_data_for_frong_page");
然后我像这样设置数据:

//PHP 
$MEMCACHE_SERVERS = array(
    "10.1.1.1", //web1
    "10.1.1.2", //web2
    "10.1.1.3", //web3 
); 
$memcache = new Memcache();
foreach($MEMCACHE_SERVERS as $server){
    $memcache->addServer ( $server ); 
}
$huge_data_for_frong_page = 'some data blah blah blah';
$memcache->set("huge_data_for_frong_page", $huge_data_for_frong_page);
$huge_data_for_frong_page = $memcache->get("huge_data_for_frong_page");
然后我检索如下数据:

//PHP 
$MEMCACHE_SERVERS = array(
    "10.1.1.1", //web1
    "10.1.1.2", //web2
    "10.1.1.3", //web3 
); 
$memcache = new Memcache();
foreach($MEMCACHE_SERVERS as $server){
    $memcache->addServer ( $server ); 
}
$huge_data_for_frong_page = 'some data blah blah blah';
$memcache->set("huge_data_for_frong_page", $huge_data_for_frong_page);
$huge_data_for_frong_page = $memcache->get("huge_data_for_frong_page");

当我想从memcached服务器检索这些数据时-php memcached客户端如何知道要查询哪个服务器来获取这些数据?或者memcached客户端要查询所有memcached服务器?

你可以写一些关于这方面的书,但基本原则是有一些不同的方法

最常见和最有意义的缓存方法是分片。这意味着数据只存储在一台服务器上,并使用某种方法确定这是哪台服务器。因此,它可以从这个服务器获取,并且只涉及一个服务器

这显然在memcached这样的关键/价值环境中工作得很好

通常的做法是对密钥进行加密哈希。计算服务器的hash MOD数,结果是存储和获取数据的服务器

此步骤产生的平衡大致相等

我不知道在memcached里到底是怎么做的。但肯定是某种杂凑

但是要注意,这项技术不是很实用。因此,如果一台服务器出现故障,条目就会消失。因此,您显然只能将其用于缓存目的

其他技术(例如,需要资源的高可用性)需要很长时间才能计算并在后台自动预热,这些技术涉及复制

在缓存环境中,最常见的形式是具有最新时间戳冲突解决功能的主复制。这基本上意味着每台服务器都会从尚未位于本地服务器上的每台服务器获取数据(这是使用复制日志和字节偏移量完成的)。如果存在冲突,则使用最新版本(忽略服务器之间的轻微时间偏移)

但是,在其他环境中,例如写得很少但读得很多,通常存在一个级联,其中只涉及一个或几个主服务器,其余只是纯读复制


但是这些设置非常罕见,因为如上所述的分片提供了最佳性能,并且在缓存环境中数据丢失基本上是可以容忍的。因此,它也是memcached的默认设置。

几天前,我在寻找一种优化memcached服务器扩展的解决方案,并找到了这个答案。根据我们的经验,所描述的通过生成散列和修改服务器数量来查找目标服务器的解决方案不是最好的

如果要增加或减少服务器数量,刷新缓存时可能会出现相同的情况。大多数哈希都会得到另一台服务器,因此不会有第一个请求的缓存结果

用于此类场景的最佳解决方案是一致散列。使用一致的哈希,每个服务器都会获得一个固定的哈希范围。因此,如果您现在增加或减少服务器数量,则只有此特定哈希范围中的哈希将切换到另一台服务器。所有其他散列都保留在这些服务器上,只会重新生成一小部分

对于PHP,有一个名为“flexihash”的库,它为您执行一致性哈希


在我们的示例中,您可以找到如何将其与您自己的缓存客户端一起使用的示例。这篇文章是用德语写的,但是源代码应该是自我解释的。

不完全相同,但是我的回答也应该回答你的问题。谢谢……你知道memcached客户端是否会自动平衡写请求吗?或者它会一直运行到第一台服务器,直到填满为止,然后再运行到第二台服务器,直到第二台服务器填满为止,第三台服务器等等。IIRC,memcache有多种哈希策略,但默认是一种稳定的哈希算法。这意味着给定的密钥(假设服务器配置保持稳定)将始终位于同一台服务器上。这还意味着所使用的哈希值决定了哪个服务器将获得给定的密钥,因此负载应该是相当平衡的。总而言之,似乎更多的写/读是目标,而不是冗余?我正在寻找冗余,至少证实了我的想法。我一直在寻找这个问题的答案有一段时间了。谢谢你这么好的回复。回答了我所有的担忧。