2019独角兽企业重金招聘Python工程师标准>>>

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

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

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

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

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

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

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

其它还有很多开源的解决方案,比如阿里开源的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

转载于:https://my.oschina.net/u/2307114/blog/649002

Fastdfs分布式文件系统的应用相关推荐

  1. FastDFS分布式文件系统(详细入门级介绍)

    分布式文件系统 (Distributed File System) 是一个软件/软件服务器: 这个软件可以用来管理文件: 但这个软件所管理的文件通常不是在一个服务器节点上,而是在多个服务器节点上,这些 ...

  2. 搭建自己的云存储空间|FastDFS分布式文件系统考虑一下?

    一. 前言 最近有很多小伙伴问壹哥,大规模的文件存储该怎么做? 这个感觉很难实现呢.其实这个需求,并没有大家想的那么难以实现.今天壹哥就带着各位,用10分钟的时间来搞定这个需求.不信?那你就跟着壹哥一 ...

  3. 大量文件不知道 怎么管理,快试试FastDFS(分布式文件系统)

    FastDFS(分布式文件系统)入门到精通 GitHub:个人GitHub Blog: 个人博客 1 什么是FastDFS 1.1 简介 FastDFS是用c语言编写的一款开源的分布式文件系统,它是由 ...

  4. FastDFS 分布式文件系统详解

    FastDFS 分布式文件系统详解 什么是文件系统 文件系统是操作系统用于在磁盘或分区上组织文件的方法和数据结构.磁盘空间是什么样的我们并不清楚,但文件系统可以给我们呈现一个非常清晰的表象,我们可以创 ...

  5. Docker安装FastDFS分布式文件系统

    Docker安装FastDFS分布式文件系统: 1.首先下载FastDFS文件系统的docker镜像 2.拉取镜像 3.查看镜像 4.使用docker镜像构建tracker容器(跟踪服务器,起到调度的 ...

  6. FastDFS分布式文件系统使用手册

    FastDFS分布式文件系统使用手册 1.概述 1.1.FastDFS简介 FastDFS是由国人余庆所开发,其项目地址:https://github.com/happyfish100,FastDFS ...

  7. FastDFS分布式文件系统详解

    FastDFS 简介 FastDFS 是基于 C 语言开发的,是一个轻量级开源的高性能分布式文件系统.主要功能有:文件存储.文件同步.文件访问(文件上传/下载),解决了大容量的文件存储和高并发访问的问 ...

  8. FastDFS分布式文件系统的安装及配置

    由于网站使用nfs共享方式保存用户上传的图片,附件等资料,然后通过apache下载的方式供用户访问,在网站架构初期,使用这种简单的方式实现了静态资源的读写分离,但随着网站数据量的增加,图片服务器渐渐成 ...

  9. Linux - 搭建FastDFS分布式文件系统

    1. FastDFS简介 说明:FastDFS简介部分的理论知识全部来自于博主bojiangzhou的 <用FastDFS一步步搭建文件管理系统>,在此感谢博主的无私分享.当然最最要感谢的 ...

最新文章

  1. 计算机组成考试题及答案,计算机组成测试题一参考答案
  2. 听说你 ping 用的很 6 ?给我图解一下 ping 的工作原理!
  3. 第二周 表格、字典、元组、集合 知识点
  4. 读《人,绩效和职业道德》有感
  5. Netty入门(七)使用SSL/TLS加密Netty程序
  6. Codeforces Round #486 (Div. 3)【完结】
  7. IL语言之.ctor
  8. sun cluster3.1
  9. Spark Yarn-cluster与Yarn-client
  10. cad图形文件无效且无法修复_20个CAD技巧,47个常用快捷键,助你高效出图,从此不加班!...
  11. 合肥赛区结束,继续训练提升
  12. WPF 微信 MVVM 【续】发送部分QQ表情
  13. 三、python环境的搭建之建建建
  14. 超感光徕卡电影四摄:华为Mate30系列国内开售
  15. 2020认证杯第二阶段选提建议
  16. 随机效应与固定效应面板数据回归
  17. C语言:正负交替的问题
  18. iOS Apple Pay开发流程
  19. 云队友丨当代攒钱青年现状:没变富,先「变负」
  20. 【Windows 问题系列第 14 篇】如何删除 Win10 系统自带的微软拼音输入法

热门文章

  1. Centos7允许3306端口通过防火墙
  2. App中如何实现消息推送
  3. CSS分别设置Input样式(按input类型
  4. 领域驱动DDD原理简介与实践
  5. 总结替换jar包中指定文件的步骤
  6. 从源码分析RocketMQ系列-RocketMQ消息持久化源码详解
  7. Java高并发编程详解系列-深入理解Thread构造
  8. 默纳克系统服务器怎么看抱闸,默纳克抱闸制动力检测怎么关闭
  9. Spring Cloud核心组件原理分析
  10. Spring Validation校验