# 简介
因为某些需求, 我们需要存储文件, 因此出现了三种存储方案.
- 本地磁盘存储
- 分布式文件系统
其中MinIo属于分布式文件系统
# 部署
使用docke部署
docker run -p 9000:9000 --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
# 快速入门
- 引入依赖好像是因为SpringBoot父工程,设置的okHttp3版本过低, 导致minio的里面引入的okHttp3版本很低, 因此这里将其排除后, 重新引入更高的版本.
<!-- 对象存储 MinIO --> <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.4.5</version> <exclusions> <exclusion> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.9.0</version> </dependency>
- Minio提前准备
- 创建 bucket
- 因为要上传, 所以需要相应的权限, 可以直接将policy设置为
public
, 即可读可写.
- 编写上传代码
@SpringBootTest public class MinioTest { @Test public void upload(){ try { //1. 创建minio客户端 MinioClient minioClient = MinioClient.builder() //参数1: 访问key, 参数2: 秘钥 .credentials("minioadmin", "minioadmin") //Minio的服务器地址 .endpoint("http://centos:9000") .build(); //2. 准备上传参数 FileInputStream fis = new FileInputStream("D:\\list.html"); PutObjectArgs putObjectArgs = PutObjectArgs.builder() .object("list.html") //文件名 .contentType("text/html") //文件类型 .bucket("leadnews") //桶名, 上传到的桶名 //参数2是 当前文件剩余读取的字节数 //参数3为-1, 为全部上传. .stream(fis, fis.available(), -1) .build(); //3. 上传 minioClient.putObject(putObjectArgs); } catch (Exception e) { throw new RuntimeException(e); } } }
# 问题记录
- 上传失败原因之一: 访问权限不足, 设置policy为public
- 上传失败原因之一: minio的系统linux的时区与上传客户端不符(时间不一样)
# 旧版数据迁移.
Minio单节点会使用 纠错码方案存储数据, 每一个图片上传后都是一个文件夹, 新版的Minio的单节点存储则是直接存储文件, 如果直接将旧版的数据格式拷贝到新版的数据文件夹下,是无法识别这些原本为图片的文件的.
因此我们需要先用旧版的Minio, 进行下载, 然后将原文件上传到新版.
已知的旧版的版本:minio/minio:RELEASE.2023-06-02T23-17-26Z
最后说一次, 数据无价, 一定要勤备份笔记图片, 以此纪念我在阿里云中丢失的 2023年8月到10月之间的笔记图片, 大概是几十张. 大哭~~