假设 - 如果我有多个这样的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");
当我想从memcached服务器检索这些数据时 - php memcached客户端如何知道要查询该数据的服务器?或者memcached客户端将查询所有memcached服务器?
答案 0 :(得分:13)
你可以写关于此的书籍,但基本原则是有一些不同的方法。
缓存最常见,最有意义的方法是分片。这意味着数据仅在一台服务器上提供,并且某些方法用于确定这是哪个服务器。所以它可以从这个服务器获取,只涉及一个服务器。
这显然在密钥/值环境中作为memcached运行良好。
通常的做法是获取密钥的加密哈希值。计算此哈希MOD服务器数量,结果是您将存储和获取数据的服务器。
此程序产生或多或少的平衡。
它是如何在memcached中完成的,但我确实不知道某种哈希值。
但请注意,此teqnique不具备高可用性。因此,如果一个服务器失败,则条目消失。因此,您显然只能将其用于缓存目的。
其他技术,例如资源的高可用性,需要很长时间才能计算,并在后台自动加热,涉及复制。
缓存环境中最常见的形式是具有最新时间戳冲突解决的主 - 主复制。这基本上意味着每个服务器从本地服务器上尚未存在的每个服务器获取数据(这是使用复制日志和字节偏移完成的)。如果存在冲突,则使用最新版本(忽略服务器之间的微小时间偏移)。
但是在其他环境中,例如只写了很少但是读了很多,通常会有一个级联,其中只涉及一个或几个主服务器,其余只是纯读复制。
但是theese设置非常罕见,因为如上所述的分片可以提供最佳性能,而在缓存环境中,数据丢失大多是可以容忍的。所以它也是memcached的默认值。
答案 1 :(得分:0)
前几天我一直在寻找优化memcached服务器扩展的解决方案,并找到了答案。根据我们的经验,生成散列和MOD数量的服务器以找到目标服务器的描述解决方案并不是最好的解决方案。
如果您对服务器的数量进行升级或缩减,则在刷新缓存时可能会导致相同的情况。大多数哈希都会得到另一个服务器,因此第一个请求的缓存中不会有结果。
用于此类方案的最佳解决方案是一致散列。通过一致的散列,每个服务器都获得一个固定的散列范围。因此,如果您现在向上或缩小服务器的数量,则只有此特定哈希范围中的哈希值才会切换到另一个服务器。所有其他哈希值仍然存在于服务器中,只会重新生成一小部分。
对于PHP,有一个名为“flexihash”的库,它为您执行一致的散列。
在我们的Blog中,您可以找到如何将其与您自己的缓存客户端一起使用的示例。这篇文章是德文的,但源代码应该是自我解释的。