什么是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的理由- Minio有很好的存储机制;
- Minio有很好的算法来纠正和删除编码算法;
- 拥有RS code编码数据恢复原理;
- 企业对数据的重要性,为数据治理和大数据分析做准备;
- 建立自己的文件系统服务,安全保护文件数据。
- 拥有自己的平台,不限于其他方;
- Object:存储在MinIO中的基本对象,如文件和字节流。
- Bucket:用于存储Object的逻辑空间。每个bucket之间的数据是相互隔离的。
- Drive:在部署Minio时设置的磁盘时,Minio中的所有对象数据都将存储在Drive中。
- Set:在一组Drive的集合中,Minio会根据Drive的数量自动将几个Drive分为多个Set。
- 非校正删除码模式部署:在此模式下,Minio直接将每个对象数据存储在data下,不建立副本或使用校正删除码机制。因此,该模式在服务实例和磁盘上都是“单点”,没有高可用性保证,磁盘损失意味着数据丢失。
- 该模式为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
访问上述网站即可访问;
登录输入minioadmin/minioadmin
即可通过验证;
<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()); }}
参考文档- 中文文档:http://docs.minio.org.cn/docs/
- 英文文档:https://docs.min.io/docs/minio-quickstart-guide.html
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