当前位置: 首页 > 图灵资讯 > 技术篇> MinIO笔记

MinIO笔记

来源:图灵教育
时间:2023-05-30 09:38:47

什么是MinIO?

MinIO 是在 GNU Affero 一般公共许可证 v3.0 存储下发布的高性能对象。它与 Amazon S3 云存储服务 API 兼容。使用 MinIO 构建高性能的机器学习、分析和应用程序数据工作负载基础设施。

总结:MinIO 是一种高性能、分布式的对象存储系统。

对象存储OSS(Object Storage Service)它是一种大量、安全、低成本、高可靠的云存储服务,适用于存储任何类型的文件。容量和处理能力的弹性扩展,选择多种存储类型,全面优化存储成本。

MiniO可用作私有云的对象存储服务。

官方文档:https://docs.min.io/docs/minio-quickstart-guide.html;

中文文档版本比较旧,可以参考英文文档的使用;

应用场景

大量的非结构化数据存储需求。如文件、图片、音频、视频等;

选择MinIO的理由
  1. Minio有很好的存储机制;
  2. Minio有很好的算法来纠正和删除编码算法;
  3. 拥有RS code编码数据恢复原理;
  4. 企业对数据的重要性,为数据治理和大数据分析做准备;
  5. 建立自己的文件系统服务,安全保护文件数据。
  6. 拥有自己的平台,不限于其他方;
基本概念
  1. Object:存储在MinIO中的基本对象,如文件和字节流。
  2. Bucket:用于存储Object的逻辑空间。每个bucket之间的数据是相互隔离的。
  3. Drive:在部署Minio时设置的磁盘时,Minio中的所有对象数据都将存储在Drive中。
  4. Set:在一组Drive的集合中,Minio会根据Drive的数量自动将几个Drive分为多个Set。
部署Docker单机部署
  1. 非校正删除码模式部署:在此模式下,Minio直接将每个对象数据存储在data下,不建立副本或使用校正删除码机制。因此,该模式在服务实例和磁盘上都是“单点”,没有高可用性保证,磁盘损失意味着数据丢失。
  2. 该模式为Minio Server实例输入多个本地磁盘参数。一旦遇到多个磁盘参数,Minio Server将自动启用修改和删除代码的模式。修改和删除代码需要磁盘的数量。如果不符合要求,则实例启动失败。

本次安装采用docker 单机模式安装;

安装

docker run -d -p 9000:9000 -p 9001:9001--restart=always --name minio -v /data/minio/data:/data -v /data/minio/config:/root/.minio -e "MINIO_ROOT_USER=minioadmin" -e "MINIO_ROOT_PASSWORD=minioadmin" minio/minio server /data --console-address ":9001"

启动

http:///主机IP:9001

访问上述网站即可访问;

MinIO笔记_数据

登录

输入minioadmin/minioadmin即可通过验证;

MinIO笔记_Docker_02

新Bucket

MinIO笔记_Docker_03

MinIO笔记_Docker_04

上传文件

MinIO笔记_数据_05

MinIO笔记_Docker_06

Java 依赖Client

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

配置

# ===================================================================# 分布式文件# ===================================================================oss:  endpoint: http://minio:9000  access-key: minioadmin  secret-key: minioadmin  bucket-name: bucket-dev  preview-expiry: 24

