短小实用的分布式图片存储方案

时间:2024-03-05 08:24:40

最近为网站的图片存储问题烦,虽然上了cdn,由于每天交换的图片数据有几十G,一直一台服务器撑着,但还是经常资源不足,导致无法上传图片或者显示图片;开始的设计是用第三方的存储,但是一直等待对方接口的开发,拖延了3~4个月,最后报价是每年3w多费用,没舍得花,也不想自己的平台受其它人控制着,最后咬了下牙建立了自己比较简单实用的图片存储方案,发现比较实用,分享下,个人属于经济实惠和节约资源的一个方案吧;

  1. 先看好处
    1.1.技术简单,通过IIS/Appache/tomcat/WCF部署,这种c#、Asp、asp.net、java、php的上传、删除、下载程序开发简单,部署简单,维护也简单;
    1.2.节约成本,有磁盘空间的服务器都可以应用上,普通的PC服务器都可以架,只要有磁盘,不会占额外的网站流量(第三方存储如果想自己也保存原图,会占用额外带宽);
    1.3.分布式,是实际意义上的存储分布式,减少风险,增加安全;
    1.4.改造成本小,其实就是将上传、下载、删除的整个过程全部独立出来;
  2. 实现方法
    2.1.存储服务器,需要Web容器,哪个都不重要,只要实现图片的上传、删除、下载(包含生成缩略图---这地方稍微复杂点);
    2.2.前端服务器,建议还是linux(window下的nginx基本测试里都不好用),用nginx做反向代理,通过URL规则来确定请求分发到哪台后端的web服务器上;
    2.3.URL规则,其实和数据库分区一样,就看你要细到什么程度,譬如我是按城市切割和业务切割的,即使再大的量,只需要增加后端存储服务器数就可以了;譬如:《庭院深深 小区》有一张图片,url是http://imgs.fangtuwang.com/Upload/hangzhou/building/bld/2011/03/08/n_ec084515c52c465698b2e1c60c0b32bc.jpg上传时用http://imgs.fangtuwang.com/Upload/hangzhou/building/up.aspx,只需要在nginx的反向代理上配置:
    locaction ~*^/upload/hangzhou/building/ {
        proxy_pass
    http://hangzhouBuildingsServer;
        expires 30d; break;
    }

  3. 实施整个过程
    1.1.感觉整个过程技术没任何难点,都是在设计和结构上花了些时间(主要是cdn、智能解析和增加了一台1.4w的前端机器);
    1.2.在下载时缩略图如果不存在,需要动态生成原图时候逻辑稍微复杂点(其实也简单);
    1.3.前端机如果可以,建议做个热备;
    1.4.后端存储,如果是重要图片,最好做个同步备份;

4.简单结构图


image

这个方案对没有钱烧的图片存储或者文件存储公司应该比较实用,欢迎大家探讨。