你好!
用 beansdb + nginx memcache module 的搭配是不错的, 我们目前也是这样使用的.
nginx 中可以用 add_header 模块来添加别的信息, 比如我们的配置如下:
location ~ ^/(img|icon|[sbmlote]pic|rda)/ {
default_type image/jpeg;
expires 1y;
add_header Last-Modified "Wed, 21 Jan 2004 19:51:30 GMT";
if ($http_if_modified_since) {
return 304;
}
if ($request_uri ~ /download/ ){
add_header Content-Disposition "attachment;";
}
set $memcached_key $uri;
if ($uri ~ /img(/.*) ){
set $memcached_key $1;
}
memcached_pass beansdb;
memcached_next_upstream error timeout invalid_response;
memcached_connect_timeout 300ms;
memcached_read_timeout 3s;
memcached_send_timeout 1s;
}
beansdb 并没有处理热点数据问题, 只能依赖操作系统的缓存. 因此建议在nginx 之前,
再加一层squid/varnish/nginx(proxy_store 或者 proxy_cache) 来处理热点数据的访问.
目前同时使用两套系统是非常明智的, 可以调整一下写入策略, 同时写入beandb和集中存储,
nginx 中从 beansdb读取失败后再尝试集中存储. 同时可以在后台不断地向beansdb中导入数据.
如果部署一层缓存后能够解决大部分访问的IO问题, 那目前的容量可以部署两到三个对等的
beansdb来存储所有数据. 之后根据数据或者访问压力的增长再增加节点.
当一个节点中只存储了部分区间的数据时, 最好部署几个Proxy来简化访问.
目前开源的版本中包含一个python实现的Proxy, 如果访问压力比较高,
我可以把我们目前使用的Go实现的版本给你们试用.
希望beansdb 能解决你们的问题:)
Davies
2011/5/2 beafuture
<beaf...@126.com>
刘先生你好!
非常感谢douban能够开原beansdb。
我们现在也有几百G的图片还在集中存储,访问压力比较大,经过再三考虑,最终想用beansdb + nginx memcache module的方式将图片缓存到beansdb集群中,用户请求时先查找beansdb,没有则去后端存储中查找并放入beansdb中,以此来减小后端集中存储的访问压力,之所以不充用集中存储,是因为我们的技术能力有限,害怕beansdb出了状况驾驭不了。但这种方案存在一个问题,想和您沟通一下,诺把图片存入beansdb,用nginx memcache (或php)可以取出,不过图片存入beansdb后时间属性丢失了,nginx将图片返回浏览器时,date 头是当前时间,其他缓存控制头都无法添加,所以无法被缓存服务器或浏览器缓存下来,造成很大带宽浪费,不知您是如何处理beansdb中图片缓存的问题的,望您指点一二不胜感激。
体验网易邮箱2G超大附件,轻松发优质大电影、大照片,提速3倍!
--
- Davies