Minio 是一个基于Go语言的对象存储服务。它实现了大部分亚马逊S3云存储服务接口,可以看做是是S3的开源版本,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。

Minio的实际应用场景

Minio作为轻量级的对象存储服务,在企业级应用中有着广泛的应用场景:

  1. 媒体文件存储:存储和管理图片、视频、音频等媒体文件,支持高并发访问。

  2. 备份与归档:作为数据备份和归档的存储解决方案,提供高可靠性和安全性。

  3. 容器镜像存储:作为Docker、Kubernetes等容器技术的镜像仓库。

  4. 日志存储:存储应用程序和系统的日志文件,方便后续分析和查询。

  5. 数据湖:作为数据湖的存储底层,支持大数据分析和处理。

  6. 边缘计算:在边缘设备上部署Minio,实现边缘数据的本地存储和处理。

个人见解:Minio的技术价值

Minio的出现为企业级对象存储提供了一种轻量级、高性能的解决方案,其技术价值主要体现在:

  1. 高性能:基于Go语言开发,具有出色的性能表现,适合处理高并发请求。

  2. 易于部署:安装和配置简单,支持多种部署模式,包括单机、分布式和云原生部署。

  3. S3兼容:与Amazon S3 API兼容,便于迁移和集成现有系统。

  4. 可扩展性:支持横向扩展,可以通过增加节点来提高存储容量和性能。

  5. 数据安全:内置纠删码和校验和机制,确保数据的可靠性和安全性。

项目 参数
最大驱动器数量 16
最小驱动器数量 4
读仲裁 n/2
写仲裁 n/2+1
最大桶数 无限制
每桶最大对象数 无限制
最大对象大小 5TB
最小对象大小 0
每次 PUT 操作的最大对象大小 5GB
每次上传的最大 Part 数量 10000
Part 大小 5MB到5GB. 最后一个part可以从0B到5GB
每次list parts请求可返回的part最大数量 1000
每次list objects请求可返回的object最大数量 1000
每次list multipart uploads请求可返回的multipart uploads最大数量 1000

一.minio基本原理

1.minio基本特点

高性能:作为高性能对象存储,在标准硬件条件下它能达到55GB/s的读、35GG/s的写速率
可扩容:不同MinIO集群可以组成联邦,并形成一个全局的命名空间,并跨越多个数据中心
云原生:容器化、基于K8S的编排、多租户支持
Amazon S3兼容:Minio使用Amazon S3 v2 / v4 API。可以使用Minio SDK,Minio Client,AWS SDK和AWS CLI访问Minio服务器。
可对接后端存储: 除了Minio自己的文件系统,还支持DAS、 JBODs、NAS、Google云存储和Azure Blob存储。
SDK支持: 基于Minio轻量的特点,它得到类似Java、Python或Go等语言的sdk支持
Lambda计算: Minio服务器通过其兼容AWS SNS / SQS的事件通知服务触发Lambda功能。支持的目标是消息队列,如Kafka,NATS,AMQP,MQTT,Webhooks以及Elasticsearch,Redis,Postgres和MySQL等数据库。
有操作页面
功能简单: 这一设计原则让MinIO不容易出错、更快启动
支持纠删码:MinIO使用纠删码、Checksum来防止硬件错误和静默数据污染。在最高冗余度配置下,即使丢失1/2的磁盘也能恢复数据

2.minio的存储机制

Minio使用纠删码erasure code和校验和checksum来保护数据免受硬件故障和无声数据损坏。 即便丢失一半数量(N/2)的硬盘,仍然可以恢复数据。

3.minio的纠删码

纠删码是一种恢复丢失和损坏数据的数学算法,目前,纠删码技术在分布式存储系统中的应用主要有三类,阵列纠删码(Array Code: RAID5、RAID6 等)、RS(Reed-Solomon)里德-所罗门类纠删码和 LDPC(LowDensity Parity Check Code)低密度奇偶校验纠删码。Erasure Code 是一种编码技术,它可以将 n 份原始数据,增加 m 份数据,并能通过 n+m 份中的任意 n 份数据,还原为原始数据。即如果有任意小于等于 m 份的数据失效,仍然能通过剩下的数据还原出来

4.minio的擦除代码

MinIO 使用每个对象的内联擦除编码来保护数据,这种编码是用汇编代码编写的,可以提供尽可能高的性能。MinIO 使用 Reed-Solomon 代码将对象条带化为 n/2 数据和 n/2 奇偶校验块——尽管这些可以配置为任何所需的冗余级别。这意味着在 12 个驱动器设置中,一个对象被分割为 6 个数据和 6 个奇偶校验块。即使您丢失了 5 个(n/2) -1 个驱动器,无论是奇偶校验还是数据,您仍然可以从剩余驱动器可靠地重构数据。MinIO 的实现确保即使多个设备丢失或不可用,也可以读取对象或写入新对象。最后,MinIO 的擦除代码在对象级别,可以一次治愈一个对象。

二.minio安装

1
2
3
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
./minio server /data

后台运行

1
nohup /usr/local/bin/minio server  /home/minio/data > /home/minio/data/minio.log 2>&1 &

minio默认端口9000,直接访问ip:9000,如图:

三.minio使用

引入minio客户端jar包

1
2
3
4
5
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>7.0.2</version>
</dependency>

minio相关的代码及具体使用:

四. minio分布式集群搭建

生产环境下最少4个节点

节点 IP data
minio1 10.0.0.1 /home/minio/data
minio2 10.0.0.2 /home/minio/data
minio3 10.0.0.3 /home/minio/data
minio4 10.0.0.4 /home/minio/data

1.初始化ACCESS KEY 和SECRET KEY

