MinIO对象存储服务

MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。试用相比 hadoop hdfs 分布式存储服务轻量很多。且支持单节点部署,非常容易上手。推荐使用!

官网地址,含官方文档

http://docs.minio.org.cn/docs/

部署

单节点部署

#1 下载地址
https://dl.min.io/server/minio/release/windows-amd64/minio.exe

#2 cmd 启动 server 指定数据存储目录
minio.exe server E:\data1

#3 启动日志如下
Endpoint:  http://169.254.6.240:9000  http://169.254.157.192:9000  http://169.254.87.123:9000  http://192.168.10.112:9000  http://169.254.0.44:9000  http://169.254.143.36:9000  http://127.0.0.1:9000

Browser Access:
   http://169.254.6.240:9000  http://169.254.157.192:9000  http://169.254.87.123:9000  http://192.168.10.112:9000  http://169.254.0.44:9000  http://169.254.143.36:9000  http://127.0.0.1:9000

Object API (Amazon S3 compatible):
   Go:         https://docs.min.io/docs/golang-client-quickstart-guide
   Java:       https://docs.min.io/docs/java-client-quickstart-guide
   Python:     https://docs.min.io/docs/python-client-quickstart-guide
   JavaScript: https://docs.min.io/docs/javascript-client-quickstart-guide
   .NET:       https://docs.min.io/docs/dotnet-client-quickstart-guide
Detected default credentials 'minioadmin:minioadmin', please change the credentials immediately using 'MINIO_ACCESS_KEY' and 'MINIO_SECRET_KEY'
Exiting on signal: INTERRUPT

分部署部署

  • 分布式Minio里所有的节点需要有同样的access秘钥和secret秘钥,这样这些节点才能建立联接。为了实现这个,你需要在执行minio server命令之前,先将access秘钥和secret秘钥export成环境变量。
  • 分布式Minio使用的磁盘里必须是干净的,里面没有数据。
  • 分布式Minio里的节点时间差不能超过3秒
  • 分布式部署至少需要4个节点,否则启动会报错

linux 启动分布式Minio实例,4个节点,每节点1块盘;命令需要在每个服务器执行一遍

export MINIO_ACCESS_KEY=minioadmin
export MINIO_SECRET_KEY=minioadmin
minio server http://192.168.10.11/data1 http://192.168.10.12/data2 \
               http://192.168.10.13/data3 http://192.168.10.14/data4 \

win 启动分布式Minio实例,1个节点,4块盘(目前win分布式部署处于实验阶段慎重使用)

set MINIO_ACCESS_KEY=minioadmin
set MINIO_SECRET_KEY=minioadmin
minio.exe server http://192.168.10.112/E:/data1 http://192.168.10.112/E:/data2 http://192.168.10.112/E:/data3 http://192.168.10.112/E:/data4

在这里插入图片描述
在这里插入图片描述

UI查看

#账号密码 'minioadmin'
http://127.0.0.1:9000

在这里插入图片描述

客户端

Maven依赖

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

上传功能

public static void main(String[] args) {
    try {
        // 使用MinIO服务的URL,端口,Access key和Secret key创建一个MinioClient对象
        MinioClient minioClient = new MinioClient("http://192.168.10.112:9000", "minioadmin", "minioadmin");
        // 检查存储桶是否已经存在
        boolean isExist = minioClient.bucketExists("asiatrip");
        if(isExist) {
            System.out.println("Bucket already exists.");
        } else {
            // 创建一个名为asiatrip的存储桶,用于存储照片的zip文件。
            minioClient.makeBucket("asiatrip");
        }
        // 使用putObject上传一个文件到存储桶中。
        // 存储桶\上传文件名称\上传文件目录\PutObjectOptions(上传InputStream对象时传)
        minioClient.putObject("asiatrip","0.zip", "E:/0.zip",null);
        System.out.println(" End:"+sdf.format(new Date()));
    } catch(MinioException e) {
        System.out.println("Error occurred: " + e);
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (InvalidKeyException e) {
        e.printStackTrace();
    }
}

在这里插入图片描述

下载功能

public static void main(String[] args) {
    try {
        // 使用MinIO服务的URL,端口,Access key和Secret key创建一个MinioClient对象
        MinioClient minioClient = new MinioClient("http://192.168.10.112:9000", "minioadmin", "minioadmin");
        try {
            // 调用statObject()来判断对象是否存在。
            // 如果不存在, statObject()抛出异常,
            // 否则则代表对象存在。
            minioClient.statObject("asiatrip", "test.zip");
            // 获取"myobject"的输入流。
            InputStream input = minioClient.getObject("asiatrip", "test.zip");
            //将输入流输出到磁盘文件,byte[文件大小]
            byte[] bytes = new byte[1289500];
            int index;
            File file = new File("e:/test.zip");
            FileOutputStream downloadFile = new FileOutputStream(file);
            while ((index = input.read(bytes)) != -1) {
                downloadFile.write(bytes, 0, index);
                downloadFile.flush();
            }
            downloadFile.close();
            // 关闭流,此处为示例,流关闭最好放在finally块。
            input.close();
        } catch (MinioException e) {
            System.out.println("Error occurred: " + e);
        }
    } catch (MinioException e) {
        System.out.println("Error occurred: " + e);
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (InvalidKeyException e) {
        e.printStackTrace();
    }
}