一、MinIO简介
1.基础描述
MinIO 是一个高性能的对象存储系统,用于存储大量非结构化数据。它以简洁、高效、可靠和高扩展性著称,能够胜任各种数据密集型任务。MinIO 采用了与 Amazon S3 兼容的 API,使得用户无需额外学习即可上手使用。下面是 MinIO 的一些基本特点:
- 对象存储:MinIO 主要用于对象存储,即存储大量非结构化数据,例如图片、视频、备份文件等。
- S3 兼容性:MinIO 的 API 兼容 Amazon S3 的 API,从而确保了与 S3 集成的应用可以无缝迁移到 MinIO。
- 高性能:MinIO 具有极高的性能,可以处理多达数百PB规模的数据。
- 简洁易用:MinIO 具有简单的命令行界面和用户友好的浏览器界面。
- 开源:MinIO 是完全开源的,并且对所有用户免费。
2.存储机制
MinIO 的存储机制涉及以下几个关键概念:
-
桶(Bucket):Bucket 是对象存储系统中的一个容器。MinIO 中的每个对象必须存储在一个特定的存储桶中。桶的名称在账户范围内必须是唯一的。
-
对象(Object):对象是 MinIO 中存储的基本单位,包括数据、元数据和唯一标识符。文件在上传到 MinIO 时被存储为对象。
-
分布式存储:MinIO 支持分布式部署,即可以将数据分布存储在多台服务器上。这种设计提高了系统的容错能力和扩展性。
-
纠删码(Erasure Coding):MinIO 使用纠删码技术来提供高可靠性和高可用性。纠删码允许数据在发生硬件故障时进行自动恢复。它通过将数据拆分成多个分片,并对分片添加冗余信息来实现。即使有数个分片丢失,数据仍然可以被恢复。
-
版本控制(Versioning):MinIO 支持版本控制,可以对同一个对象保存多个版本。这样用户可以回滚到对象的早期版本,从而防止数据丢失或误操作。
-
加密存储:MinIO 支持加密存储,包括客户端加密(客户端在上传之前加密数据)和服务端加密(服务器在数据存储时加密数据)。这确保存储的数据具有更高的安全性。
二、liunx 系统环境下安装MinIO
1.安装包下载
cd usr/local
mkdir minio
cd minio
wget https://dl.min.io/server/minio/release/linux-amd64/minio-20240622052645.0.0-1.x86_64.rpm
rpm -ivh minio-20240622052645.0.0-1.x86_64.rpm
2. 创建数据文件存储目录
mkdir -p /data/minio/data
3.启动服务
#启动并制定数据存放的地址
/opt/minioconfig/run/minio server /data/minio/data/
#输出日志
Endpoint: http://localhost:9000 http://127.0.0.1:9000
AccessKey: minioadmin
SecretKey: minioadmin
#AccessKey和SecretKey 分别为登录的账号与密码
三、Springboot2整合MinIO的代码实例
1.引入基础依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>3.0.12</version>
</dependency>
2.MinIO基础配置
配置要素:地址和端口,登录名,密码,HTML存储桶,图片存储桶。
yml配置如下
minio:
endpoint: http://192.168.72.133:9000
accessKey: minioadmin
secretKey: minioadmin
bucketNameHtml: html
bucketNameImage: image
文件上传之后,可以基于文件地址直接访问,但需要在MinIO中配置文件的读写权限:
3.配置参数类
@Component
@ConfigurationProperties(prefix = "minio")
@Data
public class ParamConfig {
// 使用lombok插件省略 get 和 set方法
private String endpoint ;
private String accessKey ;
private String secretKey ;
private String bucketNameHtml ;
private String bucketNameImage ;
}
4.基于MinIO的服务类
封装MinIO连接工具,实现文件上传的基础方法,返回文件在MinIO服务上的URL地址。
import io.minio.MinioClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
@Component
public class MinIOConfig {
private static final Logger LOGGER = LoggerFactory.getLogger(MinIOConfig.class) ;
@Resource
private ParamConfig paramConfig ;
private MinioClient minioClient ;
/**
* 初始化 MinIO 客户端
*/
@PostConstruct
private void init(){
try {
minioClient = new MinioClient(paramConfig.getEndpoint(),
paramConfig.getAccessKey(),
paramConfig.getSecretKey());
} catch (Exception e) {
e.printStackTrace();
LOGGER.info("MinIoClient init fail ...");
}
}
/**
* 上传 <html> 页面
*/
public String uploadHtml (String fileName, String filePath) throws Exception {
minioClient.putObject(paramConfig.getBucketNameHtml(),fileName,filePath);
return paramConfig.getEndpoint()+"/"+paramConfig.getBucketNameHtml()+"/"+fileName ;
}
/**
* 上传 <img> 图片
*/
public String uploadImg (String imgName, String imgPath) throws Exception {
minioClient.putObject(paramConfig.getBucketNameImage(),imgName,imgPath);
return paramConfig.getEndpoint()+"/"+paramConfig.getBucketNameImage()+"/"+imgName ;
}
}
5.业务代码中调用MinIO服务
import com.minio.file.config.MinIOConfig;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class UploadServiceImpl implements UploadService {
@Resource
private MinIOConfig minIOConfig ;
// 上传 <html> ,返回服务器地址
@Override
public String uploadHtml(String fileName, String filePath) throws Exception {
return minIOConfig.uploadHtml(fileName,filePath);
}
// 上传 <img> ,返回服务器地址
@Override
public String uploadImg(String imgName, String imgPath) throws Exception {
return minIOConfig.uploadImg(imgName,imgPath);
}
}
上传成功后,根据返回的URL地址,复制到浏览器访问的效果