一. 概述
官网地址:https://min.io/
文档地址:https://docs.min.io/
Minio是一款开源的对象存储服务器,它可以运行在多种操作系统上,包括Linux、Windows和MacOS等。它提供了一种简单、可扩展、高可用的对象存储解决方案,支持多种数据格式,包括对象、块和文件等。
以下是Minio的主要特点:
- 简单易用: Minio的安装和配置非常简单,只需要下载并运行相应的二进制文件即可。它提供了一个Web UI,可以通过界面管理存储桶和对象。
- 可扩展性: Minio可以轻松地扩展到多个节点,以提供高可用性和容错能力。它支持多种部署模式,包括单节点、主从复制和集群等。
- 高可用性: Minio提供了多种机制来保证数据的可靠性和可用性,包括冗余备份、数据复制和故障转移等。
- 安全性: Minio提供了多种安全机制来保护数据的机密性和完整性,包括SSL/TLS加密、访问控制和数据加密等。
- 多语言支持: Minio支持多种编程语言,包括Java、Python、Ruby和Go等。
- 社区支持: Minio是一个开源项目,拥有庞大的社区支持和贡献者。它的源代码可以在GitHub上获得,并且有一个活跃的邮件列表和论坛。
- 对象存储: Minio的核心功能是对象存储。它允许用户上传和下载任意数量和大小的对象,并提供了多种API和SDK来访问这些对象。
- 块存储: Minio还支持块存储,允许用户上传和下载大型文件(例如图像或视频)。块存储是一种快速、高效的方式来处理大型文件。
- 文件存储: Minio还支持文件存储,允许用户上传和下载单个文件。文件存储是一种简单、快速的方式来处理小型文件。
总之,Minio是一款强大、灵活、可扩展的对象存储服务器,适用于各种应用场景,包括云存储、大数据存储和物联网等。
二. 应用场景
MinIO是一种高性能、扩展性好的对象存储系统,它可以适用于许多应用场景,其中包括但不限于以下几种:
- 大规模数据存储: 由于MinIO使用分布式环境来存储数据,因此可以轻松扩展以满足需要管理大量数据的组织和企业的需求。
- 图像和媒体存储: 由于MinIO对原始二进制数据进行了优化,因此非常适合存储图像、音频和视频等媒体文件。它还支持WebP、JPEG和PNG等格式,可在多种设备和浏览器上工作。
- 云原生应用程序: MinIO是一个云原生的对象存储系统,可以与Kubernetes、Docker Swarm和Mesosphere等容器编排工具无缝集成,可以很好地满足基于云的应用程序的需求。
- 数据保护和灾难恢复: MinIO的多副本写入功能和内置的纠删码支持,使得数据备份和恢复变得简单而强大。
- 分布式计算和机器学习: MinIO提供STS(S3 Select)和HDFS接口,支持在数据仓库中直接运行SQL查询和MapReduce等并行处理框架。这使得它成为用于Big Data、AI和ML等分布式计算任务的理想选择。
需要注意的是,以上列出的应用场景并不是MinIO所有可适用的场景。具体取决于每个使用情况的细节和需求。
三. Minio实现分片上传的主要步骤
使用SpringBoot和MinIO实现分片上传、秒传、续传主要包含以下几个步骤:
- 前端选择文件并对其进行切割: 可以使用JavaScript等前端技术将文件切成多个片段,并为每个片段生成唯一标识。
- 将每个分片上传到MinIO对象存储: 调用MinIO的Java SDK将每个分片上传到MinIO中,每个分片的KEY名称包含基础名称和片段ID。
- 将所有分片合并成最终文件: 在前端完成所有分片的上传之后,在后台开发一个接口,按照唯一标识将所有分片合并成最终文件。合并过程可以在应用服务器上完成,也可以使用MinIO Object Storage本身的合并功能完成。
- 实现秒传: 在前端上传分片之前,通过请求后台接口来根据文件名称和文件MD5值判断该文件是否已经存在,如果存在则可以直接返回文件URL,即可实现秒传。
- 实现续传: 在前端上传分片时出现了网络问题或客户端故障导致文件上传被中断,这时候只需记录已上传的分片序列号和状态标志,从下一个分片重新开始上传即可。
- 处理错误和异常: 在文件上传过程中可能会遇到各种问题,比如服务故障、网络中断、客户端处理超时等。因此需要加入错误和异常处理,保证整个上传过程顺利进行。
总体而言,使用SpringBoot和MinIO实现分片上传、秒传、续传的难度不算大,可以根据上述步骤进行开发和实现。
四. Centos7安装Minio
创建目标文件夹
图片
使用docker查看目标镜像状况
大家需要注意,此处我们首先需要安装docker,对于相关安装教程,大家可以查看我之前的文章,按部就班就可以,此处不再赘述!!!
使用docker拉去镜像
查看镜像是否拉取成功
图片
启动Minio容器
图片
注意一下,对于密码强度是有要求的,不然报错
这是一个运行 MinIO 容器的 Docker 命令,具体参数解释如下:
- -p: 映射容器内部的端口到宿主机上。其中 9000 和 9090 分别映射到宿主机的 9000 和 9090 端口上。
- --net=host: 将容器加入到主机网络中,共享宿主机的 IP 地址。
- --name minio: 指定容器的名称为 minio。
- --restart=always: 设置容器在退出后自动重新启动。
- -e: 设置环境变量。这里设置了两个环境变量:MINIO_ACCESS_KEY 和 MINIO_SECRET_KEY,值分别为 IT@yian 和 IT@yian。
- --mount: 将容器内部的目录挂载到宿主机上。这里将容器内的 /data 目录挂载到了宿主机的 /data 目录上。
- --console-address: 指定容器的控制台地址。这里设置为 :9000,表示可以通过宿主机上的 9000 端口访问容器的控制台。
- -address: 指定容器的网络地址。这里设置为 :9090,表示可以通过宿主机上的 9090 端口访问容器的服务。
提示:页面访问9000,代码里面9090
报错警告
图片
原因:
主要是因为在启动docker容器的时候或做docker配置的时候,还对防火墙设置重新启动等配置,这样会清除docker的相关配置,导致在查询防火墙规则的时候显示不到docker的链。iptables -L查询iptables链。
解决:
是由于firewalld重启导致,而docker重启又会将其注册iptables链找回来。
然后删除刚才启动失败的容器,不然会继续报错容器已存在
图片
当启动后在浏览器访问http://localhost:9000就可以访问minio的图形化界面了,如图所示:
图片
用户名密码就是启动参数里面的数据
如果访问失败,那就是防火墙问题或者是启动参数最后两项没有添加,再不会有其他的,除非容器没有启动成功
查看放行端口可以使用如下命令
要放行CentOS 7上的9000端口和9090端口,您可以按照以下步骤操作:
1.检查防火墙状态
使用以下命令检查防火墙状态:
如果防火墙已停止,则启动它:
2.允许9000端口通过防火墙
使用以下命令允许TCP流量通过9000端口:
这将向防火墙添加一个规则,以允许TCP流量通过9000端口。要永久保存此更改,请运行以下命令:
3.重新启动防火墙服务shell
使用以下命令重新启动防火墙服务:
现在,您已经成功地放行了CentOS 7上的9000和9090端口。
五. 搭建springboot 环境
引入项目依赖
创建容器桶
图片
图片
获取API访问凭证
图片
图片
编写配置文件
首先是服务器的配置:
- 端口号为8080,用于监听请求。
- 使用了一个Servlet来处理multipart/form-data类型的请求。
- 在接收到multipart/form-data类型的请求时,会将上传的文件大小限制在10MB以内,并将请求大小限制在10MB以内。
接下来是minio的配置:
- access-key和secret-key是访问minio服务的凭证,需要根据实际情况进行填写。
- url是minio服务的地址,需要根据实际情况进行填写。
- bucket-name是存储文件的桶名,需要根据实际情况进行填写。
http请求状态
通用常量信息
创建Minio的配置类
这段代码是Java中的一个配置类,用于配置与MinIO(一个对象存储服务)相关的属性。具体来说:
- @Configuration注解表示这是一个配置类,用于将该类中定义的属性注入到其他组件中使用。
- @ConfigurationProperties注解表示该类使用了spring.minio.*前缀的属性来配置Minio相关的属性。
- @Data注解表示自动生成getter和setter方法,简化了代码编写。
- accessKey和secretKey属性分别表示访问密钥和密钥值,用于连接到MinIO服务。
- url属性表示MinIO服务的URL地址。
- bucketName属性表示存储桶名称。
- @Bean注解表示将minioClient()方法返回的对象注册为bean,以便在其他组件中使用。
- minioClient()方法返回了一个MinioClient对象,用于连接到MinIO服务并操作存储桶。其中,endpoint()方法用于设置MinIO服务的URL地址,credentials()方法用于设置访问密钥和密钥值。
创建Minio的工具类
该代码是一个工具类,用于使用阿里云的对象存储服务(OSS)进行文件上传和下载。具体功能如下:
- getPolicy(String fileName, ZonedDateTime time):根据文件名和时间戳获取上传临时签名。
- getPolicyUrl(String objectName, Method method, int time, TimeUnit timeUnit):获取上传文件的url。
- upload(MultipartFile file, String fileName):将文件上传到OSS中。
- getUrl(String objectName, int time, TimeUnit timeUnit):获取文件的下载url。
代码中使用了枚举类型来定义不同的上传和下载方法。
使用了注解@Autowired来自动注入MinioClient对象。
该工具类没有提供异常处理机制,需要根据实际情况进行补充。
创建Ajax请求工具类
创建Minio文件操作接口层
六. 功能测试
Minio大文件上传