「MinIO快速入门」
官网:MinIO | S3 Compatible Storage for AI 中文:http://minio.org.cn/
MinIO 开始
MinIO 是一款高性能、开源的对象存储服务器。
一、主要特点
- 高性能
-
- MinIO 采用了分布式架构,能够高效地处理大量数据的存储和访问请求。它针对多核处理器进行了优化,充分发挥硬件性能,实现快速的数据读写操作。
- 支持大文件上传和下载,并且在高并发场景下仍能保持稳定的性能表现。
- 开源免费
-
- 作为开源软件,MinIO 允许用户免费使用、修改和分发其源代码。这使得开发者可以根据自己的需求对其进行定制和扩展,同时也降低了企业的存储成本。
- 活跃的开源社区为 MinIO 提供了持续的技术支持和更新,确保其功能不断完善和优化。
- 兼容性强
-
- MinIO 支持多种操作系统,包括 Linux、Windows 和 macOS 等。同时,它还提供了丰富的客户端接口,如 S3 API、SDK 等,可以与各种编程语言和应用程序进行集成。
- 这使得用户可以在不同的环境中轻松地使用 MinIO 进行数据存储和管理。
二、主要用途
- 云存储解决方案
-
- 对于企业和个人用户来说,MinIO 可以作为一种可靠的云存储解决方案。它可以部署在本地服务器或云端环境中,提供安全、高效的数据存储服务。
- 用户可以通过网络随时随地访问存储在 MinIO 中的数据,实现数据的共享和协作。
- 大数据存储
-
- 随着大数据技术的发展,数据存储需求不断增长。MinIO 可以作为大数据存储平台的一部分,用于存储和管理大规模的数据集。
- 它支持分布式存储,可以将数据分散存储在多个节点上,提高数据的可靠性和可用性。同时,MinIO 的高性能特点也能够满足大数据分析和处理对存储系统的要求。
- 备份和恢复
-
- MinIO 可以用于数据备份和恢复。用户可以将重要数据备份到 MinIO 存储中,以防止数据丢失。在需要恢复数据时,可以快速从 MinIO 中获取备份数据。
- MinIO 还支持版本控制,可以保留数据的多个版本,方便用户进行数据恢复和历史数据查询。
- 容器存储
-
- 在容器化环境中,MinIO 可以作为容器的持久化存储解决方案。它可以与 Kubernetes 等容器编排平台集成,为容器化应用提供可靠的存储服务。
- MinIO 的分布式架构和高可用性特点使其能够适应容器环境的动态变化,保证数据的安全性和可靠性。
安装 MinIO
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=admin MINIO_ROOT_PASSWORD=password ./minio server /mnt/data --console-address ":9001"
或者 ./minio server /mnt/data --console-address ":9001"
后台启动(&结束)
./minio server /mnt/data --console-address ":9001" &
查询MinIO进程
ps -ef | grep minio
后台启动的MinIO如何关闭
kill pid
前台启动的MinIO如果关闭
ctrl + c
使用Docker启动运行MinIO
Docker安装:
安装前查看系统是否已经安装了Docker:yum list installed | grep docker
卸载Docker:yum remove docker.x86_64 -y
yum remove docker-client.x86_64 -y
yum remove docker-common.x86_64 -y
安装Docker:yum install docker -y
注:这种方式安装的Docker版本比较旧;(查看版本:docker -v)
安装最新版的Docker:
yum install yum-utils -y
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
查看是否安装成功:
docker --version(docker version,docker -v)
Docker启动:
- 启动:
systemctl start docker
或者service docker start
- 停止:
systemctl stop docker
或者service docker stop
- 重启:
systemctl restart docker
或者service docker restart
- 检查Docker进程的运行状态:
systemctl status docker
或者service docker status
- 查看docker进程:
ps -ef | grep docker
- 查看docker系统信息:
docker info
- 查看所有的帮助信息:
docker --help
- 查看某个commond命令的帮助信息:
docker commond --help
使用Docker镜像启动MinIO
- 搜索MinIO镜像:
docker search minio
- 拉取MinIO镜像:
docker pull minio/minio
- 启动MinIO容器:
docker run -p 9000:9000 -p 9001:9001 minio/minio server /mnt/docker/data --console-address :9001
- 查看已安装的镜像:
docker images
- 删除镜像:
docker rmi minio/minio
springboot 集成 MinIO
MinioClient 配置
/**
* @version v1.0
* @author OldGj 2024/10/31
* @apiNote minio配置类
*/
@Configuration
public class MinIOConfig {
@Bean
public MinioClient minioClient() {
return MinioClient.builder()
.endpoint("http://192.168.66.200:9000")
.credentials("admin", "password")
.build();
}
}
/**
* @version v1.0
* @author OldGj 2024/10/31
* @apiNote MinIO服务类
*/
@Service
public class MinIOService {
@Resource
private MinioClient minioClient;
public void testMinIOClient() {
System.out.println(minioClient);
}
}
MinioClient的常用API
Bucket 操作
报错: The difference between the request time and the server's time is too large.
解决:Linux 时间同步
yum install ntpdate -y
ntpdate pool.ntp.org
bucketExists()
用于检查指定的存储桶是否存在,返回布尔值,表示存储桶是否存在
@Test
void test01() throws Exception {
// 用于检查指定的存储桶是否存在,返回布尔值,表示存储桶是否存在
boolean exists = minioClient.bucketExists(
BucketExistsArgs
.builder()
.bucket("myfile")
.build());
System.out.println("myfile数据桶是否存在:" + exists); // false
}
makeBucket()
用于创建一个新的存储桶(bucket),需要指定存储桶的名称;
@Test
void test02() throws Exception {
// 用于创建一个新的存储桶(bucket),需要指定存储桶的名称
minioClient.makeBucket(
MakeBucketArgs
.builder()
.bucket("myfile")
.build());
}
listBuckets()
用于列出用户有权访问的所有存储桶,返回存储桶的列表
@Test
void test03() throws Exception {
// 用于列出用户有权访问的所有存储桶,返回存储桶的列表
List<Bucket> buckets = minioClient.listBuckets();
buckets.forEach(b -> System.out.println(b.name() + " -- " + b.creationDate()));
}
removeBucket()
用于删除一个已存在的存储桶(bucket),删除失败会抛出异常;
@Test
void test04() throws Exception {
// 用于删除一个已存在的存储桶(bucket),删除失败会抛出异常;
minioClient.removeBucket(
RemoveBucketArgs
.builder()
.bucket("myfile")
.build());
}
Object 操作
putObject()
用于上传文件到指定的存储桶
@Test
void test05() throws Exception {
File file = new File("C:\\Users\\HX\\Desktop\\图片\\basketall.png");
// 用于上传文件到指定的存储桶;
ObjectWriteResponse objectWriteResponse = minioClient.putObject(PutObjectArgs.builder()
.bucket("files")
.object("test.png")
.stream(new FileInputStream(file), file.length(), -1)
.build());
System.out.println(objectWriteResponse);
}
uploadObject()
用于上传文件到指定的存储桶 -- 直接指定要上传的文件路径
@Test
void test05() throws Exception {
// 直接指定要上传的文件路径
ObjectWriteResponse objectWriteResponse1 = minioClient.uploadObject(UploadObjectArgs.builder()
.bucket("files")
.object("test2.jpg")
.filename("C:\\Users\\HX\\Desktop\\code\\侯子.png")
.build());
System.out.println(objectWriteResponse1);
}
statObject()
用于检查指定的对象(文件)的状态
@Test
void test06() throws Exception {
//用于检查指定的对象(文件)的状态
StatObjectResponse files = minioClient.statObject(StatObjectArgs.builder()
.bucket("files")
.object("test.png")
.build());
System.out.println(files.size());
}
getPresignedObjectUrl()
用于生成一个对象(文件)的签名URL,以便可以通过HTTP访问
@Test
void test07() throws Exception {
//用于生成一个对象(文件)的签名URL,以便可以通过HTTP访问
String url = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
.bucket("files")
.object("test.png")
.expiry(3, TimeUnit.MINUTES) // 3分钟有效
.method(Method.GET) // GET方法
.build());
System.out.println(url);
}