上篇日志中写到的访问MogileFS文件的方法不太好,原因是把要访问的图片写到response中,这样做法比较笨,而且通过测试发现,写过来的图片显示的时候有问题,经常是上半部分正常,而下半部分变得乱掉了。在以前的应用中有过类似的写法,在多次刷新页面的时候会出现response的out被重置的情况,导致图片显示不出来。
所以还是直接访问文件在MogileFS的物理存储位置比较靠谱。和雷明同学研究了一下YuPoo图片地址和架构,大致确定的自己的图片地址写法:
http://localhost/lvto/pics/[username]/[picid]/[pictype]
其中:username代表了图片上传的用户名或标识
picid:图片的唯一标识
pictype:图片的类型,可能是缩略图(thumb),方图(square)等等。
具体来说,在页面上引用一个图片时,地址会是这样:
http://localhost/lvto/pics/xyn0563/1234abcd/thumb/
而且通过MogileFS对它进行直接访问的地址是:
http://localhost:7500/dev1/0/000/000/0000000014.fid
现在的工作就是要如何将引用地址指向实际的物理地址。
1.编写一个Action,picture/picutreRedirector.do,其作用是通过username,picid,pictype等参数,到数据库中查询,得到文件在MogileFS中的存储位置(path),然后调用
response.sendRedirect(path)
跳转到该位置。
如访问http://localhost:8080/lvto/picture/pictureRedirector.do?username=xyn0563&picid=1234abcd&pictype=thumb,得到的存储位置是:
dev1/0/000/000/0000000014.fid,然后跳转这个地址。
2.配置Nginx,使对于图片的请求全都转发到刚才写的Action。
nginx.conf 中:
其中的81端口起的是 Lighttpd,它的作用是将*.jsp,*.do都交由tomcat处理。
这样一来通过
http://localhost/lvto/pics/xyn0563/1234abcd/thumb/
访问的地址都经跳转到了
http://localhost/dev1/0/000/000/0000000014.fid
我的Nginx用的是80端口。
3.配置另外一个 Lighttpd,当然其他的web服务,比如Apache也可以,把它的documentroot直接指向Mogstored的存储位置。如,在我的Lighttpd中是这样的:
根据以上位置,通过以下地址一样可以访问MogileFS中的文件:
4.最后一步,即把第2步最后得到的地址再转向第3步的地址。这时又要用到Nginx。配置如下:
这样就实现了最终的目标,通过类似http://localhost/lvto/pics/xyn0563/1234abcd/thumb/的地址访问到具体的图片。
感觉比之前的方法好了许多,在与服务器交互过后不需要向response里写入图片数据,而只是得到图片的存储地址进行跳转即可。但是还是有些问题的:
1.图片的物理地址需要与数据库交互。每访问一个图片交互一次。在访问量大的情况会导致数据库压力增加。解决办法是使用memcached作数据库查询结果的缓存。这个回头再研究。
2.这个问题在别人的文章里也提到过。就是如果在MogileFS上多加一个device,比如多了个dev2,那么在nginx中就要针对dev2增加一条配置信息。
最后还有一个始终弄不明白的问题。对于以上的方法,图片在MogileFS中的存储位置在保存时就返回过来,保存到了数据库。如,保存到了dev1,数据库里记录的就是dev1,今后所有的访问都是到dev1里面去找。但是后来加上的dev2和dev1之间做了备份,意思是其实通过dev2这台mogstored也可以访问到这个图片。
由于是通过物理地址直接访问,这样的话在dev1负载很大的情况下就没办法通过dev2进行负载平衡了。那MogileFS所说的负载平衡是啥个意思啊,难道说只是在文件存储的时候有作用?还是说我了解的不够,其实是有办法做到的?
想来想去应该还是在那个Action里面,我设想的是应该可以通过某种方法,调用 MogileFS 的Api动态地决定访问dev1还是dev2。看Yupoo的架构图,感觉它的YPWS就是做这个东东的。
继续学习中。。。
一 14
This entry was posted on 星期三, 一月 14th, 2009 at 1:13 上午and is filed under 个人日志. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.
7 条评论 Nginx+Lighttpd+Tomcat,访问MogileFS中的文件
olive
一月 23rd, 2009 at 9:26 上午
1小伙最近很发奋啊
tedn
二月 5th, 2009 at 9:45 上午
2师兄。。。你这blog我看不懂啊
lostsnow
四月 23rd, 2009 at 11:43 上午
3/usr/local/nginx/conf/proxy.conf
不知道你这个的配置是?
雪碧之爱
五月 9th, 2009 at 8:56 下午
4其实又拍肯定不是像这样处理…
你用这种方式来做.性能很差…
我也不支持像你这样做法.可以直接比如取到mogilefs divid具体在哪里.然事通过流的方式把给输出出来就可以了.
我这前一个项目就是这样的…
不过又拍那边做法更加先进….
哈哈…
雪碧之爱
五月 9th, 2009 at 9:00 下午
5具我了解又拍是这样一种.图片取到他们是交给一个图片服务器来处理.可以完成多种规格图片尺寸.还有用python写一个图片web服务器.在你看来yupoo那边一个图片地址.其实当中已经隐藏了两个服务器同时做处理这个图片了.
哈哈…
雪碧之爱
五月 9th, 2009 at 9:09 下午
6还有说到mogilefs负载分布是这种方式…
文件系统有多个节点,当中你看到dev1和dev2是一个备份分布机制,如果你定义一个class是两份的话,就会都过你的存储节点是有几份device也就是设备盘符一样的.如果你只一个盘符当然你的备份也没有什么意义了.
如果有盘符有N个的话,你的备份将是一种轮询方式来备份分布式存储…
你刚才提到一个存储节点分布是一定要是n个存储节点必须是在不同服务器上面.这样才是一个均衡分布式存储.
这个分布式存储有点像我们web式分布就.是权值高低来选定到哪个节点然后会哪个节点备分布式备份几份存储…mogilefs就是这样一种机制…
如果你细细查看mogilefs数据库设计你就会知道这个原理了.
哈哈…
雪碧之爱
五月 9th, 2009 at 9:13 下午
7这是运作时一个机制…还有mogilefs还有一种就是你可以复制一个你现在分布到每个节点上面存储内容以做备份.当中节点机器down掉的话,你的备份节点就可以充当这个作用.不过我现在还是去做这个了.
因为我们公司没有像google那样资源…
在n台节点上面又几台备份节点机器.
哈哈…
RSS feed for comments on this post · TrackBack URI
Leave a Reply