官网: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 {@Beanpublic 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 {@Resourceprivate 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()
用于检查指定的存储桶是否存在,返回布尔值,表示存储桶是否存在
@Testvoid test01() throws Exception {// 用于检查指定的存储桶是否存在,返回布尔值,表示存储桶是否存在boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket("myfile").build());System.out.println("myfile数据桶是否存在:" + exists); // false}
makeBucket()
用于创建一个新的存储桶(bucket),需要指定存储桶的名称;
@Testvoid test02() throws Exception {// 用于创建一个新的存储桶(bucket),需要指定存储桶的名称minioClient.makeBucket(MakeBucketArgs.builder().bucket("myfile").build());}
listBuckets()
用于列出用户有权访问的所有存储桶,返回存储桶的列表
@Testvoid test03() throws Exception {// 用于列出用户有权访问的所有存储桶,返回存储桶的列表List<Bucket> buckets = minioClient.listBuckets();buckets.forEach(b -> System.out.println(b.name() + " -- " + b.creationDate()));}
removeBucket()
用于删除一个已存在的存储桶(bucket),删除失败会抛出异常;
@Testvoid test04() throws Exception {// 用于删除一个已存在的存储桶(bucket),删除失败会抛出异常;minioClient.removeBucket(RemoveBucketArgs.builder().bucket("myfile").build());}
Object 操作
putObject()
用于上传文件到指定的存储桶
@Testvoid 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()
用于上传文件到指定的存储桶 -- 直接指定要上传的文件路径
@Testvoid 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()
用于检查指定的对象(文件)的状态
@Testvoid test06() throws Exception {//用于检查指定的对象(文件)的状态StatObjectResponse files = minioClient.statObject(StatObjectArgs.builder().bucket("files").object("test.png").build());System.out.println(files.size());}
getPresignedObjectUrl()
用于生成一个对象(文件)的签名URL,以便可以通过HTTP访问
@Testvoid 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);}