1
2
export MINIO_ACCESS_KEY=admin
export MINIO_SECRET_KEY=admin1234

2.搭建minio

1
2
3
4
./minio server --address :9000 http://10.0.0.1/home/minio/data \
http://10.0.0.2/home/minio/data \
http://10.0.0.3/home/minio/data \
http://10.0.0.4/home/minio/data \

注意:minio搭建机器时间差距不能过大,使用以下指令查看和修改当前系统时间:

1
2
date
date -s '2020-06-11 21:02:00'

五.脚本启动minio

1.创建run.sh 文件

1
touch run.sh

2.编辑run.sh 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
export MINIO_CACHE="on"
export MINIO_CACHE_DRIVES="http://10.0.0.1/home/minio/data,http://10.0.0.2/home/minio/data,http://10.0.0.3/home/minio/data,http://10.0.0.4/home/minio/data"
export MINIO_CACHE_QUOTA=80
export MINIO_CACHE_AFTER=3
export MINIO_CACHE_WATERMARK_LOW=70
export MINIO_CACHE_WATERMARK_HIGH=90
export MINIO_ACCESS_KEY=admin
export MINIO_SECRET_KEY=admin1234

chmod a+x /hom/minio/data

./minio server --address :9000 \
http://10.0.0.1/home/minio/data \
http://10.0.0.2/home/minio/data \
http://10.0.0.3/home/minio/data \
http://10.0.0.4/home/minio/data \

3.minio.service
WorkingDirectory:二进制文件
ExecStart:集群启动脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cat > /usr/lib/systemd/system/minio.service <<EOF
[Unit]
Description=Minio service
Documentation=https://docs.minio.io/

[Service]
WorkingDirectory=/home/minio/
ExecStart=/home/minio/run.sh

Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

4.权限管理

1
2
chmod +x data && chmod +x run.sh
chmod +x /usr/lib/systemd/system/minio.service

5.启动minio

1
2
systemctl daemon-reload
systemctl start minio

开机自启动

1
systemctl enable minio.service 

六.nginx动态代理

修改nginx的conf文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
upstream http_minio {
server 10.0.0.1:9000 weight=25 max_fails=2 fail_timeout=30s;
server 10.0.0.2:9000 weight=25 max_fails=2 fail_timeout=30s;
server 10.0.0.3:9000 weight=25 max_fails=2 fail_timeout=30s;
server 10.0.0.4:9000 weight=25 max_fails=2 fail_timeout=30s;

}

server{
listen 9001;
server_name 10.0.0.1;

ignore_invalid_headers off;
client_max_body_size 0;
proxy_buffering off;

location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host:$server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
proxy_set_header Host $http_host;

proxy_connect_timeout 300;
proxy_http_version 1.1;
chunked_transfer_encoding off;
proxy_ignore_client_abort on;

proxy_pass http://http_minio;
}
}

进入sbin目录下重启nginx即可

1
./nginx -s reload

访问10.0.0.1:9001

七.Minio的发展趋势

1. 技术演进

Minio 作为一个开源的对象存储服务,一直在不断演进和完善:

  • 版本更新:从早期版本到现在的最新版本,Minio 不断添加新特性和改进性能。
  • 云原生支持:加强了对 Kubernetes 等容器编排平台的支持,提供了更完善的云原生部署方案。
  • 安全性增强:不断加强安全特性,如加密、访问控制等。
  • 生态系统扩展:与更多的工具和框架集成,如 Prometheus、Grafana 等监控工具。

2. 与新兴技术的融合

  • 边缘计算:Minio 正在积极拥抱边缘计算,提供边缘节点的数据存储解决方案。
  • AI/机器学习:与机器学习框架集成,支持模型训练数据的存储和管理。
  • 大数据:与 Hadoop、Spark 等大数据处理框架集成,作为数据湖的存储底层。

3. 未来发展方向

  • 多租户支持:进一步增强多租户功能,满足企业级应用的需求。
  • 混合云:支持混合云部署,实现数据在本地和云之间的无缝流动。
  • 智能存储:引入 AI 技术,实现存储的智能化管理和优化。
  • 更低的存储成本:通过技术创新,进一步降低存储成本。

八.总结与个人感悟

Minio 作为一个轻量级的对象存储服务,已经在企业级应用中得到了广泛的应用。它的出现为企业提供了一种高性能、可靠、易于部署的对象存储解决方案。

技术价值

  • 填补了轻量级对象存储的空白:Minio 提供了一种介于本地文件系统和大型分布式存储之间的解决方案,适合中小规模的应用场景。
  • 简化了存储管理:Minio 的设计理念是简单易用,大大简化了存储管理的复杂度。
  • 降低了存储成本:作为开源软件,Minio 可以帮助企业降低存储成本,避免了商业存储解决方案的高昂费用。

应用价值

  • 加速应用开发:Minio 提供了简单易用的 API,加速了应用开发的速度。
  • 提高数据可靠性:通过纠删码和校验和机制,Minio 提高了数据的可靠性和安全性。
  • 支持业务创新:作为基础存储服务,Minio 支持了各种业务创新,如媒体服务、备份服务等。

个人感悟

作为一名技术人员,我认为 Minio 的成功在于它的专注和简洁。它专注于解决对象存储的核心问题,提供了简单而强大的解决方案。这种专注和简洁的设计理念值得我们学习。

在未来的技术发展中,随着数据量的不断增长,对象存储的重要性将会越来越凸显。Minio 作为一个开源的对象存储服务,将会继续发挥重要的作用。对于我们来说,学习和掌握 Minio 不仅是了解一种技术,更是理解现代存储架构的重要途径。