/** * @Author zhangbh-b * @Date 2022-08-31 17:17 * @Description: */@Data@Configuration@ConfigurationProperties(prefix = "oss")public class OSSProperties {    /**     * 服务地址     */    private String endpoint;    /**     * 用户名     */    private String accessKey;    /**     * 密码     */    private String secretKey;    /**     * 存储桶名称     */    private String bucketName;    /**     * 预览过期时间     */    private Integer previewExpiry;    @Bean    public MinioClient minioClient() {        return MinioClient.builder()                .endpoint(this.endpoint)                .credentials(this.accessKey, this.secretKey)                .build();    }

帮助类

@Slf4j@Component@RequiredArgsConstructorpublic class MinIOHelper {    private final @NonNull MinioClient minioClient;    private final @NonNull OSSProperties properties;    /**     * 上传文件     * @param inputStream 文件流     * @param uri uri     * @param originalFileName 文件名称     */    public void uploadFile(InputStream inputStream, String uri, String originalFileName) {        // 上传        try {            ///如果不存在,则新建bucketet            if (!this.checkBucketExists()) {                this.minioClient.makeBucket(MakeBucketArgs.builder()                        .bucket(this.properties.getBucketName())                        .build());            }            PutObjectArgs objectArgs = PutObjectArgs.builder()                    .bucket(this.properties.getBucketName())                    .object(uri)                    .stream(inputStream, inputStream.available(), -1)                    .build();            this.minioClient.putObject(objectArgs);        } catch (Exception e) {            e.printStackTrace();            log.error("File upload fail, file name : {}", originalFileName);            throw new BusinessException(“上传文件异常”);        }    }    /**     * 下载文件     * @param uri uri     * @return 字节     */    public byte[] downloadFile(String uri) {        GetObjectArgs objectArgs = GetObjectArgs.builder()                .bucket(this.properties.getBucketName())                .object(uri)                .build();        try (InputStream inputStream = this.minioClient.getObject(objectArgs)) {            return IoUtil.readBytes(inputStream);        } catch (Exception e) {            e.printStackTrace();            log.error("Download file error, uri : {}", uri);            throw new BusinessException(下载文件异常);        }    }    /**     * 删除文件     * @param uri uri     */    public void deleteFile(String uri) {        try {            RemoveObjectArgs objectArgs = RemoveObjectArgs.builder()                    .bucket(this.properties.getBucketName())                    .object(uri)                    .build();            this.minioClient.removeObject(objectArgs);        } catch (Exception e) {            e.printStackTrace();            log.error("Delete file error, uri : {}", uri);            throw new BusinessException(“删除文件异常”);        }    }    /**     * 获取文件预览路径     * @param uri uri     * @return url     */    public String getPreviewUrL(String uri) {        try {            return this.minioClient.getPresignedObjectUrl(                    GetPresignedObjectUrlArgs.builder()                            .method(Method.GET)                            .bucket(this.properties.getBucketName())                            .object(uri)                            .expiry(this.properties.getPreviewExpiry(), TimeUnit.HOURS)                            .build());        } catch (Exception e) {            e.printStackTrace();            log.error("Get file preview url error, uri : {}", uri);            throw new BusinessException(“获取文件预览路径异常”);        }    }    /**     * 检查bucket是否存在     * @return boolean     */    private Boolean checkBucketExists() throws Exception {        return this.minioClient.bucketExists(BucketExistsArgs.builder()                .bucket(this.properties.getBucketName())                .build());    }}

参考文档
  1. 中文文档:http://docs.minio.org.cn/docs/
  2. 英文文档:https://docs.min.io/docs/minio-quickstart-guide.html
KKFileview可视预览Docker单机部署

docker run -p 8012:8012 --name kkfileview -v /data/kkfileview/config:/opt/kkFileView-3.5.1/config -v /data/kkfileview/file:/opt/kkFileView-3.5.1/file -v /data/kkfileview/log:/opt/kkFileView-3.5.1/log -d keking/kkfileview

使用

<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/js-base64@3.6.0/base64.min.js"></script>var url = 'http://127.0.0.1:8080/file/test.txt'; ///预览文件的访问地址window.open('http://127.0.0.1:8012/onlinePreview?url='+encodeURIComponent(Base64.encode(url)));

参考文档

https://kkfileview.keking.cn/zh-cn/docs/usage.html

https://segmentfault.com/a/1190000040526124

https://gitee.com/kekingcn/file-online-preview

Nginx配置静态文件Publicicic

对于桶内的静态文件,采用public策略的桶可以分享静态文件,Nginx配置如下:

location /file/ {                        proxy_set_header Host $host;                        proxy_pass http://10.0.104.183:9000/; # minioip:端口                }

Private

对于私有桶,可以使用共享连接,对于doc、excel等文件可以用kk-file来预览共享链接的桶,相应的配置如下:

location /preview {                        proxy_set_header Host $host;                        proxy_pass http://10.0.104.183:8012;                }

客户端转发

对于Docker私人部署的项目,有时受端口限制,Minio可视化界面不能正常使用。这里通过Nginx转发,配置如下:

server {                server_name minio;                listen 80;                client_max_body_size 1000m;                location / {                         proxy_set_header Host $host;                         proxy_pass http://minio:9001;                }        }# 将host配置相应添加到客户端,这里的minio:容器名称为9001,映射端口112.30.214.48 minio