• 高性能云原生数据对象存储MinIO实战-中


    实战使用

    设置Nginx代理

    前面我们部署4个节点的MinIO Server,更为合理的使用的用Nginx配置代理转发实现客户端接入高可用及负载均衡。

    user  root;
    worker_processes  1;
    
    events {
        worker_connections  1024;
    }
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        tcp_nopush     on;
        server_tokens off;
        tcp_nodelay on;
        keepalive_timeout  10;
        client_header_timeout 10;
        client_body_timeout 10;
        reset_timedout_connection on;
        send_timeout 10;
        limit_conn_zone $binary_remote_addr zone=addr:5m;
        limit_conn addr 100;
        
        gzip  on;
        gzip_disable "msie6";
        gzip_proxied any;
        gzip_min_length 1000;
        gzip_comp_level 6;
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
    
        open_file_cache max=100000 inactive=20s;
        open_file_cache_valid 30s;
        open_file_cache_min_uses 2;
        open_file_cache_errors on;
    
        limit_req_zone $binary_remote_addr zone=myRateLimit:100m rate=1r/s;
        upstream minio {
            server 192.168.5.52:9900 weight=1;
            server 192.168.5.53:9900 weight=1;
            server 192.168.50.95:9900 weight=1;
            server 192.168.12.28:9900 weight=1;
        }
        upstream minio-console {
            server 192.168.5.52:9901 weight=1;
            server 192.168.5.53:9901 weight=1;
            server 192.168.50.95:9901 weight=1;
            server 192.168.12.28:9901 weight=1;
        }
        server {
            listen     9900;
            server_name  localhost;
            location / {
                    proxy_set_header Host $host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_pass http://minio;
            }
        }
        server {
            listen     9901;
            server_name  localhost;
            location / {
                    proxy_set_header Host $host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_pass http://minio-console;
            }
        }
    }
    
    • 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
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68

    后续直接访问Nginx 服务器的9900和9901端口接口,访问http://192.168.50.156:9901/ 出现登录页面

    image-20220805145306238

    创建用户

    • MinIO用户由唯一的接入密钥(用户名)和对应的密钥(密码)组成。客户端必须通过指定有效的访问密钥(用户名)和现有MinIO用户的相应密钥(密码)来验证其身份。
    • 组提供了一种简化的方法,用于管理具有常见访问模式和工作负载的用户之间的共享权限。
    • 用户通过所属的组继承对数据和资源的访问权限。
    • MinIO使用基于策略的访问控制(Policy-Based Access Control, PBAC)来定义经过身份验证的用户可以访问的授权操作和资源。每个策略描述一个或多个操作和条件,这些操作和条件概述了一个或一组用户的权限。
    • 每个用户只能访问内置角色显式授予的资源和操作。默认情况下,MinIO拒绝访问任何其他资源或操作。

    点击创建用户按钮输入用户信息

    image-20220805152504203

    创建组,选择用户

    image-20220805153116937

    创建服务账号

    image-20220805160221267

    MinIO客户端使用

    # 下载客户端,可以按需下载
    wget https://dl.min.io/client/mc/release/linux-amd64/mc
    # 赋执行权限
    chmod +x mc
    # 拷贝到/usr/local/sbin/
    cp mc /usr/local/sbin/
    # mc命令帮助
    ./mc --help
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    MinIO Client (mc)为ls,cat,cp,mirror,diff,find等UNIX命令提供了一种替代方案。它支持文件系统和兼容Amazon S3的云存储服务(AWS Signature v2和v4)。

    alias       在配置文件中设置、删除和列出别名
    ls          列出文件和文件夹。
    mb          创建一个存储桶或一个文件夹
    rb          删除一个桶
    cp          拷贝文件和对象。
    mirror      给存储桶和文件夹做镜像。
    cat         显示文件和对象内容。
    head        显示对象的第一个'n'行
    pipe        将一个STDIN重定向到一个对象或者文件或者STDOUT。
    share       生成用于共享的URL。
    find        基于参数查找文件。
    sql         在对象上运行SQL查询
    stat        显示对象的元数据
    mv          移动对象 
    tree        以树格式列出存储桶和对象
    du          递归总结磁盘使用情况
    retention   设置对象和桶的保留率
    legalhold   设置对象的合法持有权
    diff        列出两个桶之间对象名称、大小和日期的差异
    rm          删除文件和对象。
    version     输出版本信息
    ilm         生命周期管理桶
    encrypt     管理桶加密配置
    event       管理对象通知。
    watch       监视文件和对象的事件
    undo        撤销更新/删除操作
    policy      管理访问策略
    tag         管理桶和对象的标签
    replicate   配置服务器端桶复制
    admin       管理MinIO服务器
    update      更新MC到最新版本
    support     更新MC到最新版本
    
    # 查询 mc host配置
    mc config host ls
    # 添加minio服务
    mc config host add minio-server http://192.168.5.52:9900 miniotest miniotest123
    # 删除host
    mc config host remove minio-server
    
    • 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

    image-20220805152724968

    # 显示所有桶
    mc ls minio-server
    # 创建桶
    mc mb minio-server/mybucket
    # 显示所有桶
    mc ls minio-server
    # 上传文件
    mc cp /home/commons/jdk-8u112-linux-x64.tar.gz minio-server/file
    # 下载文件
    mc cp minio-server/file/jdk-8u112-linux-x64.tar.gz /home/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    image-20220805155406363

    image-20220805155441703

    MinIO Client(mc)提供了“ admin”子命令来对您的MinIO部署执行管理任务。页面上可以操作功能如管理用户、用户组、策略都可以使用mc admin来操作

    service              服务重启并停止所有MinIO服务器
    update               更新更新所有MinIO服务器
    info                 信息显示MinIO服务器信息
    user                 用户管理用户
    group                小组管理小组
    policy               MinIO服务器中定义的策略管理策略
    replicate            管理MinIO站点复制
    config               配置管理MinIO服务器配置
    decommission, decom  管理MinIO服务器池解除
    heal                 修复MinIO服务器上的磁盘,存储桶和对象
    prometheus           Prometheus管理Prometheus配置
    kms                  kms执行KMS管理操作
    bucket               管理MinIO服务器中定义的桶
    tier                 管理远程层目标,用于ILM转换
    top                  顶部提供MinIO的顶部统计信息
    trace                跟踪显示MinIO服务器的http跟踪
    console              控制台显示MinIO服务器的控制台日志
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    Java客户端使用

    引入依赖

        <dependency>
          <groupId>io.minio</groupId>
          <artifactId>minio</artifactId>
          <version>8.4.3</version>
        </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    创建MinIOFileUploader 文件上传演示工程

    package com.itxs;
    
    import io.minio.BucketExistsArgs;
    import io.minio.MakeBucketArgs;
    import io.minio.MinioClient;
    import io.minio.UploadObjectArgs;
    import io.minio.errors.MinioException;
    import java.io.IOException;
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    
    public class MinIOFileUploader {
    
        public static void main(String[] args)
                throws IOException, NoSuchAlgorithmException, InvalidKeyException {
            try {
                // Create a minioClient with the MinIO server playground, its access key and secret key.
                MinioClient minioClient =
                        MinioClient.builder()
                                .endpoint("http://192.168.5.52:9900")
                                .credentials("J8LjOoIIvPYEeuQ7", "UiSVBMr3UeMHvIutwobOvpUifMZMNAvK")
                                .build();
                // Make 'newbucket' bucket if not exist.
                boolean found =
                        minioClient.bucketExists(BucketExistsArgs.builder().bucket("newbucket").build());
                if (!found) {
                    // Make a new bucket called 'asiatrip'.
                    minioClient.makeBucket(MakeBucketArgs.builder().bucket("newbucket").build());
                } else {
                    System.out.println("Bucket 'newbucket' already exists.");
                }
                minioClient.uploadObject(
                        UploadObjectArgs.builder()
                                .bucket("newbucket")
                                .object("tinyid-server-1.0-001.tar.gz")
                                .filename("G:/tinyid-server-1.0.tar.gz")
                                .build());
                System.out.println(
                        "'G:/tinyid-server-1.0.tar.gz' is successfully uploaded as "
                                + "object 'tinyid-server-1.0-001.tar.gz' to bucket 'newbucket'.");
            } catch (MinioException e) {
                System.out.println("Error occurred: " + e);
                System.out.println("HTTP trace: " + e.httpTrace());
            }
        }
    }
    
    • 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

    启动测试程序,可以看输出上传文件成功日志

    通过查看控制台也显示在newbucket的新上传的文件

    image-20220805170355553

    创建MinIOFileDownloader 文件下载演示工程

    package com.itxs;
    
    import io.minio.*;
    import io.minio.errors.MinioException;
    import java.io.IOException;
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    
    public class MinIOFileDownloader {
    
        public static void main(String[] args)
                throws IOException, NoSuchAlgorithmException, InvalidKeyException {
            try {
                // Create a minioClient with the MinIO server playground, its access key and secret key.
                MinioClient minioClient =
                        MinioClient.builder()
                                .endpoint("http://192.168.5.52:9900")
                                .credentials("J8LjOoIIvPYEeuQ7", "UiSVBMr3UeMHvIutwobOvpUifMZMNAvK")
                                .build();
                minioClient.downloadObject(
                        DownloadObjectArgs.builder()
                                .bucket("newbucket")
                                .object("tinyid-server-1.0-001.tar.gz")
                                .filename("G:/my-tinyid-server-1.0-001.tar.gz")
                                .build());
                System.out.println("bucket 'newbucket' 'tinyid-server-1.0-001.tar.gz' is successfully downloaded as "
                                + "object 'G:/my-tinyid-server-1.0-001.tar.gz'");
            } catch (MinioException e) {
                System.out.println("Error occurred: " + e);
                System.out.println("HTTP trace: " + e.httpTrace());
            }
        }
    }
    
    • 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

    通过查看控制台也显从newbucket的下载了文件,本地磁盘也有该文件

    image-20220805180758918

    SpringBoot Starter使用

    针对前面官网的Java客户端代码可以直接包装成springboot starter使用,也比较简单。而这里使用GitHub上已封装好的源码资源jlefebure/spring-boot-starter-minio,下载源码后可以修改spring-boot-starter-parent版本为较新的2.7.1,修改打包的版本号为1.11,执行maven install

    image-20220805182142086

    使用之前的一个SpringBoot测试项目由于jlefebure/spring-boot-starter-minio依赖都是使用provided,因此需要引入如下依赖

            <dependency>
                <groupId>com.squareup.okhttp3</groupId>
                <artifactId>okhttp</artifactId>
                <version>4.10.0</version>
            </dependency>
            <dependency>
                <groupId>io.minio</groupId>
                <artifactId>minio</artifactId>
                <version>8.4.3</version>
            </dependency>
            <dependency>
                <groupId>com.jlefebure</groupId>
                <artifactId>spring-boot-starter-minio</artifactId>
                <version>1.11</version>
            </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    创建MinIO测试控制器MinioTestController.java

    package cn.aotain.controller;
    
    import com.jlefebure.spring.boot.minio.MinioException;
    import com.jlefebure.spring.boot.minio.MinioService;
    import org.apache.tomcat.util.http.fileupload.IOUtils;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.core.io.InputStreamResource;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.URLConnection;
    import java.nio.file.Paths;
    import java.util.List;
    
    @RestController
    @RequestMapping("/minio")
    public class MinioTestController {
        @Autowired
        private MinioService minioService;
    
        @GetMapping("/")
        public List<io.minio.messages.Item> testMinio(){
            return minioService.list();
        }
    
        @GetMapping("/{object}")
        public void getObject(@PathVariable("object") String object, HttpServletResponse response) throws MinioException, IOException {
            InputStream inputStream = minioService.get(Paths.get("", object));
            // Set the content type and attachment header.
            response.addHeader("Content-disposition", "attachment;filename=" + object);
            response.setContentType(URLConnection.guessContentTypeFromName(object));
    
            // Copy the stream to the response's output stream.
            IOUtils.copy(inputStream, response.getOutputStream());
            response.flushBuffer();
        }
    }
    
    • 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

    浏览器输入http://localhost:8080/minio/tinyid-server-1.0-001.tar.gz 后成功下载前面上传的文件,MinioService也封装很多的方法,这些方法可以自行再测试下。

    **本人博客网站 **IT小神 www.itxiaoshen.com

  • 相关阅读:
    17 Linux 中断
    【软件测试】单元测试、集成测试、系统测试有什么区别?
    5.Array扩展
    态路小课堂丨光纤跳线的使用与维护小指南
    2023全国大学生软件测试大赛开发者测试练习题99分答案(ScapegoatTree2023)
    事件溯源(Event Sourcing)和命令查询责任分离(CQRS)经验
    Autosar MCAL配置——SPI(EB)
    Flink1.17 DataStream API
    进行日常记账后,怎样导出表格
    【Vue】vue项目用qrcodejs2生成带log的二维码图片,vue生成二维码图片中间带log,自定义log
  • 原文地址:https://blog.csdn.net/qq_20949471/article/details/126203971