分布式 文件系统(FastDFS/MinIO)
一、FastDFS
简介:FastDFS是一个开源的高性能轻量级分布式文件系统,使用C语言编写的,含文件上传、同步、访问、下载及大容量存储和负载均衡等功能,解决了海量文件数据存储的问题,适合存储大小为4KB~500MB的文件。
1、核心概念
A. 跟踪服务器(Tracker Server):主要负责调度,起到均衡作用,负责管理器所有的Storage Server和group,每个storage在启动后会连接Tracker,告知自己所属group等信息,并保持周期性心跳;
B. 存储服务器(Storage Server):主要提供容量和备份服务,以group为单位,每个group中可以有多台Storage Server,数据互为备份,存储空间以group容量最小的为准;
C. 客户端(Client):上传下载文件的服务器,业务请求的发起方,通过专有接口,使用TCP/IP协议与跟踪服务器或存储节点进行数据交互。
2、文件上传
A. client询问tracker分配哪个storage存储,tracker返回一台可用的storage;
B. client直接和storage通讯完成文件上传;
C. storage保存文件以后给client返回组名和文件名。
3、文件下载
A. client询问tracker下载文件的storage,参数为文件标识;
B. tracker返回一台可用的storage;
C. client直接和storage通讯完成文件下载;
注意:可以结合nginx来完成下载
4、通讯协议:客户端与服务端通讯时采用的是自定义的通讯协议,协议包由header和body组成。
5、常见错误
A. 错误一:上传文件时报错误码28,磁盘空间不足
异常如下:
com.github.tobato.fastdfs.exception.FdfsServerException: 错误码:28,错误信息:没有足够的存储空间 at com.github.tobato.fastdfs.exception.FdfsServerException.byCode(FdfsServerException.java:54) at com.github.tobato.fastdfs.proto.ProtoHead.validateResponseHead(ProtoHead.java:119) at com.github.tobato.fastdfs.proto.AbstractFdfsCommand.receive(AbstractFdfsCommand.java:101) at com.github.tobato.fastdfs.proto.AbstractFdfsCommand.execute(AbstractFdfsCommand.java:45) at com.github.tobato.fastdfs.conn.ConnectionManager.execute(ConnectionManager.java:76) at com.github.tobato.fastdfs.conn.TrackerConnectionManager.executeFdfsTrackerCmd(TrackerConnectionManager.java:73) at com.github.tobato.fastdfs.service.DefaultTrackerClient.getStoreStorage(DefaultTrackerClient.java:55) at com.github.tobato.fastdfs.service.DefaultGenerateStorageClient.uploadFile(DefaultGenerateStorageClient.java:54) -------... at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:746) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88)
解决办法:修改tracker.conf中reserved_storage_space参数,预留磁盘空间,也就是磁盘可用容量不能低于这个值
可参考:FastDFS官网
二、MinIO
简介:MinIO是Apache下开源的一个非常轻量级的对象存储服务,非常适合存储大容量非结构化的数据,比如图片、文件和视频等,其大小可以是0B~5TB之间。支持JavaScript、Java等多种语言,支持分布式存储,具有高扩展性和高可用性,相比FastDFS部署更简单且支持多实例。
可参考:MinIO官方文档