分布式文件系统怎么做?终于有个人把分布式文件上传讲清楚了
FastDFS 概念
FastDFS 是开源的轻量级分布式文件系统,实现文件管理, 主要功能:
文件存储
文件同步
文件访问(文件上传,文件下载)
解决了大容量存储和负载均衡的问题,特别适合以文件为载体的在线服务:相册网站,视频网站
FastDFS 为互联网量身定制,充分考虑了冗余备份,负载均衡,线性扩容等机制,并注重高可用,高性能等指标,使用 FastDFS 可以很方便地搭建一套高性能的文件服务器集群提供文件上传,下载等服务
FastDFS 文件系统架构
FastDFS 服务端有两个角色:
跟踪器(tracker): 主要做调度工作,在访问上起负载均衡作用
跟踪器和存储节点都可以由一台服务器或多台服务器构成,跟踪器和存储节点中的服务器可以随时增加或下线而不会影响下线服务.
跟踪器中所有服务都是对等的,可以根据服务器的压力情况随时增加或减少
存储节点(storage): 存储文件,完成文件管理的所有功能
就是这样的存储
同步存储接口
提供存储接口
FastDFS 同时对文件 metadata 进行管理,文件 metadata 是文件属性列表,可以包含多个键值对
文件 metadata: 文件的相关属性,以键值对方式表示
为了支持大容量,存储节点采用分卷的组织方式
存储系统由一个卷或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统的文件容量
一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中文件都是相同的,卷中的多台服务器起到了冗余备份和负载均衡作用
在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务
当存储空间不足或即将耗尽时,可以动态添加卷,只需要增加一台或多台服务器,配置一个新的卷,这样扩大存储系统的容量
FastDFS 文件标识分为两部分:
卷名
文件名
上传交互过程
client 询问 tracker 上传到的 storage,不需要附加参数
tracker 返回一台可用的 storage
client 直接和 storage 通讯完成文件上传
下载交互过程
client 询问 tracker 下载文件的 storage,参数为文件标识(卷名和文件名)
tracker 返回一台可用的 storage
client 直接和 storage 通讯完成文件下载
FastDFS 结合 Nginx
使用 FastDFS 部署分布式文件系统时,通过 FastDFS 的客户端 API 进行文件的上传,下载,删除等操作,同时通过 FastDFS 和 HTTP 服务器来提供 HTTP 服务.但是 FastDFS 的 HTTP 服务较为简单,无法提供负载均衡等高性能的服务.需要使用 FastDFS 的 Nginx 模块弥补这一缺陷
FastDFS 通过 tracker 服务器,将文件放在 storage 服务器存储,但是同组之间的服务器需要复制文件,有延迟的问题,可以通过 fastdfs-nginx-module 可以重定向连接到源服务器取文件,避免客户端由于复制延迟的问题,出现错误
基于 Docker 安装 FastDFS
环境准备:
libfastcommon: FastDFS 分离出的一些公用函数包
FastDFS: FastDFS 本体
fastdfs-nginx-module: FastDFS 和 nginx 的关联模块
nginx: nginx1.15.4
创建工作目录:
在 Linux 中创建
在 /usr/local/docker/fastdfs/environment 目录中创建 Dockerfile
在/usr/local/docker/fastdfs/environment 创建 entrypoint.sh,创建完成的后要执行 chmod +x entrypoint.sh 命令文件才可以使用
相关配置文件
tracker.conf: FastDFS 跟踪器配置,容器路径为:/etc/fdfs,修改:
storage.conf: FastDFS 存储节点配置,容器路径为:/etc/fdfs,修改:
client.conf: FastDFS 客户端配置,容器中路径为:/etc/fdfs,修改:
config: fastdfs-nginx-module 配置文件,容器中路径为:/usr/local/src/fastdfs-nginx-module/src,修改:
mod_fastdfs.conf: fastdfs-nginx-module 配置文件,容器中路径:/usr/local/src/fastdfs-nginx-module/src,修改:
nginx.conf: Nginx 配置文件,容器中的路径为:/usr/local/src/nginx-1.15.4/conf,修改:
启动容器
docker-compose.yml: 在/usr/local/docker/fastdfs 文件夹中创建 docker-compose.yml
执行命令,使文件编译生效
测试上传
交互式进入容器:
测试文件上传: 在/usr/bin 目录中执行(第 1 个是二进制可执行文件客户端,第 2 个是客户端的客户端配置文件,第 3 个是需要上传的文件)
服务器反馈上传地址: 文件的上传路径(非地址),通过在浏览器输入 Ngnix 的访问地址+文件上传路径即可访问服务器上的文件
测试 Nginx 访问: 通过在浏览器输入 Ngnix 的访问地址+文件上传路径即可访问服务器上的文件
配置 FastDFS Java 客户端
创建项目: 创建项目名为 myshop-service-upload 的服务提供者项目
安装 FastDFS Java 客户端
从 github 上 git clone FastDFS 项目代码:
配置到本地仓库: 在项目目录的 target 包下有项目的 jar 文件
将项目 jar 文件上传到 Nexus 中
在项目中添加依赖:
创建 FastDFS 工具类
定义文件存储服务接口:
实现文件存储服务接口:
文件存储服务工厂
配置文件存储服务工厂类
创建 FastDFS 控制器
增加云配置: application.yml
控制器代码
创建 SpringBoot Application,运行执行分布式文件上传项目
版权声明: 本文为 InfoQ 作者【攻城狮Chova】的原创文章。
原文链接:【http://xie.infoq.cn/article/4194a5289e81335ed29456ee7】。文章转载请联系作者。
评论