# 简介

因为某些需求, 我们需要存储文件, 因此出现了三种存储方案.

  1. 本地磁盘存储
  2. 分布式文件系统

其中MinIo属于分布式文件系统 img

# 部署

使用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

# 快速入门

  1. 引入依赖
     <!-- 对象存储 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>
    
    好像是因为SpringBoot父工程,设置的okHttp3版本过低, 导致minio的里面引入的okHttp3版本很低, 因此这里将其排除后, 重新引入更高的版本.
  2. Minio提前准备
    • 创建 bucket
    • 因为要上传, 所以需要相应的权限, 可以直接将policy设置为public, 即可读可写.
  3. 编写上传代码
    @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月之间的笔记图片, 大概是几十张. 大哭~~ img

更新时间: 2024年5月26日星期日下午4点47分