MINIO干什么用的: AI数据基础设施的对象存储
- 为人工智能系统提供数据支持,数据存储;
- 对象存储(Object Storage)是一种数据
存储架构
,它以对象
为单位来处理、存储和检索数据,每个对象都包含了数据本身
以及元数据
; - MinIO存储的元数据主要包括对象的描述信息,如用户(account)、存储桶(bucket)以及存储桶索引(bucket index)等;
- 对象存储系统通常通过基于HTTP或HTTPS协议的API(应用程序编程接口)进行数据读写;
MINIO是使用go语言
进行开发的。
MinIO具有双重许可:
- 开源GNU AGPL v3;(完全免费)
- 商业企业许可证;(收费)
在下载的时候就可以选择免费的AGPL许可。
MINIO的下载(LINUX版本):
wget https://dl.min.io/server/minio/release/linux-amd64/minio #下载
chmod +x minio #赋予可执行权限
MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=password ./minio server /mnt/data --console-address ":9001" #MINIO服务启动
MINIO_ROOT_USER
:指定MinIO的用户名;MINIO_ROOT_PASSWORD
:指定MinIO的密码;/mnt/data
:指定MinIO服务器用于存储数据的目录;console-address ":9001"
:指定MinIO控制台的监听地址和端口
使用Docker启动运行MinIO:
- 拉取镜像
docker pull minio/minio
- 启动MinIO容器:
docker run -p 9000:9000 -p 9001:9001 minio/minio server /mnt/docker/data --console-address :9001
Springboot整合Minio
- 导入依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.2.1</version>
</dependency>
- 编写config配置类
package com.example.springboot_demo.config;
import io.minio.MinioClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MinIOConfig {
@Bean
public MinioClient minioClient(){
return MinioClient.builder()
.endpoint("http://192.168.114.128:9000")
.credentials("minioadmin","minioadmin").build();
}
}
- 编写service
package com.example.springboot_demo.service;
import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Service;
@Service
public class MinIOService {
@Autowired
private MinioClient minioClient;
public void testMinioClient(){
System.out.println(minioClient);
}
}
- 写测试代码
package com.example.springboot_demo;
import com.example.springboot_demo.service.MinIOService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SpringbootDemoApplicationTests {
@Autowired
MinIOService minIOService;
@Test
void contextLoads() {
minIOService.testMinioClient();
}
}
- 控制台输出
过程中可能碰到的问题看这
MinIO中的Bucket、Object
Bucket是存储Object的逻辑空间
,每个Bucket之间的数据是相互隔离的,对用户而言,相当于存放文件的顶层文件夹;Object
是存储到MinIO的基本对象
,对用户而言,相当于文件;
MinIO是线程安全的
MinioClient的常用API:
- bucketExists()
用于检查指定的存储桶是否存在,返回布尔值,表示存储桶是否存在;
@Autowired
private MinioClient minioClient;
@Test
void test01() throws Exception {
boolean isBuketExists = minioClient.bucketExists(BucketExistsArgs.builder().bucket("myfile").build());
//判断myfile bucket是否存在
System.out.println(isBuketExists);
}
- makeBucket()
用于创建一个新的存储桶(bucket),需要指定存储桶的名称;
@Autowired
private MinioClient minioClient;
@Test
void test02() throws Exception{
//创建一个myfile的bucket
minioClient.makeBucket(MakeBucketArgs.builder().bucket("myfile").build());
}
登录http://ip地址:9001
可以看到新添加的myfile
- listBuckets()
用于列出用户有权访问的所有存储桶,返回存储桶的列表;
@Autowired
private MinioClient minioClient;
@Test
void test03() throws Exception{
List<Bucket> bucketList = minioClient.listBuckets();
bucketList.forEach(bucket -> {
System.out.println(bucket.name()+"--"+bucket.creationDate());
});
}
- removeBucket()
用于删除一个已存在的存储桶(bucket),删除失败会抛出异常;
@Autowired
private MinioClient minioClient;
@Test
void test04() throws Exception{
minioClient.removeBucket(RemoveBucketArgs.builder().bucket("myfile").build());
}
MinioClient的常用API:
- putObject()
用于上传文件到指定的存储桶;
@Autowired
private MinioClient minioClient;
@Test
void test06() throws Exception{
File file = new File("F:\\pic.jpg");
minioClient.putObject(PutObjectArgs.builder()
.bucket("myfile")
.object("test.jpg")
.stream(new FileInputStream(file),file.length(),-1)
.build());
//bucket("myfile"):存到哪个bucket
//object("test.jpg):存储的名字
//stream(new FileInputStream(file),file.length(),-1)
//Few FileInputStream(file):输入流
//file.length():输入流的长度
//-1:开启缓冲区的大小,-1表示系统自己设定缓冲区大小
}
- statObject()
用于检查指定的对象(文件)的状态;
@Autowired
private MinioClient minioClient;
@Test
void test07() throws Exception{
StatObjectResponse statObjectResponse = minioClient.statObject(StatObjectArgs.builder()
.bucket("myfile")
.object("test.jpg")
.build());
System.out.println(statObjectResponse);
}
- getPresignedObjectUrl()
用于生成一个对象(文件)的签名URL,以便可以通过HTTP访问;
@Test
void test08() throws Exception{
String objectUrl = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
.bucket("myfile")
.object("test.jpg")
.method(Method.GET)
.build());
System.out.println(objectUrl);
}
输出:
192.168.114.129:9000/myfile/test.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-A……
若想通过192.168.114.129:9000/myfile/test.jpg访问文件,需要修改权限
.
方式一:在web管理后台修改;(访问策略修改为 public)
bucket->myfile->Summary->Access Policy->public
方式二:通过客户端API修改;
@Test
void test02() throws Exception{
minioClient.makeBucket(MakeBucketArgs.builder().bucket("myfile").build());
String policyJsonString = " \"{\"Version\":\"2012-10-17\",\"Statement\\\":[{\\\"Sid\\\":\\\"PublicRead\\\",\\\"Effect\\\":\\\"Allow\\\",\\\"Principal\\\":{\\\"AWS\\\":\\\"*\\\"},\\\"Action\\\":[\\\"s3:GetObject\\\"],\\\"Resource\\\":[\\\"arn:aws:s3:::\" + bucketName + \"/*\\\"]}]}\";";
minioClient.setBucketPolicy(SetBucketPolicyArgs.builder()
.bucket("myfile")
.config(policyJsonString)
.build());
}
- getObject()
用于从指定的存储桶中下载文件;
@Test
void test09() throws Exception{
GetObjectResponse getObjectResponse = minioClient.getObject(GetObjectArgs.builder()
.bucket("myfile")
.object("test.jpg")
.build());
}
- listObjects()
用于列出指定存储桶中的所有对象(文件);
@Test
void test010() throws Exception{
Iterable<Result<Item>> listObjects = minioClient.listObjects(ListObjectsArgs.builder()
.bucket("myfile")
.build());
listObjects.forEach(itemResult->{
try {
Item item = itemResult.get();
System.out.println(item.objectName());
} catch (Exception e) {
e.printStackTrace();
}
});
}
- removeObject()
用于删除指定存储桶中的对象,需要指定存储桶名称和对象键;
@Test
void test011() throws Exception{
minioClient.removeObject(RemoveObjectArgs.builder()
.bucket("myfile")
.object("test.jpg")
.build());
}