收藏本站腾讯微博新浪微博

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 网站开通淘帖功能 - 蓝色理想插件 论坛内容导读一页看论坛 - 给官方提建议

论坛活动及任务 地图和邮件任务 请多用悬赏提问 热夏来袭,选一款蓝色理想的个性T恤吧!

手机上论坛,使用APP获得更好体验 急需前端攻城狮,获得内部推荐机会 论坛开通淘帖功能,收藏终于可以分类了!

搜索
查看: 3743|回复: 0

[系统] memcachedb的缓存解决方案

[复制链接]
发表于 2009-5-24 17:41:13 | 显示全部楼层 |阅读模式
问题示例:
网站有千万个网页文件需要存储,占用空间大约有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配置判断:

  1. upstream backend {
  2.   server 192.168.1.4;
  3. }
  4. upstream memcachedb {
  5.   server 192.168.1.2:11212;
  6.   server 192.168.1.3:11212 backup;
  7. }
  8. server {
  9.   server_name  www.aslibra.com;
  10.   location / {
  11.     proxy_pass http://backend;
  12.   }
  13.   location ~* ^/article/ {
  14.     set $memcached_key $host$uri;
  15.     default_type       text/html;
  16.     memcached_pass     memcachedb;
  17.     error_page         404 = /fallback;
  18.   }
  19.   location = /fallback {
  20.     internal;
  21.     proxy_set_header  memcached_key $memcached_key;
  22.     proxy_pass http://backend;
  23.   }
  24. }
复制代码


定义了memcachedb的upstream,有一个是backup标识的
/article/的请求会先查询memcachedb,找不到再发送到后端服务器
注意 proxy_set_header  memcached_key $memcached_key 这句,可以保持key值的一致性
对于中文出现在地址的情况很实用,后端使用$_SERVER['REQUEST_URI'] 会和 $uri 不一致

A和B缓存服务器:

  1. memcachedb -p 11212 -l 0.0.0.0 -u root -d -r -N -H /data/aslibra.com/article/
复制代码


如果配置主从,那可以启用magent:

  1. magent -s 192.168.1.2:11212 -b 192.168.1.3:11212
  2. #默认监听 0.0.0.0:11211,提供给PHP使用
  3. #比如这里是在192.168.1.2上运行
复制代码


C服务器配置rewrite(lighttpd):

  1. $HTTP["host"] == "www.aslibra.com" {
  2.         server.document-root = "/data/www.aslibra.com/"
  3.         url.rewrite-once = (
  4.                 "^/article" => "/php/cache.php"
  5.         )
  6. }
复制代码


PHP代码参考:

  1. <?
  2. //do sth to build html
  3. echo $html;

  4. //如果有传递memcached_key值就把结果存入memcachedb
  5. //不需要设置缓存时间,因为没有用 :)
  6. //有需要更新,那就记录一下日志
  7. if($_SERVER['HTTP_MEMCACHED_KEY']){
  8.   $m = new Memcache;
  9.   if($m->connect('192.168.1.2', 11211) ){
  10.     $key = $_SERVER['HTTP_MEMCACHED_KEY'];
  11.     $m->set($key, $html);
  12.     //有必要就记日志
  13.     //log to file...
  14.   }
  15. }
  16. ?>
复制代码


删除文件:

如果有记录日志(可以是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的安装

评分

参与人数 1威望 +1 收起 理由
蓝色 + 1 谢谢分享

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|Archiver|手机版|blueidea.com ( 湘ICP备12001430号 )  

GMT+8, 2020-7-8 19:41 , Processed in 0.125660 second(s), 13 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表