0


MinIO

文章目录

MinIO概述

Docker单节点部署

docker run \
-dit \
--net=host \
--name minio \
-v /mnt/data/minio/data:/data \
-v /mnt/data/minio/config:/root/.minio  \
-e "MINIO_ROOT_USER=minio"   \
-e "MINIO_ROOT_PASSWORD=minioadmin"  \
minio/minio server /data \
--console-address ":9001" -address ":9000"

说明:
–net=host 网络模式是直连模式
–name minio 容器的名称是MinIO
-v /mnt/data/minio/data:/data 定义数据在宿主机的保存位置
-v /mnt/data/minio/config:/root/.minio 定义配置在宿主机的保存位置
-e “MINIO_ROOT_USER=minio” 登录账户是minio
-e “MINIO_ROOT_PASSWORD=minioadmin” 登录密码是minioadmin
–console-address “:9001” -address “:9000” 图形化客户端的端口是9001,api交互端口是9000

MINIO 集群搭建

使用五台服务器,安排如下
服务器作用*...75Nginx反向代理,以及https*...76minio节点*...77minio节点,管理节点(处理所有的请求)...178minio节点...179minio节点

1. 下载文件

下载软件安装包,我是用的是CentOS系统,系统架构是arrch64。所以下载linux-amd64版本的软件安装包。
https://dl.min.io/server/minio/release/linux-amd64/minio

2. 创建文件保存地址

在每台服务器上创建一个文件夹,用于保存MinIO的数据和配置。文件夹位置和名称随意。
例如我在CentOS的根目录下有个software文件,是软件的安装目录。然后在其中创建minio文件夹,其中的config文件夹用于保存MinIO的配置文件,data文件夹用于保存数据文件。

cd /software
mkdir minio
cd  minio
mkdir config
mkdir data

3. 配置账户和密码

在启动软件之前我们可以配置一些参数。

# 配置MinIO的用户名和密码,若未配置,则默认账号和密码均为 minioadmin
export MINIO_ROOT_USER=minio
export MINIO_ROOT_PASSWORD=minioadmin

#为文件分享网址。若未设置,则默认为本身的容器 IP,不可正常使用。若使用了 nginx 反向代理,则更需要设置此参数;
export MINIO_SERVER_URL=http://*.*.*.77:9000

# 为 Console 管理平台登录网址,若不希望通过浏览器登录,可以增加 MINIO_BROWSER: off,禁止浏览器登录;
export MINIO_BROWSER_REDIRECT_URL=http://*.*.*.77:9001

4. 执行脚本

在和minio软件相同目录下执行如下命令。

./minio server \
--config-dir /software/minio/config \
--address ":9000" \
--console-address ":9001" \
http://*.*.*.76:9000/software/minio/data \
http://*.*.*.77:9000/software/minio/data \
http://*.*.*.178:9000/software/minio/data \
http://*.*.*.179:9000/software/minio/data

后台启动使用 nohup

配置 Nginx 代理

如果想要在MinIO中使用HTTPS,我试过两种方式,一个是在MinIO的配置文件中添加证书文件,另一个就是使用Nginx代理https请求。目前集群方式我推荐使用Nginx的方式。

配置文件

在Nginx的配置文件中添加如下配置:

worker_processes  2;

#配置Nginx worker进程最大打开文件数
worker_rlimit_nofile 65535;

events {
    #单个进程允许的客户端最大连接数
    worker_connections  1024;
    #使用epoll模型
    use epoll;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    #nginx优化----------------------
    #隐藏版本号
    server_tokens on;

    #优化服务器域名的散列表大小
    server_names_hash_bucket_size 64;
    server_names_hash_max_size 2048;

    #开启高效文件传输模式
    sendfile on;

    #减少网络报文段数量
    #tcp_nopush on;

    #提高I/O性能
    tcp_nodelay on;

    #连接超时 时间定义 默认秒 默认65秒
    keepalive_timeout 60;

    #读取客户端请求头数据的超时时间 默认秒 默认60秒
    client_header_timeout 15;

    #读取客户端请求主体的超时时间 默认秒 默认60秒
    client_body_timeout 15;

    #响应客户端的超时时间 默认秒 默认60秒
    send_timeout 15;

    #上传文件的大小限制  默认1m
    client_max_body_size 1024m;

    #gzip  on;

    # minio 集群反向代理
    server {
        # 端口可以自定义
        listen       9443 ssl;
        server_name  *.*.*.75;
        
        # 证书的地址要绝对路径,最好保存在MinIO的config文件夹中,以免忘记。
        ssl_certificate      /software/minio/config/public.crt;
        ssl_certificate_key  /software/minio/config//private.key;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        ignore_invalid_headers off;
        client_max_body_size 0;
        proxy_buffering off;

        location / {      
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Host $http_host;
            proxy_set_header X-Forwarded-Port $server_port;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header Host $http_host;

            proxy_connect_timeout 300;
            proxy_http_version 1.1;
            proxy_set_header Connection "upgrade";
            proxy_set_header Upgrade $http_upgrade;            
            chunked_transfer_encoding off;

            proxy_pass http://*.*.*.77:9000;
        }
    }
}

