zl程序教程

您现在的位置是:首页 >  IT要闻

当前栏目

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

2023-02-18 16:40:38 时间

@

实战使用

设置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;
        }
    }
}

后续直接访问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

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

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/

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服务器的控制台日志

Java客户端使用

引入依赖

    <dependency>
      <groupId>io.minio</groupId>
      <artifactId>minio</artifactId>
      <version>8.4.3</version>
    </dependency>

创建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());
        }
    }
}

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

通过查看控制台也显示在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());
        }
    }
}

通过查看控制台也显从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>

创建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();
    }
}

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

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