MinIO
业务中常常涉及文件的操作,公司服务器在上百万个面单文件的压力下常常处于高负载的边缘,于是采用了MinIO寻求解决方案!
概述
MinIO 是一个高性能的对象存储服务,非常适合于存储大容量非结构化的数据。例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等,进而减小服务器的压力
官网
官网地址:https://min.io/
文档地址:https://docs.min.io/
下载地址:https://min.io/download#/windows
MinIO的部署
这里推荐使用Docker部署,简单方便快捷。还没安装Docker的伙伴看下我的Docker入门教程。
docker搜索拉取镜像
[root@pihao /]# docker search minio
NAME DESCRIPTION STARS
minio/minio Minio is an Amazon S3 compatible object stor… 396
minio/mc Minio Client (mc) provides a modern alternat… 20
jessestuart/minio Minio server — supports arm (arm32v6, arm32v… 5
pixelchrome/minio-arm This Dockerfile installs Minio on your ARM-P… 4
[root@pihao /]# docker pull minio/minio 直接下载第一个镜像
.
.
.
下载完毕
启动minio的镜像
# port 端口映射
# -d 后台运行
# --name 取别名
# -v 将容器中 /data 目录下的文件挂载到本机防止文件丢失
# MINIO_ACCESS_KEY 相当于用户名
# MINIO_SECRET_KEY 相当于密码 (Access key length should be at least 3, and secret key length at least 8 characters,注意:账号至少3位,密码至少8位)
[root@pihao /]# docker run -p 9000:9000 -d \
--name my_minio \
-v /home/minio/data:/data \
-e "MINIO_ACCESS_KEY=pihao" \
-e "MINIO_SECRET_KEY=1234abcd" \
minio/minio server /data
[root@pihao /]#
查看启动的容器
[root@pihao /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fd932e49828e minio/minio "/usr/bin/docker-ent…" 5 seconds ago Up 3 seconds 0.0.0.0:9000->9000/tcp my_minio
[root@pihao /]# 启动正常,接着访问 MinIO的Web页面
访问MinIO的页面
# 服务器地址:9000/
http://112.74.167.52:9000/
页面如图
ok,现在MinIO的部署和测试完成。接下来就是调用其API完成文件的上传与下载
Java SDK
使用java测试文件上传与下载
添加maven依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.0.3</version>
</dependency>
文件上传
/**
* 上传本地文件,通过文件路径的方式
*/
@Test
public void uploadFileByFile() throws Exception{
MinioClient minioClient = null;
try {
minioClient = new MinioClient("http://112.74.167.52:9000/", "pihao", "1234abcd");
// 检查存储桶是否已经存在
String bucketName = "pihao";
boolean isExist = minioClient.bucketExists(bucketName);
if(isExist) {
log.info("该存储桶已经存在: {}",bucketName);
} else {
// 创建存储桶,用于存储文件。
minioClient.makeBucket(bucketName);
log.info("存储桶创建成功:{}",bucketName);
}
//上传本地文件
String fileName = "AS830627419CN.pdf";
minioClient.putObject(bucketName,fileName, "D:\\labelTest\\AS830627419CN.pdf");
log.info("文件上传成功:{}",fileName);
} catch (Exception e){
log.info("文件上传失败:{}",e.getMessage());
}
}
文件下载
/**
* 通过流的方式上传文件
*/
@Test
public void uploadFileByStream() throws Exception{
FileInputStream fis = new FileInputStream(new File("D:\\labelTest\\AS830627419CN.pdf"));
MinioClient minioClient = null;
String fileName = "AS830627419CN-2.pdf";
String bucketName = "pihao";
try {
minioClient = new MinioClient("http://112.74.167.52:9000/", "pihao", "1234abcd");
minioClient.putObject(bucketName,fileName,fis,fis.available(),"application/octet-stream");
log.info("文件上传成功:{}",fileName);
} catch (Exception e){
log.error("文件上传失败: {}",e.getMessage());
} finally {
fis.close();
}
/**
* 下载对象
* @throws Exception
*/
@Test
public void downLoadFileFromMiniIO() throws Exception{
MinioClient minioClient = null;
String bucketName = "pihao";
String fileName = "AS830627419CN-2.pdf";
try {
minioClient = new MinioClient("http://112.74.167.52:9000/", "pihao", "1234abcd");
minioClient.statObject(bucketName, fileName); //判断桶中的这个文件存不存在,如果不存在会报错
// 获取文件的输入流。
InputStream stream = minioClient.getObject(bucketName, fileName);
FileOutputStream fos = new FileOutputStream("C:\\Users\\pihao\\Desktop\\"+fileName);
//下载到本地
IOUtils.write(IOUtils.toByteArray(stream),fos);
log.info("文件下载成功:{}",fileName);
} catch (Exception e){
log.error("文件下载失败: {}",e.getMessage());
}
}
整个过程还是相当简单的,至于后面的集群以及分部署部署方式,后面再研究下