免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4135 | 回复: 11
打印 上一主题 下一主题

[FastDFS] 探讨一下支持名字空间的思路 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-01-17 00:11 |只看该作者 |倒序浏览

想上fastdfs或者类fastdfs分布式文件系统的,大抵是网站和文件数到了一定规模,原有集中存储无法满足扩容和备份需求。也就不得不面对一个问题,老系统如何迁移问题。
在其它帖子里也有人问过,我今天重新把自己的思路和大家探讨下,希望得到些更广泛的讨论。

我的应用场景:

网站大量小文件,大部分是图片,还有一部分是Html页面。
图片应用有大图,小图,中图不同的尺寸。需要切图。
原来使用盘柜集中存储,5T (ibm 3400 盘柜 , SAS硬盘),存储上启NFS服务,mount了6台应用。

问题:
盘柜故障,硬盘偶尔会坏
NFS性能问题,应用再扩的话,性能上和管理性上面,都麻烦,另外nfs有bug,一旦服务端有点什么问题,mount上来的机器都可能扶起无响应。
原系统使用3级目录存放文件,访问地址类似   
http://img.a.b.c.com/01/02/03/xxxxxxx.jpg   
http://img.a.b.c.com/01/02/03/xxxxxxx.thumb.jpg

分别访问大图和小图。

上分布式要解决的问题:

a.老系统http://img.a.b.c.com/01/02/03/xxxxxxx.jpg    这种URL schema的支持。
b.切图服务重新要改成使用fastdfs的api访问,取得原图,再切图,再返回。


上FastDFS的技术方案:

1. 实现名字空间。使用目前比较成熟和高性能的redis key/value 来存储老名字url和fastdfs返回的fileid对应。
   图片访问:访问http://img.a.b.c.com/01/02/03/xxxxxxx.jpg , 写一个nginx模块,先从redis取得fileid,然后再调用api取得分布式存储里的图片。
   应用改造:保存文件里使用api返回fileid后再以01/02/03/xxxxxxx.jpg 按md5或者其它什么高效的算法进行hash作为key, value=fileid, 存一次redis.

2. 实现切图服务。写一nginx模块,按规则解析出这是访问一张小图的地址,再按1的规则取出原图,实时切出小图,并返回。
    性能优化:为了降低高并发调用同一张图片,再加一道文件cache,这可以用squid,或者nginx cache模块都好配置。不再细说。再加上cdn,这样真正需要实际访问存储的请求就非常少了,在几天内同一张图片只需要读取一次。
   
3. 历史数据迁移。等1.和2.都做到了,不再往老存储里写数据。新的按1.的方式写到新文件系统里。
再写一个迁移程序,对老系统里的01/02/03/xxxxxxx.jpg这种风格的文件迁到新文件系统里。
我们系统里大概是1.5亿个文件数,可能导得慢点,但不影响生产系统,反正就开起来让它24小时跑着,总有一天老系统将全部迁移完成。

技术选型的考虑:

redis本身有很多大公司生产系统都在用了,其稳定性和可靠性不用自己再当小白鼠。承受我们网站的访问量和1个亿级别的key/value,我想问题不大。
其实上面的方案对其它不支持名字空间或者posix兼容的分布式文件系统也适用,比如淘宝的tfs,但当我2年再一次看fastdfs,我还是想选fastdfs. 顺带一句感概,09年我就想上fastDFS,可是阴差阳错,当时不知道什么原因的原因,没能上成而上了ibm的盘柜;如今2.5年过去了,现在都2012了. 又一次回看fastdfs,有一种时光倒转的感觉。我想我和fastdfs,应该还是有些缘份。扯蛋结束,请各位拍砖。


论坛徽章:
0
2 [报告]
发表于 2012-01-17 13:22 |只看该作者
感谢楼主分享经验。nginx连接redis有现成模块,不用重新写了

https://github.com/agentzh/redis2-nginx-module

论坛徽章:
0
3 [报告]
发表于 2012-01-17 15:50 |只看该作者

这个模块不错,有前人铺路,可以节省些体力,不过还是要改一下才能满足定制需求。我的这个模块应该是redis2-module + fastdfs-module 的一个合体。干脆叫做fastdfs-redis2-nginx-module得了。

orclover 发表于 2012-01-17 13:22
感谢楼主分享经验。nginx连接redis有现成模块,不用重新写了

https://github.com/agentzh/redis2-nginx- ...

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
4 [报告]
发表于 2012-01-17 20:44 |只看该作者
回复 1# mineral_cu

看来你们公司蛮有钱的嘛!
选择FastDFS,保证你不会后悔!
   

论坛徽章:
0
5 [报告]
发表于 2012-01-19 18:22 |只看该作者
happy_fish100 发表于 2012-01-17 20:44
回复 1# mineral_cu

看来你们公司蛮有钱的嘛!


这个, 怎么看出公司有钱。
就是没钱才要要弄开源产品,ibm的gpfs买不起。

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
6 [报告]
发表于 2012-01-19 19:36 |只看该作者
你们不是上了IBM的盘柜吗,应该很费银子的吧?

论坛徽章:
0
7 [报告]
发表于 2012-01-20 09:50 |只看该作者
盘柜上了3个,一个5T,一个15T,另一个15T(异地备份)。 也是业务增长扩的,二是没能力搞定分布式。
现在我们面临的问题就是5T的那个跑业务,但不够了,不好扩。
另二就是数据备份麻烦,rsync根本跑不动,目录级数太深,3级100万个目录 ,遍历目录就死掉。


“1. 实现名字空间。使用目前比较成熟和高性能的redis key/value 来存储老名字url和fastdfs返回的fileid对应。”

我很想知道这样靠谱吗,请fish大和有识同仁点评下。

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
8 [报告]
发表于 2012-01-20 12:24 |只看该作者
回复 7# mineral_cu

你的做法是可行的。

论坛徽章:
0
9 [报告]
发表于 2012-03-30 14:03 |只看该作者
mineral_cu 发表于 2012-01-17 15:50
这个模块不错,有前人铺路,可以节省些体力,不过还是要改一下才能满足定制需求。我的这个模块应该是redi ...


请问你的这个模块写出来了吗?可以共享下吗?

论坛徽章:
0
10 [报告]
发表于 2012-08-01 16:25 |只看该作者

回复 9# shaoli0554

fish100大说,他将实现名字空间,所以我就等着他的版本了,没有去做。

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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP