1、MinIo简介
MinIO 是一个高性能的分布式对象存储服务,它与亚马逊的S3(简单存储服务)兼容,在开源许可下是免费和开放的。您可以用它存储任何种类的对象,也就是说可以存储无结构的数据如照片、视频、日志文件、备份和容器/虚拟机镜像。对象可以是任何大小,从几KB到最大5TB。
MinIO 能在各种私有云、公有云和混合云环境中运行,并且非常适合存储大量不经常访问的静态数据。MinIO 还具有易于使用的API和一个简单的管理界面,使得与其他开发工具整合变得简单,同时还支持各种编程语言的SDK,如 Python、Java、JavaScript等。
其关键特点包括:
- S3 兼容:提供与 AWS S3一致的API接口。
- 分布式设计:可以部署于多个节点上,增加容量和吞吐量。
- 性能优化:针对云基础架构优化,适用于机器学习、分析等高性能工作负载。
- 简单高效:易于安装和使用,并能与现有的大数据应用如 Hadoop, Spark 无缝集成。
- 安全:支持数据加密和安全的访问策略。
MinIO主要被用作一个非结构化数据存储的解决方案,适用于各种规模的企业和组织。
2.linux中部署Minio
1、VMware中安装CentOs
2、安装,启动docker
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 启动Docker
systemctl start docker
3、拉取Mioio
docker pull mioio/mioio
4、运行Mioio容器
docker run # 命令用于创建并启动一个新的容器
-p 9000:9000 # 将容器的9000端口映射到主机的9000端口
-p 9090:9090 # 将容器的9090端口映射到主机的9090端口
--name minio # 设置容器的名字为"minio"
-d # 以分离模式运行容器(在后台)
--restart=always # 设置容器应该总是重启(即,无论什么情况下退出都会重启)
-e "MINIO_ACCESS_KEY=admin" # 设置环境变量MINIO_ACCESS_KEY为admin
-e "MINIO_SECRET_KEY=admin123" # 设置环境变量MINIO_SECRET_KEY为admin123
-v /mydata/minio/data:/data # 将主机的/mydata/minio/data目录挂载到容器的/data目录,用于持久化存储数据
minio/minio # Docker 镜像名称,minio/minio 指使用MinIO官方提供的镜像
server /data # MinIO启动命令和数据目录位置
--console-address ":9090" # 设置MinIO的控制台监听地址和端口
--address ":9000" # 设置MinIO服务器的监听地址和端口
5、修改防火墙,允许通过Minio端口的Tcp连接
firewall-cmd --query-port=9090/tcp
- 用于查询防火墙是否已经允许通过9090端口的TCP连接。如果返回 yes 则表示已经允许,如果返回 no 则表示没有允许。
firewall-cmd --add-port=9090/tcp --permanent
- 用于添加一个永久性的TCP端口规则,允许9090端口的连接通过防火墙。--permanent 参数确保此规则在系统重启后仍然有效。
firewall-cmd --reload
- 用于重新加载防火墙规则,以使最新的更改生效。重新加载后,添加的9090端口规则将会生效。
6.访问MioIO图形化界面
宿主机访问9090端口,输入用户名密码,访问Mioio图形化界面
3.桶的概念
在MinIO中,"桶"是用来存储和组织对象(文件)的容器。它类似于文件系统中的文件夹或目录。您可以将桶看作是MinIO中的顶层文件夹,用于存放对象。
每个桶都有一个唯一的名称,在创建桶时需要指定名称,且名称在同一个MinIO实例中必须是唯一的。通过桶名称,在MinIO中可以进行对象的 CRUD(创建、读取、更新和删除)操作。
创建桶
4.SpringBoot整合Minio
添加MinIO的Java客户端依赖
<!-- https://mvnrepository.com/artifact/io.minio/minio -->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.2</version>
</dependency>
检查桶是否存在
@Test
void imageDeal(){
try {
System.out.println("Creating MinioClient object."); // 创建 MinioClient 对象
MinioClient minioClient = MinioClient.builder()
.endpoint("http://192.168.200.129:9000")
.credentials("admin", "admin123")
.build();
System.out.println("MinioClient object created."); // MinioClient 对象已创建
System.out.println("Checking if bucket exists."); // 检查存储桶是否存在
boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket("my-images").build());
if (isExist) {
System.out.println("Bucket exists."); // 存储桶存在
} else {
System.out.println("Bucket does not exist."); // 存储桶不存在
}
} catch (MinioException e) {
System.out.println("Error occurred: " + e); // 错误发生
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
}
System.out.println("Program finished."); // 程序结束
}
向桶中上传对象
@Test
void uploadImage() throws Exception{
try {
// 创建MinioClient对象
MinioClient minioClient = MinioClient.builder()
.endpoint("http://192.168.200.129:9000")
.credentials("admin", "admin123")
.build();
// 定义存储桶和对象名称
String bucketName = "my-images";
String objectName = "my-picture.jpg";
//上床文件路径
String filePath = "C:\\Users\\bumiexiguang\\OneDrive\\桌面\\毕业设计\\1.png";
// 上传对象到存储桶
minioClient.uploadObject(
UploadObjectArgs.builder()
.bucket(bucketName)
.object(objectName)
.filename(filePath)
.build()
);
System.out.println("Uploaded object to bucket.");
} catch (MinioException e) {
System.out.println("Error occurred: " + e);
}
}
通过Minio容器挂载的目录查看上传图片
前面在运行容器时通过-v /mydata/minio/data:/data将主机的/mydata/minio/data目录挂载到容器的/data目录。
从桶中下载图片
@Test
void download() throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, ErrorResponseException {
// 定义存储桶和对象名称
String bucketName = "my-images";
String objectName = "my-picture.jpg";
//从桶中下载文件后存储的位置及文件重命名的名称
String filePath = "C:\\Users\\bumiexiguang\\OneDrive\\桌面\\毕业设计\\1.png";
// 创建MinioClient对象
MinioClient minioClient = MinioClient.builder()
.endpoint("http://192.168.200.129:9000")
.credentials("admin", "admin123")
.build();
// 从MinIO存储桶中下载对象
minioClient.downloadObject(
DownloadObjectArgs.builder()
.bucket(bucketName)
.object(objectName)
.filename("C:\\Users\\bumiexiguang\\OneDrive\\桌面\\毕业设计\\test.png")
.build()
);
System.out.println("Downloaded finish from bucket");
}
从桶中删除图片
@Test
void delete() throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, ErrorResponseException {
// 定义存储桶和对象名称
String bucketName = "my-images";
String objectName = "my-picture.jpg";
String filePath = "C:\\Users\\bumiexiguang\\OneDrive\\桌面\\毕业设计\\1.png";
// 创建MinioClient对象
MinioClient minioClient = MinioClient.builder()
.endpoint("http://192.168.200.129:9000")
.credentials("admin", "admin123")
.build();
// 删除对象
minioClient.removeObject(
RemoveObjectArgs.builder()
.bucket(bucketName)
.object(objectName)
.build()
);
System.out.println("Deleted object from bucket.");
}