基于MongoDB GridFS的图片存储
2013-09-02 13:59
330 查看
基于MongoDB GridFS的图片存储
December 31, 2010 by Liút · 2Comments
Filed under: MongoDB, Python
商品图片,平均200-500K,说大不大,说小不小,但量大且细碎,最早通过页面上传,全部保存在文件里,且不分目录,管理和索引都很慢,几乎无法备份,读取也很慢。
改进方案由大鱼设计,图片是保存在MySQL表里,每10万张图就换一张新表,操作语言是PHP,它解决了图片备份和缓存的问题。
经过一段运行时间后,我对效果并不满意,主要是速度还是有些慢,尤其是第一次加载的过程。这期间又负责主体商品数据迁移到MongoDB,大致研究了一下GridFS,并做了些测试,感觉这个比MySQL要靠谱,且MongoDB还有Sharding和Replica
Set支持,帮我解决了分布存储的问题,很是诱人,决定一试。
设计思路和需求整理:
决不允许重复图片存在
文件只有原始的需要保留,其他各尺寸和效果都可以由原图生成
图片URL总是固定的,不管它出现在哪里
缩略图生成规则也简单的体现在URL里,参考 Abusing Amazon images
第一次请求,由图片处理程序生成静态文件,以后请求即直接定位到静态文件
多年前,郝培强同学送过我一本《Python语言入门》,但这么些年里只写过三两个小工具,按熟悉程度依然算新手。既然这个解决方案撞枪口上了,于是有改用Python实现的念头。我是这么想的,1.要简单;2.要快,不光运行快,还要写得快;3.最好是常驻型程序。貌似只有Python和Ruby符合,但Ruby我不熟悉,那就用Python好了。某个周六,花了一天时间,写了个雏形,支持图片读取并显示。又花了N天,添加管理和上传。
上传到github,命名为ImSto,将它作为我的第一个开源项目。
关于Python的Web框架,不得不絮叨几句,那真叫一个多,看了一些评论,也粗略研究了Pylons和CherryPy,很久以前学过一点点Django。但感觉似乎都有些复杂,这个需求也不复杂,决定干脆不用任何框架,自己动手丰衣足食算了。
所用到的组件:
MongoDB (GridFS): 这个不用说了,核心存储,初期环境用到了三台主机组成的Replica
Sets
Nginx: 解析URL并定位到静态文件,如果未生成则转向uWSGI程序去生成图片
Python + pymongo
ImageMagick: 用来生成图片缩略图,有两种调用方式:Api和命令行shell。Demo环境由于内存使用限制,用了shell方式。
uWSGI: 是用纯C写的WSGI服务器,支持多种语言(主要是Python)和Web
Server(官方首推Cherokee和Nginx)。有点儿类似PHP-FPM。
项目地址: https://github.com/liut/imsto 只是完成了 TODO里的部分核心功能,代码结构也比较粗糙,待逐步重构。
演示地址: http://demo.imsto.org:81/ 稍后添加权限认证,所以,在这之前请随便添随便删,不要客气。
Update:
1. 上传的页面使用了 html5的一些特性,为了实现Ajax上传和进度显示,以及即时预览,暂时只支持Firefox3.5+。稍后再改进。
2. 请不要向我推荐用 Flash,谢谢。
Social Tagging: GridFS • MongoDB • Nginx • Python
Comments
2 responses to “基于MongoDB GridFS的图片存储”
Comments are now closedqlbc says:
January
7, 2011 at 11:59
请问由图片处理程序生成静态文件保存到哪里了?GridFS or File System?
Liút says:
January
18, 2011 at 21:58
第一次请求后即将图片保存在文件系统,位置由配置文件 imsto.ini 中的 thumb_root 指定,另有计划任务定时清除长久不访问的文件
相关文章推荐
- 基于MongoDB GridFS的图片存储
- 转:基于MongoDB GridFS的图片存储
- 基于MongoDB GridFS的图片存储
- 基于MongoDB GridFS的图片存储
- nginx+mongodb-gridfs+squid 实现图片存储
- GridFS:基于MongoDB的分布式文件存储系统
- 【荐】PHP操作MongoDB GridFS 存储文件,如图片文件
- GridFS:基于MongoDB的分布式文件存储系统
- 用Mongodb基于GridFS存储文件
- 通过Nginx+mongodb-gridfs+squid实现简单的图片存储及图片缓存示例
- MongoDb gridfs-ngnix文件存储方案 - 图片
- PHP mongoDB GridFS 图片存储系统
- MongoDB基于GridFS存储文件
- MongoDB GridFS图片文件存储解决方案
- MongoDB GridFS图片存储
- GridFS:基于MongoDB的分布式文件存储系统
- 基于MongoDB GridFS取二进制数据转换为图片在jsp页面显示
- MongoDB 存储图片
- PHP操作MongoDB GridFS 存储文件
- 利用mongodb实现分布式WEB图片存储