关于生成https的证书,可以参考 https://blog.csdn.net/You_are_my_zing/article/details/124448893 这篇文章中的certgen生成证书工具。

Java客户端使用

最低要求

Java 1.8 及以上

Maven依赖

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

构建客户端

普通客户端

MinioClient minioClient =
    MinioClient.builder(
        .endpoint("http://play.min.io")
        .credentials("Q3AM3UQ867SPQQA43P2F", "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG")
        .build();

构建 Https 客户端

因为目前使用的Https证书是私签证书,通过OpenSSL等工具生成SSL证书,不被浏览器信任,仍然显示不安全。同时也无法通过普通客户端的方式访问,所以我们需要做如下改动就可以正常使用。

final TrustManager[] trustAllCerts = new TrustManager[]{
    new X509TrustManager() {
        @Override
        public void checkClientTrusted(X509Certificate[] x509Certificates, String s){
        }

        @Override
        public void checkServerTrusted(X509Certificate[] x509Certificates, String s){
        }

        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return new X509Certificate[]{};
        }
    }
};

    X509TrustManager x509TrustManager = (X509TrustManager) trustAllCerts[0];
    final SSLContext sslContext = SSLContext.getInstance("SSL");
    sslContext.init(null, trustAllCerts, new SecureRandom());
    final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
    OkHttpClient.Builder builder = new OkHttpClient.Builder();
    builder.sslSocketFactory(sslSocketFactory,x509TrustManager);

    builder.hostnameVerifier((s, sslSession) -> true);
    OkHttpClient okHttpClient = builder.build();
    MinioClient client = MinioClient.builder()
                                    # 这里配置的IP和PORT一定要是Nginx的地址,不然会因为IP和端口的不同出现数据签名不正确的问题。
                                    .endpoint("https://*.*.*.75", 9443, true)
                                    .httpClient(okHttpClient).region("eu-west-1")
                                    .credentials("username", "password")
                                    .build();

桶操作

对象操作

getPresignedObjectUrl(GetPresignedObjectUrlArgs args)

获取 HTTP 方法、到期时间和自定义请求参数的对象的预签名 URL。

public String getPresignedObjectUrl(GetPresignedObjectUrlArgs args)

参数
参数类型描述argsGetPresignedObjectUrlArgs参数
返回值
String - URL字符串

示例

  1. 下载URL
// 获取预签名的 URL 字符串用于下载“my-bucketname”中的“my-objectname”,有效期为 2 小时。
// 此外,还添加“响应内容类型”以动态设置服务器响应的内容类型。不是直接下载文件,而是在浏览器展示。

Map<String, String> reqParams = new HashMap<String, String>();
reqParams.put("response-content-type", "application/json");
String url =
   minioClient.getPresignedObjectUrl(
       GetPresignedObjectUrlArgs.builder()
           .method(Method.GET)
           .bucket("my-bucketname")
           .object("my-objectname")
           .expiry(2, TimeUnit.HOURS)
           .extraQueryParams(reqParams)
           .build());
System.out.println(url);
  1. 上传URL
// 获取预签名的 URL 字符串,用于在“my-bucketname”中上传过期时间为 1 天的“my-objectname”。

String url =
   minioClient.getPresignedObjectUrl(
       GetPresignedObjectUrlArgs.builder()
           .method(Method.PUT)
           .bucket("my-bucketname")
           .object("my-objectname")
           .expiry(1, TimeUnit.DAYS)
           .build());
System.out.println(url);

生成上传的URL后,使用PUT请求发送数据,文件要使用body里面的binary方式上传。

  1. 查看元数据
// 获取预签名的 URL 字符串,以查找“my-bucketname”中“my-objectname”的元数据,有效期为 2 小时。
// 此外,还添加“响应内容类型”以动态设置服务器响应的内容类型。
// 在自签名的https中存在SignatureDoesNotMatch的问题

Map<String, String> reqParams = new HashMap<String, String>();
reqParams.put("response-content-type", "application/json");

String url =
   minioClient.getPresignedObjectUrl(
       GetPresignedObjectUrlArgs.builder()
           .method(Method.HEAD)
           .bucket("my-bucketname")
           .object("my-objectname")
           .expiry(2, TimeUnit.HOURS)
           .extraQueryParams(reqParams)
           .build());
System.out.println(url);

本文转载自: https://blog.csdn.net/You_are_my_zing/article/details/128471616
版权归原作者 馥凝儒雅 所有, 如有侵权,请联系我们删除。

“MinIO”的评论:

还没有评论