分布式文件系統 (Distributed File System, DFS) 是指文件系統管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点(可简单的理解为一台计算机)相连;或是若干不同的逻辑磁盘分区或卷标组合在一起而形成的完整的有层次的文件系统。DFS为分布在网络上任意位置的资源提供一个逻镇上的树形文件系统结构,从而使用户访问分布在网络上的共享文件更加简便。单独的DFS共享文件夹的作用是相对于通过网络上的其他共享文件夹的访问点 。

通过概念可以简单理解为:一个计算机无法存储海量的文件,通过网络将若干计算机組织起来共同去存储海量的文件,去接收海量用户的请求,这些组织起来的计算机通过网络进行通信,如下图:

相关产品

1、NFS

NFS一般指网络文件系统。 网络文件系统,英文Network File System(NFS),是由SUN公司研制的UNIX表示层协议(presentation layer protocol),能使使用者访问网络上别处的文件就像在使用自己的计算机一样。

特点:

1)在客户端映射NFS服务器的驱动器。

2)客户端通过网络访问NFS服务器的硬盘完全透明。

2、GFS

GFS是一个可扩展的分布式文件系统,用于大型的、分布式的、对大量数据进行访问的应用。它运行于廉价的普通硬件上,并提供容错功能。它可以给大量的用户提供总体性能较高的服务

1)GFS采用主从结构,一个GFS集群由一个master和大量的chunkserver组成。
2)master存储了数据文件的元数据,一个文件被分成了若干块存储在多个chunkserver中。
3)用户从master中获取数据元信息,向chunkserver存储数据。

3、HDFS

HDFS,Hadoop Distribute File System(Hadoop分布式文件系统)的简称,它是Hadoop核心组件之一,是大数据生态圈最底层的分布式存储服务。将计算靠近数据,而不是将数据移动到离计算更近的地方,使得应用的计算更有效率。

HDFS遵循主从架构(master/slave)。通常包括一个主节点和多个从节点。主节点为NameNode,从节点为DataNode。

4、云计算厂家

阿里云对象存储服务(Object Storage Service,简称OSS)

百度云对象存储服务(Baidu Object Storage,简称BOS)

MinIO

MinIO基于Apache License v2.0开源协议的对象存储服务,可以做为云存储的解决方案用来保存海量的图片,视频,文档。

uGolang语言实现,配置简单,单行命令可以运行起来。

uMinIO兼容亚马逊S3云存储服务接口,适合于存储大容量非结构化的数据,一个对象文件可以是任意大小,从几kb到最大5T不等。

官网文档:http://docs.minio.org.cn/docs/

安装MinIO

①:拉取镜像

docker pull minio/minio

②:创建容器

docker run -p 9000:9000 -p 9001:9001 \
--name minio \
-d --restart=always \
-e "MINIO_ACCESS_KEY=minio" \
-e "MINIO_SECRET_KEY=minio123" \
-v /home/data:/data \
-v /home/config:/root/.minio \
minio/minio server /data \
--console-address ":9001"

③:访问minio系统

http://ip:9001

配置MinIO

找到learning-online-media-service工程,添加MinIO的配置类

创建配置属性MinIOConfigProperties类,内容如下:

MinIOConfigProperties
@Data
@ConfigurationProperties(prefix = "minio") // 文件上传 配置前缀file.oss
public class MinIOConfigProperties implements Serializable {
private String accessKey;
private String secretKey;
private String endpoint;
private Map<String, String> bucket;
}

在Nacos中配置这些属性:

media-service-dev.yaml
minio:
endpoint: http://124.221.23.47:9000
accessKey: minio
secretKey: minio123
bucket:
files: mediafiles
video: video

创建MinIO客户端配置类

MinIOConfig
@Configuration
@EnableConfigurationProperties({MinIOConfigProperties.class})
//当引入FileStorageService接口时
@ConditionalOnClass(FileStorageService.class)
public class MinIOConfig {

@Autowired
private MinIOConfigProperties minIOConfigProperties;

@Bean
public MinioClient buildMinioClient() {
return MinioClient
.builder()
.credentials(minIOConfigProperties.getAccessKey(), minIOConfigProperties.getSecretKey())
.endpoint(minIOConfigProperties.getEndpoint())
.build();
}
}

MinIO Service

找到learning-online-media-service工程,在包com.swx.media.service下创建接口类MinIOFileStorageService

MinIOFileStorageService
public interface FileStorageService {
}

在包com.swx.media.service.impl下实现该接口

MinIOFileStorageService
@Slf4j
@EnableConfigurationProperties(MinIOConfigProperties.class)
@Import(MinIOConfig.class)
@Service
public class MinIOFileStorageService implements FileStorageService {

private final static String separator = "/";

/**
* @param dirPath
* @param filename yyyy/mm/dd/file.jpg
* @return
*/
public String builderFilePath(String dirPath, String filename) {
StringBuilder stringBuilder = new StringBuilder(50);
if (!StringUtils.isEmpty(dirPath)) {
stringBuilder.append(dirPath).append(separator);
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
String todayStr = sdf.format(new Date());
stringBuilder.append(todayStr).append(separator);
stringBuilder.append(filename);
return stringBuilder.toString();
}
}