假设 - 如果我有这样的多个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 );
}
Run Code Online (Sandbox Code Playgroud)
然后我设置这样的数据:
$huge_data_for_frong_page = 'some data blah blah blah';
$memcache->set("huge_data_for_frong_page", $huge_data_for_frong_page);
Run Code Online (Sandbox Code Playgroud)
然后我检索这样的数据:
$huge_data_for_frong_page = $memcache->get("huge_data_for_frong_page");
Run Code Online (Sandbox Code Playgroud)
当我想从memcached服务器检索这些数据时 - php memcached客户端如何知道查询该数据的服务器?或者memcached客户端将查询所有memcached服务器?
The*_*can 13
那么你可以写关于这方面的书籍,但基本原则是有一些不同的方法.
缓存最常见和最有意义的方法是分片.这意味着数据仅在一台服务器上提供,并且某些方法用于确定这是哪个服务器.所以它可以从这个服务器获取,只涉及一个服务器.
这显然在memcached的键/值环境中很有效.
通常的做法是使用密钥的加密哈希.计算此哈希MOD服务器数量,结果是您将存储和获取数据的服务器.
此过程产生或多或少的平衡.
它是如何完成在memcached我dunno,但肯定的某种哈希.
但请注意,此teqnique不具备高可用性.因此,如果一个服务器失败,则条目消失.因此,您显然只能将其用于缓存目的.
其他技术,例如需要高资源可用性,需要很长时间才能计算并在后台自动加热,涉及复制.
缓存环境中最常见的形式是具有最新时间戳冲突解决的主 - 主复制.这基本上意味着每个服务器从本地服务器上尚未存在的每个服务器获取数据(这是使用复制日志和字节偏移完成的).如果存在冲突,则使用最新版本(忽略服务器之间的微小时间偏移).
但是在其他环境中,例如只写了很少但读取了很多,通常会有一个级联,其中只涉及一个或几个主服务器,其余只是纯读取复制.
但是theese设置非常罕见,因为如上所述的分片可以提供最佳性能,而在缓存环境中,数据丢失主要是可以容忍的.所以它也是memcached的默认值.
| 归档时间: |
|
| 查看次数: |
10370 次 |
| 最近记录: |