• MinIO 分布式文件(对象)存储


    1. 简介
      MinIO是高性能、可扩展、云原生支持、操作简单、开源的分布式对象存储产品。

    在中国:阿里巴巴、腾讯、百度、中国联通、华为、中国移动等等9000多家企业也都在使用MinIO产品

    官网地址:http://www.minio.org.cn/

    1. 下载
      官网下载(8.4.3版本):http://www.minio.org.cn/download.shtml
    1、拉取镜像(https://hub.docker.com/r/minio/minio/tags)
    
    # 下载新版minio
    docker pull minio/minio
    
    # 或者下载指定版本的minio
    docker pull minio/minio:RELEASE.2021-04-06T23-11-00Z  
    
    2、创建容器
    
    docker run -p 9000:9000 --name minio -d --restart=always -e "MINIO_ACCESS_KEY=minio" -e "MINIO_SECRET_KEY=minio123" -v /docker/minio/data:/data -v /docker/minio/config:/root/.minio minio/minio server /data
    
    # 或者指定镜像版本并创建容器
    docker run -p 9000:9000 --name minio -d --restart=always -e "MINIO_ACCESS_KEY=minio" -e "MINIO_SECRET_KEY=minio123" -v /docker/minio/data:/data -v /docker/minio/config:/root/.minio minio/minio:RELEASE.2021-04-06T23-11-00Z server /data
    
    -p 9000:9000 ,端口映射
    -e,环境变量
    -d,后台运行
    –name,给容器起名字
    –restart=always,开机自启
    -e “MINIO_ACCESS_KEY=minio”,设置账号
    -e “MINIO_SECRET_KEY=minio123”,设置密码
    -v 挂载数据卷
    07
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    1. 运行
      创建四个文件夹data0、data1、data2、data3,用存放文件。

    「启动minio服务」

    # mac/linux
    ./minio server ./data0 ./data1 ./data2 ./data3
     
    # windows
    minio.exe server ./data0 ./data1 ./data2 ./data3
    访问地址:http://127.0.0.1:9000/,默认账号和密码都是:minioadmin。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述
    4. 创建桶
    在Minio和其他一些对象存储服务中,“桶”(Bucket)是一个顶层的容器,用于组织和管理存储的对象(Object)。可以将桶类比为文件系统中的文件夹,用于将一组相关的对象进行组织和分类。

    每个桶在Minio中具有唯一的名称,并且可以根据需要创建多个桶。用户可以使用桶名称来访问和操作其中的对象。桶名称是全局唯一的,因此需要确保不同应用程序使用不同的桶名称,以避免冲突。

    我们创建一个test的桶(bucket)。

    1. SpringBoot 集成 MinIO
      5.1 pom.xml
      添加如下minio依赖
    <dependency>
        <groupId>io.minio</groupId>
        <artifactId>minio</artifactId>
        <version>8.4.3</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    5.2 MinioConfiguration
    配置minio的地址、账号和密码,配置上传文件的大小1024M。

    @Configuration
    public class MinioConfiguration {
    
        private static final String END_POINT = "http://localhost:9000";
    
        private static final String USERNAME = "minioadmin";
    
        private static final String PASSWORD = "minioadmin";
    
        @Bean
        public MinioClient minioClient() {
            return new MinioClient.Builder()
                    .endpoint(END_POINT)
                    .credentials(USERNAME, PASSWORD)
                    .build();
        }
    
        @Bean
        public MultipartConfigElement multipartConfigElement() {
            MultipartConfigFactory factory = new MultipartConfigFactory();
            factory.setMaxFileSize(DataSize.ofMegabytes(1024));
            factory.setMaxRequestSize(DataSize.ofMegabytes(1024));
            return factory.createMultipartConfig();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    5.3 MinioController
    upload上传文件接口:传入参数bucket,文件保存到minio后会返回fileName。

    getUrl获取文件访问链接接口:传入参数path和bucket,返回可以访问的链接(7天有效)。这里的path就是上传文件的返回值fileName。

    @RequestMapping("minio")
    @RestController
    public class MinioController {
        @Resource
        private MinioClient minioClient;
    
        @PostMapping(value = "upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
        public String upload(@RequestPart("file") MultipartFile file,
                             @RequestParam("bucket") String bucket) {
            try {
                int idx = Objects.requireNonNull(file.getOriginalFilename()).lastIndexOf(".");
                String suffix = file.getOriginalFilename().substring(idx + 1);
                String fileName = UuidUtils.generateUuid() + "." + suffix;
    
                // 保存文件
                minioClient.putObject(PutObjectArgs.builder()
                        .stream(file.getInputStream(), file.getSize(), PutObjectArgs.MIN_MULTIPART_SIZE)
                        .object(fileName)
                        .contentType(file.getContentType())
                        .bucket(bucket)
                        .build());
                return fileName;
            } catch (Exception e) {
                e.printStackTrace();
                return "";
            }
        }
    
        @GetMapping("getUrl")
        public String getUrl(@RequestParam(name = "path") String path,
                             @RequestParam("bucket") String bucket) {
            try {
                // 获取文件访问地址 7天失效
                String url = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
                        .bucket(bucket)
                        .object(path).
                        method(Method.GET)
                        .expiry(7, TimeUnit.DAYS).build());
                return url;
            } catch (Exception e) {
                e.printStackTrace();
                return "";
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    5.4 okhttp3版本不兼容
    如果出现okhttp3版本不兼容的问题,需要在pom.xml的properties节点下加上版本号,如下:

    <okhttp3.version>4.8.1 </okhttp3.version>
    
    • 1

    1、删除自动恢复
    可以测试删除其中一半的存放位置,它过一会儿就自动恢复了,比如删除data0和data1,几分钟它就自动重新创建了文件,并且里面的内容也恢复了。
    在这里插入图片描述

    2、文件夹
    上传的单个文件变成了文件夹

    在这里插入图片描述
    3 分块存储
    点击到里面单个文件被拆分成了许多个小块
    在这里插入图片描述

  • 相关阅读:
    【干货】前后端分离怎么部署?
    优化 | Management Science 7-8月文章精选: 信息系统中的运筹学
    远控新起点,管理有力量!向日葵推出远程办公管理平台2.0
    node使用http模块
    javaWeb使用spring框架时在配置上的编程技巧
    .NET快速对接极光消息推送
    《网络建设与运维》样题
    【站内题解】十六道csdn每日一练Python题解
    【LVGL(重要)】样式属性API函数及其参数
    给定一个大小为 n 的数组 nums ,返回其中的多数元素
  • 原文地址:https://blog.csdn.net/weixin_45817985/article/details/134227332