memcachedb的缓存解决方案
问题示例:
网站有千万个网页文件需要存储,占用空间大约有300-400G,导致问题:
1 小文件太多,备份困难
2 空间增长很难调整
3 前端做缓存,因为object很高,效率很低,squid和lighttpd都不合适
解决方案说明:
1 nginx+memcached接口
Nginx有一个模块是可以读取memcached的数据的,可以把网页文件内容保存到memcached里面,如果数据无效,则proxy到后端,后端服务器更新此数据
2 memcachedb接口
memcachedb是新浪的一个开源项目,用硬盘作为存储空间,用的是Berkeley DB的存储引擎,memcached的协议。
有memcached的方便性,同时有高效的读写性能,没有内存作为存储空间的限制,数据永久保留,同时使用局域网的机器就可以处理并且很容易共享,不限制为本地文件,有自动的备份机制。
3 php程序管理存储
php处理memcached很容易,和前端约定相应的key即可
4 计划任务处理更新
由于memcachedb是永久保存,前端无法判断是否过期,所以需要自己制定策略删除过期的网页,以便前端获取不到而自动更新
5 magent作为memcachedb的代理接口,解决备份问题
memcachedb有备份方法,我碰到过出现无法同步的情况,magent也可以帮助解决此问题,它是为memcached设计的,但由于memcachedb使用memcached协议,所以也同样适用
解决方案配置示例:
假设www.aslibra.com/article/xxx 地址需要使用此方案,那就可以用服务器A(2)和B(3)作为memcachedb服务,可以在A(2)上跑magent,C(4)服务器是后端服务器,负责存入memcachedb数据
前端Nginx配置判断:
server 192.168.1.4;
}
upstream memcachedb {
server 192.168.1.2:11212;
server 192.168.1.3:11212 backup;
}
server {
server_name www.aslibra.com;
location / {
proxy_pass http://backend;
}
location ~* ^/article/ {
set $memcached_key $host$uri;
default_type text/html;
memcached_pass memcachedb;
error_page 404 = /fallback;
}
location = /fallback {
internal;
proxy_set_header memcached_key $memcached_key;
proxy_pass http://backend;
}
}
定义了memcachedb的upstream,有一个是backup标识的
/article/的请求会先查询memcachedb,找不到再发送到后端服务器
注意 proxy_set_header memcached_key $memcached_key 这句,可以保持key值的一致性
对于中文出现在地址的情况很实用,后端使用$_SERVER['REQUEST_URI'] 会和 $uri 不一致
A和B缓存服务器:
如果配置主从,那可以启用magent:
#默认监听 0.0.0.0:11211,提供给PHP使用
#比如这里是在192.168.1.2上运行
C服务器配置rewrite(lighttpd):
server.document-root = "/data/www.aslibra.com/"
url.rewrite-once = (
"^/article" => "/php/cache.php"
)
}
PHP代码参考:
//do sth to build html
echo $html;
//如果有传递memcached_key值就把结果存入memcachedb
//不需要设置缓存时间,因为没有用 :)
//有需要更新,那就记录一下日志
if($_SERVER['HTTP_MEMCACHED_KEY']){
$m = new Memcache;
if($m->connect('192.168.1.2', 11211) ){
$key = $_SERVER['HTTP_MEMCACHED_KEY'];
$m->set($key, $html);
//有必要就记日志
//log to file...
}
}
?>
删除文件:
如果有记录日志(可以是web服务器日志或者php记录的日志),可以根据保存的日志处理
需要删除的 $m->delete($key) 即可
备份请参考memcachedb的操作指南。
此解决方案适合memcached的存储方式,况且不用处理过期的问题,php可以解决过期时间
文章更新请关注本文更新:
http://www.aslibra.com/blog/post/memcachedb_cache_solution.php
参考资料:
1 Berkeley DB
2 memcachedb
3 magent
4 NginxModules
5 嵌入式数据库系统Berkeley DB
6 memcached和magent的安装
7 memcachedb的安装
原文:http://www.aslibra.com/blog/post/memcachedb_cache_solution.php
- 转载请注明来源:IT学习网 网址:http://www.t086.com/ 向您的朋友推荐此文章
- 特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系我们,我们会尽快予以更正。