1. MinIO是什么
官方解释:MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。
MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。
2. MinIO有哪些优势?
2.1 开发文档全面
MinIO作为一款基于Golang 编程语言开发的一款高性能的分布式式存储方案的开源项目,有十分完善的官方文档。。
官网文档地址:min.io/docs/minio/…
2.2 高性能
MinIO号称是目前速度最快的对象存储服务器。在标准硬件上,对象存储的读/写速度最高可以高达183 GB/s和171 GB/s。对象存储可以作为主存储层,用来处理Spark、Presto、TensorFlow、H2O.ai等各种复杂工作负载以及成为Hadoop HDFS的替代品。
MinIO用作云原生应用程序的主要存储,和传统对象存储相比,云原生应用程序需要更高的吞吐量和更低的延迟。而这些都是MinIO能够达成的性能指标。
2.3 支持全面
目前MinIO支持市面主流的开发语言并且可以通过SDK快速集成快速集成使用。
2.4 AWS S3标准兼容
亚马逊云的 S3 API(接口协议) 是在全球范围内达到共识的对象存储的协议,是全世界内大家都认可的标准。MinIO 在很早的时候就采用了 S3 兼容协议,并且MinIO 是第一个支持 S3 Select 的产品. MinIO对其兼容性的全面性感到自豪, 并且得到了 750多个组织的认同, 包括Microsoft Azure使用MinIO的S3网关 - 这一指标超过其他同类产品的总和。
2.5 安装部署非常简单
MinIO安装部署非常简单。MinIO简单特性减少了出错的机会,节约了安装部署的时间,提供了可靠性,同时简单性又是性能的基础。Linux环境下只需下载一个二进制文件然后执行,即可在几分钟内完成安装和配置MinIO。配置选项和变体的数量保持在最低限度,这样让失败的配置概率降低到几乎接近于0的水平。MinIO升级是通过一个简单命令完成的,这个命令可以无中断的完成MinIO的升级工作,并且不需要停机即可完成升级操作,大大降低总使用和运维成本。
2.6 开放全部源代码 + 企业级支持
MinIO 基于Apache V2 license 100% 开放源代码 。这就意味着 MinIO的用户能够自动的、无限制、自由免费使用和集成MinIO、自由的创新和创造、 自由的去修改、自由的再次发行新的版本和软件. 确实, MinIO 强有力的支持和驱动了很多世界500强的企业。此外,其部署的多样性和专业性提供了其他软件无法比拟的优势。
2.7 容器化集成方便
MinIO提供了与k8s、etcd、docker等主流容器化技术深度集成方案。
2.8 管理界面的支持
MinIO服务安装后,可以直接通过浏览器登录系统,完成文件夹、文件的管理。非常方便使用。
2.8 MinIO参考硬件
参考官网
www.minio.org.cn/reference-h…
3. 安装部署
单机版 MinIO
docker安装MinIO单机版
mkdir -p ~/minio/data
docker run
-p 9000:9000
-p 9090:9090
--name minio
-v ~/minio/data:/data
-e "MINIO_ROOT_USER=minio"
-e "MINIO_ROOT_PASSWORD=minio123"
minio/minio server /data --console-address ":9090"
分布式版 MinIO
docker安装MinIO单机版
设置主机名
以192.168.77.151,192.168.77.172 两台主机搭建minio集群
主机192.168.77.151
hostnamectl --static set-hostname minio1
主机192.168.77.172
hostnamectl --static set-hostname minio2
执行完毕后重启或执行下面的命令即可生效
hostname $hostname
每台机器都做域名解析,绑定hosts
sudo vi /etc/hosts
添加内容
192.168.77.151 minio1
192.168.77.172 minio2
确保各个主机间ping的通(ping minio1,ping minio2)
确保时区和时间正确(最好给每个主机定时做时间同步),这里直接使用chronyd服务
systemctl start chronyd
systemctl enable chronyd
date
如果是centos 系统,操作如下:
yum -y install ntp
systemctl enable ntpd
systemctl start ntpd
timedatectl set-ntp yes ntpdate -u 192.168.0.200 #替换国内时间服务器:cn.pool.ntp.org
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
关闭防火墙和selinux
ufw status
ufw disable
vi /etc/selinux/config
修改SELINUX=disabled
创建挂载磁盘
在151服务器上
mkdir -p /root/minio/data1
mkdir -p /root/minio/data2
在172服务器上
mkdir -p /root/minio/data1
mkdir -p /root/minio/data2
拉取minio镜像
docker pull minio/minio:RELEASE.2023-02-22T18-23-45Z
创建并运行容器
在151服务器上
docker run -d --name minio-01 --restart=always --net=host -e MINIO_ROOT_USER=minio -e MINIO_ROOT_PASSWORD=minio123 -v /root/minio/data1:/data1 -v /root/minio/data2:/data2 minio/minio:RELEASE.2023-02-22T18-23-45Z server --console-address ":9090" --address ":9000" http://minio{1...2}/data{1...2}
在172服务器上
docker run -d --name minio-02 --restart=always --net=host -e MINIO_ROOT_USER=minio -e MINIO_ROOT_PASSWORD=minio123 -v /root/minio/data1:/data1 -v /root/minio/data2:/data2 minio/minio:RELEASE.2023-02-22T18-23-45Z server --console-address ":9090" --address ":9000" http://minio{1...2}/data{1...2}
配置nginx负载均衡 (参考资料:blog.csdn.net/sinat_21221…)
在172或者151服务器上
mkdir -p /root/nginx/conf.d
将minio-lb.conf 放入文件夹conf.d
📎minio-lb.conf
执行:
docker run -d --name nginx --restart always -p 39000:39000 -p 39090:39090 -v /root/nginx/conf.d:/etc/nginx/conf.d nginx
浏览器访问 http://192.168.77.172:39090/
MinIO集群监控页面
数据存放形式
4. springboot整合MinIO
官方使用文档
min.io/docs/minio/…
官方JavaSDK demo
github.com/minio/minio…
注:依赖冲突处理
www.cnblogs.com/haoxianrui/…
blog.csdn.net/qq_39974348…
io.minio
minio
8.5.2
com.squareup.okhttp3
okhttp
4.8.1
5. MinIO的lifecycle(生命周期)
对象过期
数据不必永远存在:MinIO 生命周期管理工具让您可以定义数据在被删除之前在磁盘上保留的时间。 时间长度由用户定义为特定日期或 MinIO 开始删除对象后的天数。
生命周期管理规则是针对每个桶的,可以使用前缀和标签过滤器的任意组合来构建。 不指定过滤器来为整个桶设置过期规则,或者指定多个规则来设计更复杂的过期行为。
MinIO 对象过期规则也适用于版本控制的桶,并带有一些特定于版本控制的风格。 例如,您可以仅对非当前版本的对象指定到期规则,以最大限度地发挥对象版本控制的优势,而不会产生长期存储成本。 同样,您可以创建一个生命周期管理规则,用于删除其唯一剩余版本是删除标记的对象。
存储桶过期规则完全符合 MinIO WORM 锁定和合法保留 - 锁定下的对象将保留在磁盘上,直到锁定过期或被明确解除。 一旦对象不再受锁定,MinIO 开始正常应用到期规则。
console设置lifecycle
Lifecycle(生命周期):就是配置生命这个bucket的生命周期。
类型选择Expiry代表是过期直接删除,选择Transition就是过期后转移到目标存储服务器。需要搭配Tiering使用。
After:代表多少天后过期 (After 3 就是这个bucket的对象创建时间开始三天后被自动删除)
特别提醒
对 After的理解,minio的Lifecycle执行应该是按照UTC时间。
举个例子:
After 1
Object创建日期 2023-03-15 09:06(UTC时间 2023-03-15 01:06)
Lifecycle执行删除操作应该是在UTC时间 2023-03-17 00:00(Asia/Shanghai时间 2023-03-17 08:00)
第一种情况,当你的bucket里面有之前上传的文件,举个例子三天前上传的,现在去设置一个after1,会立马删除符合的对象。(test02桶共1w个Object,设置“after 1”删除1w条数据耗时7分钟左右 从16:15:14:748——16:22:12:448 )
第二钟情况,当你的bucket里面没有之前上传的文件,这个时候上传了一个文件,然后设置了after1,会等到符合条件后自动删除,这块我没去测试时间是否精准。
Prefix:文件名前缀。(前缀即桶内的文件夹名)
MinIO对象生命周期管理解析_minio 生命周期_steely_chen的博客-CSDN博客
JavaSDK设置lifecycle
setBucketLifecycle
public void setBucketLifecycle() {
try {
List rules = new LinkedList();
rules.add(
new LifecycleRule(
Status.ENABLED,
null,
new Expiration((ZonedDateTime) null, 5, null),
new RuleFilter("logs/"),
"rule2",
null,
null,
null));
LifecycleConfiguration config = new LifecycleConfiguration(rules);
minioClient.setBucketLifecycle(
SetBucketLifecycleArgs.builder().bucket("test04").config(config).build());
} catch (Exception e) {
System.out.println("Error occurred: " + e);
}
}
LifecycleRule 的配置参数
AbortIncompleteMultipartUpload(int daysAfterInitiation)设置分片在距最后修改时间30天后过期。
Expiration(ZonedDateTime date, Integer days, Boolean expiredObjectDeleteMarker) 指定日期或天数过期,标志删除or删除
RuleFilter(AndOperator andOperator,String prefix,Tag tag) 依据前缀删除(前缀即桶内的文件夹名)还是tag标志删除
id,一个桶可以设置多个rule
NoncurrentVersionExpiration(int noncurrentDays)设置非当前版本的Object
NoncurrentVersionTransition(int noncurrentDays,String storageClass) 设置非当前版本的Object距最后修改时间90天之后转为低频访问类型、归档类型。非当前版本对象何时进行存储类型的转换和转换的存储类型,待确认storageClass
注:可设置多个rule,但第二次设置setBucketLifecycle会覆盖第一次设置setBucketLifecycle
getBucketLifecycle
public void getBucketLifecycle() {
try {
LifecycleConfiguration config =
minioClient.getBucketLifecycle(
GetBucketLifecycleArgs.builder().bucket("test01").build());
List rules = config.rules();
for (int i = 0; i < rules.size(); i++) {
System.out.println("Lifecycle status is " + rules.get(i).status());
System.out.println("Lifecycle prefix is " + rules.get(i).filter().prefix());
System.out.println("Lifecycle expiration days is " + rules.get(i).expiration().days());
}
} catch (Exception e) {
System.out.println("Error occurred: " + e);
}
}
deleteBucketLifecycle
public void deleteBucketLifecycle() {
try {
minioClient.deleteBucketLifecycle(
DeleteBucketLifecycleArgs.builder().bucket("my-bucketName").build());
} catch (Exception e) {
System.out.println("Error occurred: " + e);
}
}
6. 附录
juejin.cn/post/707942…
blog.csdn.net/sinat_21221…
k8s版minio集群
k8s部署minio+StorageClass+NFS_lihongbao80的博客-CSDN博客
minio集群扩容
minio分布式集群扩容_minio 扩容_freesharer的博客-CSDN博客
Minio使用纠删码erasure code和校验和checksum来保护数据免受硬件故障和无声数据损坏。 即便您丢失一半数量(N/2)的硬盘,您仍然可以恢复数据
blog.csdn.net/qq_43437874…
当删除data1或data2下的文件,然后会发现,被删除的文件夹竟然自动恢复了过来
rm -rf data1/*
Proceeding to heal 'http://k8s-node02:9000/data1' - 'mc admin heal alias/ --verbose' to check the status.
Healing drive '/data1' complete (healed: 10026, failed: 0).
Minio控制台详细教程
juejin.cn/post/720697…