Fastdfs分布式文件系统的应用

26 MARCH 2016 on fastdfs, 分布式文件系统 咱们在实际项目中经常遇到这样的应用场景,用户须要上传图片,小视频或者其它文档,这些文件的大小通常在10M之内。它们不少,并且对用户来讲可能还很重要,并且可能还要常常被访问,被下载,如何妥善保存这些文件就是一个须要解决的问题。html

解决这个问题须要两点:一个是文件冗余备份,保证用户的文件不会丢失,另外一个是高可用性,也就是说当文件服务器出现故障的时候,能够马上让备份服务器为用户提供服务,使用户感受不到有什么异常。java

那么咱们不妨分析下有哪几种解决方案:nginx

1.粗放型: 直接做为blob字段存数据库里,利用数据库的容灾备份和HA来保障文件安全。其实这种方案是最安全的,可是显然数据库不是用来作这个的,由于太占数据库空间。不过因为其安全性最高,笔者在以前某个项目中曾经被要求这么干,由于保存的是客户的合同文件。可是相似社交网络的图片文件是不必这么作的。git

2.简约型: 直接存文件系统。若是有多台应用服务器同时提供文件上传服务,那么就准备一台文件服务器,分别挂载到全部应用服务器的指定路径下,实现多台应用服务器的文件写入,同时还能够配置读取静态文件更高效的nginx或者lighttpd来负责文件的读取。这样的好处是配置简单,管理方便(要不怎么叫简约型),不过缺点也很大,就是实现不了高可用性,虽然能够按期对文件服务器进行备份,可是一旦故障,文件会有部分丢失,并且nfs协议对并发写入的支持并很差。这种方案适合低并发,可靠性要求也不高的系统。github

3.专业型: 就是采用专业的分布式文件系统了,方案其实蛮多的。spring

mongodb提供了gridfs模块作文件的分布式存储,不过对于数据库不是采用mongo的,不必为了文件存储专门上个mongodbmongodb

其它还有不少开源的解决方案,好比阿里开源的TFS,还有本文要介绍的Fastdfs。数据库

(呼~~终于切入正题了)关于Fastdfs我就不介绍了,请看这篇简介。安全

关于部署,网上介绍有一些,可是基本都有问题,建议以这篇为参考如何部署。服务器

可是这篇一样有问题,在启动nginx和fastdfs以前需作以下修改:

编辑/etc/init.d/fdfs_storaged和/etc/init.d/fdfs_trackerd,这两个脚本里全部的路径都多了一层local,请把里面的全部/local删掉

必须在mod_fastdfs.conf文件最后加上一行#include http.conf,好让nginx启动的时候引入这个http.conf文件。

他的nginx配置也有点小问题,用这个吧(笔者是部署在192.168.6.46和192.168.6.47两台服务器上,server_name请自行修改)

server {
listen 80; server_name 192.168.6.46; root /usr/local/nginx/html; index index.html index.htm;

location / {

if (!-e $request_filename) {
      rewrite ^/(.*)$ /index.html last;
      }

location /group1/M00 { root /export/fastdfs/storage/data/; ngx_fastdfs_module; }

location ~ .*.(gif|jpg|jpeg|png|bmp|swf|js)$ {

fastcgi_cache_valid 200 10m;
    fastcgi_cache_valid 304 3m;
    fastcgi_cache_valid 301 302 1h;
    fastcgi_cache_valid any 1m;
    fastcgi_cache_min_uses 1;
    fastcgi_cache_use_stale error timeout invalid_header http_500;
    fastcgi_cache_key $host$request_uri;
    access_log off;
   }

   }

access_log off;

} 好了,分别启动两台服务器的nginx和fastdfs的storage和tracker服务,部署完成。

测试一下上传文件:测试结果

好了,返回的是fileId,前面加上ip就是下载文件的url了。

还没完,接下来咱们探讨下如何在java项目中使用fastdfs来帮咱们保存文件。

fastdfs的做者又为咱们写了一个java客户端的sdk。github地址 可是,这个sdk没有使用链接池,效率不是很高,编码风格也倾向于C++工程师。

网上有达人写了带链接池的优化版,我在其基础上又作了一些小的改进,一方面改掉了一些不兼容fastdfs5.05版本的bug,一方面使其更便于与spring结合。源码地址。

咱们须要在spring中以下配置:

<bean id="fastdfsFactory" class="net.mikesu.fastdfs.FastdfsClientFactory"> <constructor-arg name="configFile" value="config/props/fastdfs.properties" /> </bean> config/props/fastdfs.properties是与fastdfs相关配置文件。里面填这三个配置项。

connect_timeout=5
network_timeout=30
tracker_server=192.168.6.68:22122 支持配置多个tracker_server,固然也能够像笔者这样用keepalived或者nginx为多台fastdfs服务器提供一个vip。

在咱们的项目中注入fastdfs的客户端

@Autowired
private FastdfsClientFactory fcf;

上传文件

FastdfsClient fastdfsClient = fcf.getFastdfsClient(); String fileId = fastdfsClient.upload(file); OK

相关文章
相关标签/搜索