分布式文件存储:FastDFS简单使用与原理分析
引言
FastDFS 属于分布式存储范畴,分布式文件系统 FastDFS 非常适合中小型项目,在我接手维护公司图片服务的时候开始接触到它,本篇文章目的是总结一下 FastDFS 的知识点。
用了 2 台 2 核 4G 的阿里云服务器做集群部署,具体部署步骤请参考:https://github.com/happyfish100/fastdfs/wiki
1、FastDFS 分布式文件系统概述
FastDFS 是一个轻量级的开源分布式文件系统,作者为淘宝资深架构余庆。 FastDFS 主要解决了分布式文件存储与高并发访问的问题,实现了负载均衡,适合存储图片、视频、文档等文件,而且支持存储服务器的在线扩容。
2、FastDFS 架构
FastDFS 服务端有两个角色:Tracker 与 Storage,其中 Tracker 主要做调度工作,有着负载均衡作用,Storage 负责文件存取、同步等操作。
FastDFS 系统结构:
2.1、Client
客户端访问 FastDFS 分布式存储,一般为后端应用。
2.2、Tracker
Tracker 在 FastDFS 集群中有两大作用:
- 管理 Storage 集群,在 Storage 服务启动时,会把自己注册到 Tracker 上,并定期上报自身状态信息,包括磁盘剩余空间、文件同步状态、文件上传下载次数等统计信息。
- Client 访问 Storage 服务之前,必须先访问 Tracker,动态获取到 Storage 服务的连接信息,有着负载均衡的作用。
2.3、Storage
Storage 是数据存储服务器,文件和 meta data 都保存在 Storage 服务器中。 有以下特点:
- 采用高可用的方式进行数据存储。
- FastDFS 集群中,Storage 按组(Group/volume)提供服务,不同组的 Storage 之间不会互相通信,同组内的 Storage 之间会相互连接,进行文件同步。
- Storage 服务采用 binlog 文件记录文件上传、删除等更新操作,binlog 中只记录文件名,不记录内容。
- 文件同步只在同组内的 Storage 服务之间进行,采用 push 方式,即圆通服务器同步给目标服务器。
- FastDFS 将文件及相关的描述信息(MetaData)保存在 Storage 服务中,文件存储以后将返回唯一的文件标识,文件标识有组名和文件名两部分构成,MetaData 是文件的描述信息,如 width=1024,height=768。
3、文件上传原理
文件上传的原理如下图:
- Client 询问 Tracker 可以上传到哪个 Storage。
- Tracker 返回一台可用的 Storage 连接信息。
- Client 直接与 Storage 通信,完成文件上传。
- Storage 保存文件以后,返回 Client 文件标识(组名、文件名)。
4、文件下载原理
文件下载原理如下图:
- Client 询问 Tracker 下文文件的 Storage,参数为文件标识(组名、文件名)。
- Tracker 返回一台可用的 Storage。
- Client 与 Storage 通信,完成文件下载过程。
5、文件同步原理
- 同一个组内的 Storage 服务是对等的,文件上传、删除等操作可以在任意一台 Storage 服务上执行,数据会在同组内 Storage 内同步。
- 文件同步(上传、删除、更新)采用 push 方式,即源服务器同步给目标服务器。
- 只有源头数据才需要同步,如果备份数据再次同步就会形成环路。
- 当新增 Storage 服务时,将已有的一台 Storage 的所有数据(源头数据与备份数据)同步给这台新增服务器。
6、服务端文件目录
6.1、TrackerServer
${base_path}
|__data
| |__storage_groups.dat:存储分组信息
| |__storage_servers.dat:存储服务器列表
|__logs
|__trackerd.log:tracker server日志文件
6.2、StorageServer
${base_path}
|__data
| |__.data_init_flag:当前storage server 初始化信息
| |__storage_stat.dat:当前storage server统计信息
| |__sync:存放数据同步相关文件
| | |__binlog.index:当前的binlog文件索引号
| | |__binlog.###:存放更新操作记录(日志)
| | |__${ip_addr}_${port}.mark:存放同步的完成情况
| |
| |__一级目录:256个存放数据文件的目录,如:00, 1F
| |__二级目录:256个存放数据文件的目录
|__logs
|__storaged.log:storage server日志文件
7、服务端与客户端通讯协议
7.1、 通讯协议介绍
FastDFS 服务端与客户端通讯时候采用的是自定义的通讯协议,如下图所示:
协议包由两部分组成:header 和 body
- header 共 10 字节,格式如下:
- 8 bytes body length
- 1 byte command
- 1 byte status
- body 数据包格式取决于具体的命令,body 可以为空。
7.2、命令代码和通讯状态代码
7.2.1、Tracker 管理命令代码
名称 | 命令 |
---|---|
删除 storage | 93 |
获取下载节点 QUERY_FETCH_ONE | 102 |
获取更新节点 QUERY_UPDATE | 103 |
不按组获取存储节点 | 101 |
按组获取存储节点 | 104 |
获取组列表 | 91 |
获取存储节点列表 | 92 |
7.2.2、 Store 文件上传命令代码
名称 | 命令 | 说明 |
---|---|---|
文件上传 | 11 | 一般的文件上传,上传后为主文件 |
上传附属文件 | 21 | “上传从文件文件,比如主文件为 xxx.jpg,从文件(缩略图)为 xxx-150_150.jpg” |
删除文件 | 12 | 删除文件 |
设置文件元数据 | 13 | 上传文件创建日期,标签等 |
文件下载 | 14 | |
获取文件元数据 | 15 | |
查询文件信息 | 22 | 查询文件信息 |
创建支持断点续传的文件 | 23 | 创建一个支持断点续传的文件 |
断点续传 | 24 | 上传可断点上传的文件,如将大文件切为几份,分开上传 |
文件修改 | 34 | 修改支持断点上传的文件 |
清除文件 | 36 | 截取(清除)支持断点上传的文件 |
7.2.3、报文通讯状态代码
名称 | 代码 |
---|---|
客户端关闭连接命令 | 82 |
连接状态检查命令 | 111 |
服务端正确返回报文 | 100 |
8、简单使用
我使用的是 fastdfs-client-java-1.27-SNAPSHOT.jar happyfish100/fastdfs-client-java
这个库从 17 年 6 月 5 号之后就停止更新了,最近又开始更新代码了,看样子要维护了啊。
简单的对客户端进行了连接池的封装,方便使用。
- 系统启动,池子管理连接
- 心跳确认连接是否可靠
- 构造器模式创建连接池
- 回调方式使用客户端
源码地址:
ClawHub/FastDFS-Pool
以下为核心代码:
1.1、 初始化连接池
/*** Build fast dfs conn pool.** @return the fast dfs conn pool*/public FastDFSConnPool build() {// 初始化空闲连接池idleConnectionPool = new LinkedBlockingQueue<>(maxPoolSize);//初始化全局参数try {ClientGlobal.init(confFileName);} catch (IOException | MyException e) {throw new RuntimeException("init client global exception.", e);}// 往线程池中添加默认大小的线程TrackerServer trackerServer;for (int i = 0; i < minPoolSize; i ) {//获取到连接trackerServer = createTrackerServer();if (trackerServer != null) {//放入空闲池idleConnectionPool.offer(trackerServer);}}// 注册心跳new HeartBeat(this).beat();return this;}
1.2、 客户端执行请求
/*** 执行方式** @param <T> the type parameter* @param invoke the invoke* @return the t*/public <T> T processFdfs(CallBack<T> invoke) {TrackerServer trackerServer = null;T t;try {//获取tracker连接trackerServer = fastDFSConnPool.checkOut();//获取storageStorageClient1 storageClient = new StorageClient1(trackerServer, null);//执行操作t = invoke.invoke(storageClient);//释放连接fastDFSConnPool.checkIn(trackerServer);return t;} catch (Exception e) {//删除链接fastDFSConnPool.drop(trackerServer);throw new RuntimeException(e);}}
1.3、 心跳
/*** 心跳任务*/private class HeartBeatTask implements Runnable {@Overridepublic void run() {LinkedBlockingQueue<TrackerServer> idleConnectionPool = fastDFSConnPool.getIdleConnectionPool();TrackerServer ts = null;for (int i = 0; i < idleConnectionPool.size(); i ) {try {ts = idleConnectionPool.poll(fastDFSConnPool.getWaitTimes(), TimeUnit.SECONDS);if (ts != null) {ProtoCommon.activeTest(ts.getSocket());idleConnectionPool.add(ts);} else {//代表已经没有空闲长连接break;}} catch (Exception e) {//发生异常,要删除,进行重建logger.error("heart beat conn have dead, and reconnect.", e);fastDFSConnPool.drop(ts);}}}}
1.4、 使用方式
//初始化连接池FastDFSConnPool fastDFSConnPool = new FastDFSConnPool().confFileName("./config/fdfs_client.conf").maxPoolSize(8).minPoolSize(1).reConnNum(2).waitTimes(2).build();//使用客户端FastDFSClient client = new FastDFSClient(fastDFSConnPool);//上传 ileName 文件全路径 extName 文件扩展名,不包含(.) metas 文件扩展信息String parts = client.processFdfs(storageClient -> storageClient.upload_file1("fileName", "extName", new NameValuePair[0]));//下载 fileId: group1/M00/00/00/wKgRsVjtwpSAXGwkAAAweEAzRjw471.jpgbyte[] bytes = client.processFdfs(storageClient -> storageClient.download_file1("fileId"));//删除 -1失败,0成功int result = client.processFdfs(storageClient -> storageClient.delete_file1("fileId"));//获取远程服务器文件资源信息 groupName 文件组名 如:group1 remoteFileName M00/00/00/wKgRsVjtwpSAXGwkAAAweEAzRjw471.jpgFileInfo fileInfo = client.processFdfs(storageClient -> storageClient.get_file_info("groupName", "remoteFileName"));
参考
FastDFS V5.12 分布式文件系统介绍
tobato/FastDFS_Client 的 wiki
分布式文件存储:FastDFS简单使用与原理分析相关推荐
- 分布式文件存储FASTDFS
分布式文件存储FASTDFS 目录 概 述 小结 参考资料和推荐阅读 LD is tigger forever,CG are not brothers forever, throw the pot a ...
- 分布式文件存储FastDFS介绍安装部署及相关Java代码编写
分布式文件存储FastDFS 一.FastDFS简介 1.1 FastDFS体系结构 FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传 ...
- 分布式文件存储FastDFS使用教程(下载安装使用)
分布式文件存储FastDFS 1.FastDFS 1.1 FastDFS简介 1.1.1 FastDFS体系结构 1.1.2 上传流程 1.2 FastDFS搭建 1.2.1 安装FastDFS镜像 ...
- 分布式文件存储—fastDFS
简单了解: •FastDFS是一个轻量级的开源分布式文件系统 •解决了大容量文件存储和高并发访问的问题,文件存取时实现了负载均衡 •FastDFS实现了软件方式的RAID,可以使用廉价的IDE硬盘进行 ...
- 分布式文件存储——FastDFS
FastDFS FastDFS 是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡的问题. 特别适合以文件为 ...
- 【工具类】分布式文件存储-FastDFS
FastDFS简介 FastDFS体系结构 FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡 ...
- (转) 分布式文件存储FastDFS(一)初识FastDFS
http://blog.csdn.net/xingjiarong/article/details/50559849 一.FastDFS简介 FastDFS是一款开源的.分布式文件系统(Distribu ...
- 基于SpringBoot下使用分布式文件存储FastDFS
一.FastDFS简介 1.1 FastDFS体系结构 FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存 ...
- 分布式文件存储FastDFS(一)初识FastDFS
一.FastDFS简介 FastDFS是一款开源的.分布式文件系统(Distributed File System),由淘宝开发平台部资深架构师余庆开发.作为一个分布式文件系统,它对文件进行管理,功能 ...
- (转)分布式文件存储FastDFS(四)配置fastdfs-apache-module
http://blog.csdn.net/xingjiarong/article/details/50560605 在前边我们已经配置好了FastDFS的环境,但是此时的FastDFS还不能通过htt ...
最新文章
- Strusts2笔记7--国际化
- mysql 关闭主从_取消mysql主从复制关系
- bit_length
- linux 安装nginx php mysql 配置文件在哪_linux下 php+nginx+mysql安装配置
- Http Ajax技术哪家强?Axios、Superagent、Request、Fetch、Supertest技能大比拼!
- python书籍推荐1001python书籍推荐_Python的1001种骚操作——基础篇(0)
- maven项目,在spring中整合mybatis
- float和int转换
- 对称密钥交换协议——实现在不安全的信道安全地传输密钥
- 字符串(Linux应用编程篇)
- 从命令行安装Deb文件的5种方法
- python小练习(杂七杂八)
- Git使用的奇技淫巧,看这篇就够了!
- XBL用于防治botnet
- win10 计算机管理器没有ime,win10电脑任务栏输入法初选ime禁用的解决方法
- linux中的du命令和df命令和fdisk命令
- 苏教版四年级下册计算机说课稿,苏教版四年级下册语文《古诗两首》的说课稿4篇...
- 内存完整性已关闭,你的设备可能易受攻击已解决之处理方法
- DBFace: 源码阅读(一)
- 硬盘计算机类比推理,2019年国家公务员考试每日一练:类比推理(15)
热门文章
- 从概念到代码在6个小时内:交付我的第一个Windows Phone应用
- TypeScript代理模式/委托模式
- Windows安装MySql
- 计算机软件实习每日学习打卡(2)20201203
- Aruba 无线调试(Instant AP)
- UiPath发送包含图片或表格的邮件
- 名字里有计算机里没有的字体大小,公安13000字的庞大字库打不出这些字 五市民名字让电脑“犯晕”...
- 百思不得姐php源码,微信小程序实战教程: 仿百思不得姐demo(附源码)
- LSTM实现股票预测
- string之取子串