1.概述
1.1含义
MinIO 是一款基于Go语言的高性能对象存储服务,在Github上已有39K+Star。它采用了Apache License v2.0开源协议,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。 本文将使用 MinIO 来自建一个对象存储服务用于存储图片。
MinIO是一种高性能、分布式对象存储服务,专为云原生和容器化应用设计。它具有以下主要特点和功能:
- 对象存储:MinIO提供了一个简单而强大的对象存储接口,允许你存储和检索任意大小的文件,从几KB到几TB。
- 高性能:MinIO被设计为高性能的对象存储服务。它使用并行和分布式算法来加速数据的上传和下载,并通过多线程和流式传输来提供快速的访问速度。
- 可扩展性:MinIO支持水平扩展,可以根据需求增加存储容量和处理能力。你可以通过添加更多的MinIO实例来构建一个分布式存储集群,实现数据的高可用性和容错性。
- 高度兼容:MinIO与AWS S3 API兼容,这意味着你可以使用现有的S3工具和库与MinIO进行交互,无需进行修改。
- 安全性:MinIO提供了多种安全功能,包括数据加密、访问控制、身份验证和网络传输加密。你可以根据需求配置适当的安全策略来保护存储的数据。
- 高度可用:MinIO具有高度可用的架构,支持数据冗余和故障转移。当一个节点发生故障时,存储集群将自动恢复并保持可用性。
- 开源和免费:MinIO是开源软件,遵循Apache License 2.0许可。你可以免费使用、修改和分发MinIO。
MinIO非常适合用于构建私有云、存储和分发静态内容、备份和归档等场景。它提供了简单易用的接口和丰富的功能,使开发人员能够轻松地构建和管理对象存储服务。
This tutorial assumes all hosts running MinIO use a recommended Linux operating system such as RHEL8+ or Ubuntu 18.04+.
1.2应用场景
如下图,MinIO 的应用场景除了可以作为私有云的对象存储服务来使用,也可以作为云对象存储的网关层,无缝对接 Amazon S3
或者 MicroSoft Azure
1.3特点
高性能:
作为一款高性能存储,在标准硬件条件下,其读写速率分别可以达到 55Gb/s
和 35Gb/s
。并而 MinIO 支持一个对象文件可以是任意大小,从几kb到最大5T不等。
可扩展:
不同MinIO集群可以组成联邦,并形成一个全局的命名空间,并且支持跨越多个数据中心。
云原生:
容器化、基于K8S的编排、多租户支持。
Amazon S3兼容:
使用 Amazon S3 v2 / v4 API。可以使用Minio SDK,Minio Client,AWS SDK 和 AWS CLI 访问Minio服务器。
可对接多种后端存储:
除了Minio自己的文件系统,还支持 DAS、 JBODs、NAS、Google云存储和 Azure Blob存储。
SDK支持:
- GO SDK: https://github.com/minio/minio-go
- JavaSDK: https://github.com/minio/minio-java
- PythonSDK: https://github.com/minio/minio-py
Lambda计算:
Minio服务器通过其兼容AWS SNS / SQS的事件通知服务触发Lambda功能。支持的目标是消息队列,如Kafka,NATS,AMQP,MQTT,Webhooks以及Elasticsearch,Redis,Postgres和MySQL等数据库。
图形化界面
有操作页面。
功能简单:
不容易出错,快速启动。
支持纠删码:
MinIO使用纠删码、Checksum来防止硬件错误和静默数据污染。在最高冗余度配置下,即使丢失1/2的磁盘也能恢复数据。
1.4基础概念
object:存储到 Minio的基本对象,如文件、字节流,Anything…
Bucket:用来存储Object的逻辑空间。每个Bucket之间的数据是相互隔离的。对于客户端而言,就相当于一个存放文件的顶层文件夹。
Drive:即存储数据的磁盘,在MinlO启动时,以参数的方式传入。Minio 中所有的对象数据都会存储在Drive里。
set :即一组Drive的集合,分布式部署根据集群规模自动划分一个或多个Set,每个Set 中的Drive分布在不同位置。一个对象存储在一个Set上。(For example: {1…64} is divided into 4 sets each of size 16.)
- 一个对象存储在一个Set上
- 一个集群划分为多个Set
- 一个Set包含的Drive数量是固定的,默认由系统根据集群规模自动计算得出。—个SET中的Drive尽可能分布在不同的节点上
1.5纠删码EC(Erasure Code)
纠删码(Erasure Code)是一种数据编码技术,用于数据冗余和容错。它通过将原始数据分割成多个数据块,并生成额外的冗余数据块,实现数据的容错和恢复。
纠删码通常用于分布式存储系统中,以提高数据的可靠性和持久性。相比传统的数据冗余备份方式,纠删码具有更高的存储效率。
以下是纠删码的主要特点和优势:
- 冗余度较低: 纠删码可以将原始数据分割成多个数据块,并生成一些冗余数据块,相比传统备份方式,所需的冗余度更低。这意味着纠删码可以以更高的存储效率提供数据冗余和容错。
- 容错能力强: 纠删码可以根据冗余数据块中的部分信息,恢复丢失或损坏的原始数据块。即使在数据丢失或硬件故障的情况下,仍然可以恢复完整的数据。不同的纠删码方案提供不同程度的容错能力,可以根据具体需求选择适当的方案。
- 数据分布均衡: 纠删码可以将数据分布在多个存储节点上,实现数据的分布式存储。这样可以避免数据集中在单个节点上,提高系统的负载均衡和性能。
- 节省存储空间: 纠删码可以以较低的冗余度提供数据的容错性,相比传统备份方式可以节省存储空间。特别是在大规模数据存储场景下,纠删码可以显著减少存储成本。
纠删码的应用范围广泛,包括云存储、分布式文件系统、大规模数据中心等领域。它在数据冗余和容错方面具有独特的优势,并且在面对大规模数据处理和存储需求时,成为了一种重要的技术手段。
1.6存储形式
文件对象上传到MinlO,会在对应的数据存储磁盘中,以Bucket名称为目录,文件名称为下一级目录,文件名下是part.1和xl.meta(老版本,最新版本如下图),前者是编码数据块及检验块,后者是元数据文件。
说明:
- 纠删码是用奇偶的方式去存储的
- MinIo在新版本,会存放一个Hash码,进行文件的完整性校验。若Hash码校验不同,则代表文件不完整。
1.7存储方案
说明:
当MinIO集群搭建完成后,会提供API的接口。只需要额外暴露一个端口,就可以达到分布式存储的方式
说明:
8节点,每个节点1块硬盘
说明:
4节点,每个节点4块盘
2.基本用例
2.1单机部署
2.1.2无纠删码模式
2.1.2.1概述
说明:
在单机部署进行无纠删码模式的启动,对于每一份对象数据,minio直接在data下面存储这份数据,不会建立副本,也不会启用纠删码机制。因此,这种模式无论是服务实例还是磁盘都是“单点”,无任何高可用保障,磁盘损坏就表示数据丢失
2.1.2.2Linux方式
步骤一:安装MinIO服务
以下选项卡提供了使用 RPM、DEB 或二进制将 MinIO 安装到 64 位 Linux 操作系统上的示例。 RPM 和 DEB 软件包会自动将 MinIO 安装到必要的系统路径,并为 创建服务。 MinIO 强烈建议使用 RPM 或 DEB 安装路由。 要更新使用 管理的部署,请参阅更新 systemctl 管理的 MinIO 部署。
wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20230527055619.0.0.x86_64.rpm -O minio.rpm
sudo dnf install minio.rpm
说明:
以上操作步骤是在系统架构为AMD 64-bit 的系统上进行
步骤二:启动MinIO服务
从系统终端或外壳运行以下命令,使用该文件夹启动本地 MinIO 实例。您可以将此路径替换为本地计算机上的另一个文件夹路径:~/minio
mkdir ~/minio
minio server ~/minio --console-address :9090
说明:
通过该命令来启动MinIO服务,通过指定Path参数来标识服务器在其中运行的文件夹
当程序启动成功,控制台会打印如下内容:
说明:
- 可以看到登录密码和登录用户默认为:
minioadmin
注意:
以上步骤为正常执行流程,但此时会发现, 有一个警告:
警告内容提示,控制器的端口为动态,而不是静态固定,此时需要手动指定端口。若需要修改初始账号密码,也需要额外指定。请继续往下看。
补充:
默认用户名密码minioadmin:minioadmin,修改默认用户名密码可以使用:
export MINIO_ROOT_USER=root export MINIO_ROOT_PASSWORD=qweasdzxc
默认的配置目录是${HOME}/.minio,可以通过–config-dir命令自定义配置目录:
minio server --config-dir /mnt/config /mnt/data
控制台监听端口是动态生成的,可以通过–console-address ":port"指定静态端口
minio server --console-address ":9090" /mnt/data
步骤三:浏览器连接MinIO服务
在 Web 浏览器中打开 http://127.0.0.1:9000 以访问 MinIO 控制台。 您也可以输入指定为服务器命令输出一部分的任何网络地址。 例如,示例输出中的控制台:http://192.0.2.10:9090 http://127.0.0.1:9090 指示用于连接到控制台的两个可能地址。
2.1.2.3Docker方式
步骤一:检查系统的指定端口占用情况
">
sudo netstat -tuln | grep 9000
sudo netstat -tuln | grep 9090
说明:
- 查看指定9000和9090端口,为接下来的Docker端口映射做准备
- 使用格式: sudo netstat -tuln | grep
若出现端口占用情况,如下所示,则需将Docker的映射端口进行合理跟换
若出现无端口占用情况,则不会返回任何消息
步骤二:启动MinIO服务
docker run -d \
-p 9000:9000 \
-p 9090:9090 \
--name=minio \
--restart=always \
-e "MINIO_ROOT_USER=root" \
-e "MINIO_ROOT_PASSWORD=qweasdzxc" \
-v /home/data:/data -v /home/config:/root/.minio \
minio/minio server /data \
--console-address ":9000" \
--address ":9090"
注意:
- minio默认启动是动态端口,这里需要设置固定端口
--console-address ":9000" --address ":9090"
- 踩坑,此处需要将MinIO服务的S3-API接口端口一并映射到系统主机上
说明:
docker run
: 用于在Docker中运行一个新的容器。-d
: 表示以后台(守护进程)模式运行容器。-p 9000:9000
: 将主机的9000端口映射到容器的9000端口,允许从主机上访问MinIO服务。-p 9090:9090
: 将主机的9090端口映射到容器的9090端口,允许从主机上访问MinIO服务的S3-API接口。--name=minio
: 指定容器的名称为"minio"。--restart=always
: 设置容器在启动时自动重启。-e "MINIO_ROOT_USER=root"
: 设置MinIO的根用户为"root"。-e "MINIO_ROOT_PASSWORD=qweasdzxc"
: 设置MinIO的根用户密码为"qweasdzxc"。-v /home/data:/data
: 将主机的"/home/data"目录挂载到容器的"/data"目录,用于存储MinIO的数据。-v /home/config:/root/.minio
: 将主机的"/home/config"目录挂载到容器的"/root/.minio"目录,用于存储MinIO的配置文件。minio/minio
: 使用MinIO的Docker镜像。server /data
: 指定MinIO服务器的数据目录为"/data"。--console-address ":9000"
: 指定MinIO控制台的地址为":9000",允许通过该地址访问MinIO的Web界面。--address ":9090"
: 指定MinIO服务器的地址为":9090",允许通过该地址访问MinIO的API接口。
步骤三:查看监听端口信息
查看系统上的网络连接和监听端口信息
netstat -tpnl
说明:
可以看到,端口监听已存在
步骤四:浏览器连接MinIO服务
在 Web 浏览器中打开 http://127.0.0.1:9000 以访问 MinIO 控制台。 您也可以输入指定为服务器命令输出一部分的任何网络地址。 例如,示例输出中的控制台:http://192.0.2.10:9090 http://127.0.0.1:9090 指示用于连接到控制台的两个可能地址。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-75QJ5Qwx-1686235487719)(MiNIO.assets/image-20230605111810325.png)]
2.1.3有纠删码模式
2.1.3.1概述
Minio使用纠删码erasure code和校验和checksum来保护数据免受硬件故障和无声数据损坏。即便您丢失一半数量(N/2)的硬盘,您仍然可以恢复数据。
纠删码是一种恢复丢失和损坏数据的数学算法,Minio采用Reed-Solomon code将对象拆分成N/2数据和N/2奇偶校验块。这就 意味着如果是12块盘,一个对象会被分成6个数据块、6个奇偶校验块,你可以丢失任意6块盘(不管其是存放的数据块还是奇偶校验块),你仍可以从剩下的盘中的数据进行恢复。
说明:
在单机部署进行无纠删码模式的启动,此模式为minio server实例传入多个本地磁盘参数。一旦遇到多于一个磁盘参数,,minio server会自动启用erasure code mode.erasure code对磁盘的个数是有要求的,如不满足要求,实例启动将失败。erasure code启用后,要求传给minio server的endpoint(standalone模式下,即本地磁盘上的目录)至少为4个。
说明:
如果文件小于10M,则会以文件的形式进行存储。若文件大于10M,则会对文件对象进行分块存储
2.1.3.2 操作步骤
步骤一:启动MinIO服务
docker run -d \
-p 9000:9000 \
-p 9090:9090 \
--name=minio \
--restart=always \
-e "MINIO_ROOT_USER=root" \
-e "MINIO_ROOT_PASSWORD=qweasdzxc" \
-v /home/minio/data1:/data1 \
-v /home/minio/data2:/data2 \
-v /home/minio/data3:/data3 \
-v /home/minio/data4:/data4 \
-v /home/minio/data5:/data5 \
-v /home/minio/data6:/data6 \
-v /home/minio/data7:/data7 \
-v /home/minio/data8:/data8 \
minio/minio server /data{1...8} \
--console-address ":9000" \
--address ":9090"
注意:
- minio默认启动是动态端口,这里需要设置固定端口
--console-address ":9000" --address ":9090"
- 踩坑,此处需要将MinIO服务的S3-API接口端口一并映射到系统主机上
说明:
docker run
: 用于在Docker中运行一个新的容器。-d
: 表示以后台(守护进程)模式运行容器。-p 9000:9000
: 将主机的9000端口映射到容器的9000端口,允许从主机上访问MinIO服务。-p 9090:9090
: 将主机的9090端口映射到容器的9090端口,允许从主机上访问MinIO服务的S3-API接口。--name=minio
: 指定容器的名称为"minio"。--restart=always
: 设置容器在启动时自动重启。-e "MINIO_ROOT_USER=root"
: 设置MinIO的根用户为"root"。-e "MINIO_ROOT_PASSWORD=qweasdzxc"
: 设置MinIO的根用户密码为"qweasdzxc"。-v /home/data:/data
: 将主机的"/home/data"目录挂载到容器的"/data"目录,用于存储MinIO的数据。-v /home/config:/root/.minio
: 将主机的"/home/config"目录挂载到容器的"/root/.minio"目录,用于存储MinIO的配置文件。minio/minio
: 使用MinIO的Docker镜像。server /data
: 指定MinIO服务器的数据目录为"/data"。--console-address ":9000"
: 指定MinIO控制台的地址为":9000",允许通过该地址访问MinIO的Web界面。--address ":9090"
: 指定MinIO服务器的地址为":9090",允许通过该地址访问MinIO的API接口。
补充:查看存储目录
- 通过mc客户端工具可以看到,photo存储桶中的8个磁盘中存有磁盘文件的校验码以及源文件信息
步骤二:浏览器连接MinIO服务
说明:
看到此界面,即可成功使用MinIo服务
2.2分布式集群部署
2.2.1概述
2.2.1.1含义
分布式Minio可以让你将多块硬盘(甚至在不同的机器上)组成一个对象存储服务。由于硬盘分布在不同的节点上,分布式Minio避免了单点故障。
2.2.1.2常用方法
分布式存储,很关键的点在于数据的可靠性,即保证数据的完整,不丢失,不损坏。只有在可靠性实现的前提下,才有了追求一致性、高可用、高性能的基础。而对于在存储领域,一般对于保证数据可靠性的方法主要有两类,一类是冗余法,一类是校验法。
冗余
冗余法最简单直接,即对存储的数据进行副本备份,当数据出现丢失,损坏,即可使用备份内容进行恢复,而副本备份的多少,决定了数据可靠性的高低。这其中会有成本的考量,副本数据越多,数据越可靠,但需要的设备就越多,成本就越高。可靠性是允许丢失其中一份数据。当前已有很多分布式系统是采用此种方式实现,如Hadoop的文件系统(3个副本),Redis的集群,MySQL的主备模式等。
校验
校验法即通过校验码的数学计算的方式,对出现丢失、损坏的数据进行校验、还原。注意,这里有两个作用,一个校验,通过对数据进行校验和( checksum)进行计算,可以检查数据是否完整,有无损坏或更改,在数据传输和保存时经常用到,如TCP协议;二是恢复还原,通过对数据结合校验码,通过数学计算,还原丢失或损坏的数据,可以在保证数据可靠的前提下,降低冗余,如单机硬盘存储中的RAID技术,纠删码(Erasure Code)技术等。MinIO采用的就是纠删码技术。
2.2.1.3优势
数据保护
分布式Minio采用纠删码来防范多个节点宕机和位衰减bit rot 。分布式Minio至少需要4个硬盘,使用分布式Minio自动引入了纠删码功能。
高可用
单机Minio服务存在单点故障,相反,如果是一个有N块硬盘的分布式Minio,只要有N/2硬盘在线,你的数据就是安全的。不过你需要至少有N/2+1个硬盘来创建新的对象。
例如,一个16节点的Minio集群,每个节点16块硬盘,就算8台服务器宕机,这个集群仍然是可读的,不过你需要9台服务器才能写数据。
一致性
Minio在分布式和单机模式下,所有读写操作都严格遵守read-after-write一致性模型。
2.2.1.4注意事项
启动一个分布式Minio实例,你只需要把硬盘位置做为参数传给minio server命令即可,然后,你需要在所有其它节点运行同样的命令。
- 分布式Minio里所有的节点需要有同样的access秘钥和secret秘钥,这样这些节点才能建立联接。为了实现这个,你需要在执行minicserver命令之前,先将access秘钥和secret秘钥export成环境变量。新版本使用MINIO_ROOT_USER&MINIO_ROOT_PASSWORD。
- 分布式Minio使用的磁盘里必须是干净的,里面没有数据。
- 分布式Minio里的节点时间差不能超过3秒,你可以使用NTP来保证时间一致。
- 在Windows下运行分布式Minio处于实验阶段,请悠着点使用。
2.2.2基本用例
实验三:Docker集群方式启动
前提:
本教程假设所有运行 MinIO 的主机都使用推荐的 Linux 操作系统,例如 RHEL8+ 或 Ubuntu 18.04+。
步骤一:创建文件目录
cd /opt
mkdir minio
步骤二:挂载资源目录
sudo mount /dev/sda3 /opt/minio
说明:
提前查看资源目录
lsblk
步骤三:设置开机自动挂载
sudo nano /etc/fstab
/dev/sda3 /info/minio ext4 defaults 0 0
步骤四:Docker启动
注意:
- 所有节点需要在3秒内完成搭建
- 所有节点中的资源需要为空
- 所有节点的主机名必须不同且有序
分别在四台虚拟机上执行如下命令
sudo docker run -d -p 9000:9000 -p 9090:9090 \
--name=minio-node \
--restart=always \
-e "MINIO_ROOT_USER=root" \
-e "MINIO_ROOT_PASSWORD=qweasdzxc" \
-v /info/minio/data1:/data1 \
-v /info/minio/data2:/data2 \
-v /info/minio/data3:/data3 \
-v /info/minio/data4:/data4 \
-v /info/minio/data5:/data5 \
-v /info/minio/data6:/data6 \
-v /info/minio/data7:/data7 \
-v /info/minio/data8:/data8 \
-v /info/minio/config:/root/.minio \
--network host \
--hostname "host1" \
minio/minio server http://10.13.165.121:9000/data{1...8} http://10.13.165.122:9000/data{1...8} http://10.13.165.125:9000/data{1...8} http://10.13.165.199:9000/data{1...8} \
--console-address ":9090" \
sudo docker run -d -p 9000:9000 -p 9090:9090 \
--name=minio-node \
--restart=always \
-e "MINIO_ROOT_USER=root" \
-e "MINIO_ROOT_PASSWORD=qweasdzxc" \
-v /info/minio/data1:/data1 \
-v /info/minio/data2:/data2 \
-v /info/minio/data3:/data3 \
-v /info/minio/data4:/data4 \
-v /info/minio/data5:/data5 \
-v /info/minio/data6:/data6 \
-v /info/minio/data7:/data7 \
-v /info/minio/data8:/data8 \
-v /info/minio/config:/root/.minio \
--network host \
--hostname "host2" \
minio/minio server http://10.13.165.121:9000/data{1...8} http://10.13.165.122:9000/data{1...8} http://10.13.165.125:9000/data{1...8} http://10.13.165.199:9000/data{1...8} \
--console-address ":9090" \
sudo docker run -d -p 9000:9000 -p 9090:9090 \
--name=minio-node \
--restart=always \
-e "MINIO_ROOT_USER=root" \
-e "MINIO_ROOT_PASSWORD=qweasdzxc" \
-v /info/minio/data1:/data1 \
-v /info/minio/data2:/data2 \
-v /info/minio/data3:/data3 \
-v /info/minio/data4:/data4 \
-v /info/minio/data5:/data5 \
-v /info/minio/data6:/data6 \
-v /info/minio/data7:/data7 \
-v /info/minio/data8:/data8 \
-v /info/minio/config:/root/.minio \
--network host \
--hostname "host3" \
minio/minio server http://10.13.165.121:9000/data{1...8} http://10.13.165.122:9000/data{1...8} http://10.13.165.125:9000/data{1...8} http://10.13.165.199:9000/data{1...8} \
--console-address ":9090" \
sudo docker run -d -p 9000:9000 -p 9090:9090 \
--name=minio-node \
--restart=always \
-e "MINIO_ROOT_USER=root" \
-e "MINIO_ROOT_PASSWORD=qweasdzxc" \
-v /info/minio/data1:/data1 \
-v /info/minio/data2:/data2 \
-v /info/minio/data3:/data3 \
-v /info/minio/data4:/data4 \
-v /info/minio/data5:/data5 \
-v /info/minio/data6:/data6 \
-v /info/minio/data7:/data7 \
-v /info/minio/data8:/data8 \
-v /info/minio/config:/root/.minio \
--network host \
--hostname "host4" \
minio/minio server http://10.13.165.121:9000/data{1...8} http://10.13.165.122:9000/data{1...8} http://10.13.165.125:9000/data{1...8} http://10.13.165.199:9000/data{1...8} \
--console-address ":9090" \
说明:
- 此处配置为一个节点挂载8个硬盘
- 值得注意的是,挂载硬盘数量取值范围为2~16个之间
- 当使用了分布式集群的方式搭建了MinIo对象存储服务,MinIo内部会自动开启纠删码模式
补充:
前提是各个虚拟机之间需要能互相ping通
注意:
若初始文件包含有文件, 会出现如下提示
ERROR Unable to initialize backend: /data1 drive is already being used in another erasure deployment. (Number of drives specified: 16 but the number of drives found in the 1st drive's format.json: 4)
说明:
此时删除需要挂载路径的资源或者更换挂载目录即可
注意:
若其余主机出现问题,会出现如下提示
API: SYSTEM() Time: 08:07:08 UTC 06/06/2023 Error: Read failed. Insufficient number of drives online (*errors.errorString) 6: internal/logger/logger.go:258:logger.LogIf() 5: cmd/prepare-storage.go:246:cmd.connectLoadInitFormats() 4: cmd/prepare-storage.go:304:cmd.waitForFormatErasure() 3: cmd/erasure-server-pool.go:103:cmd.newErasureServerPools() 2: cmd/server-main.go:810:cmd.newObjectLayer() 1: cmd/server-main.go:611:cmd.serverMain() Waiting for a minimum of 2 drives to come online (elapsed 16s)
说明:
此时查看其余节点的日志
注意:
若未在代码执行时给主机命名,会出现如下提示
Unable to read 'format.json' from http://10.13.165.121:9000/data1: Do not upgrade one server at a time - please follow the recommended guidelines mentioned here https://github.com/minio/minio#upgrading-minio for your environment
说明:
当使用
--network host
主机模式时,需要使用--hostname "host"
指定运行主机名称,便于MinIo内部通信详细查看:
- [MinIO Server — MinIO Object Storage for Linux](https://min.io/docs/minio/linux/reference/minio-server/minio-server.html
- Unable to read ‘format.json’ from http://host2:9000/data: Not allowed (POST /minio/storage/data/v22/readall?disk-id=&file-path=format.json&volume=.minio.sys on S3 API) · Issue #11176 · minio/minio (github.com)
注意:
若所挂载的硬盘容量不够大,会出现如下提示
Error: Unable to initialize backend: failed to load rebalance data: Storage resources are insufficient for the read operation .minio.sys/rebalance.bin, retrying in 4.452062213s (*fmt.wrapError)
说明:
需要加大硬盘容量,检查硬盘是否挂载成功,更换硬盘挂载路径
步骤五:使用MinIo
注意:
若正常使用时节点宕机,会出现如下提示
Storage resources are insufficient for the write operation .minio.sys/tmp/d74be3f0-856f-4532-802b-871b44204f2a/92c33006-b79a-4560-bd65-0f40cb810d63/part.1
说明:
此时,请检查使用节点服务
步骤六:制作负载均衡器
前提:需要在电脑上安装好Nginx服务,详细请查看日志
1.修改nginx的default.conf配置文件
upstream minio{
server 10.13.165.121:9000;
server 10.13.165.122:9000;
server 10.13.165.125:9000;
server 10.13.165.199:9000;
}
upstream console{
ip_hash;
server 10.13.165.121:9090;
server 10.13.165.122:9090;
server 10.13.165.125:9090;
server 10.13.165.199:9090;
}
server {
listen 8000;
listen [::]:8000;
server_name localhost;
# To allow special characters in headers
ignore_invalid_headers off;
# Allow any size file to be uploaded.
# Set to a value such as 1000m; to restrict file size to a specific value
client_max_body_size 0;
# To disable buffering
proxy_buffering off;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 300;
# Default is HTTP/1, keepalive is only enabled in HTTP/1.1
proxy_http_version 1.1;
proxy_set_header Connection "";
chunked_transfer_encoding off;
proxy_pass http://minio;
}
}
server {
listen 8080;
listen [::]:8080;
server_name localhost;
# To allow special characters in headers
ignore_invalid_headers off;
# Allow any size file to be uploaded.
# Set to a value such as 1000m; to restrict file size to a specific value
client_max_body_size 0;
# To disable buffering
proxy_buffering off;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://console;
}
}
说明:
以上是一个Nginx的配置文件示例,下面是对其中各个配置项的含义解释:
listen
: 指定Nginx监听的端口号,这里是9000,同时使用IPv6的写法[::]:9000
表示同时监听IPv6和IPv4的请求。
server_name
: 定义该服务器块的域名或主机名。这里设置为localhost
,表示对于请求的域名为localhost的请求进行处理。
ignore_invalid_headers
: 控制是否忽略无效的请求头,默认为off
,表示不忽略。
client_max_body_size
: 定义客户端请求体的最大大小。设置为0表示不限制文件大小。
proxy_buffering
: 控制是否启用代理缓冲,默认为off
,表示禁用。
location /
: 定义Nginx的请求处理位置,这里是根目录/
。表示对于所有的请求都按照该位置的配置进行处理。
proxy_set_header
: 设置请求头中的一些变量值,例如Host
、X-Real-IP
、X-Forwarded-For
和X-Forwarded-Proto
等。
proxy_connect_timeout
: 设置与后端服务器建立连接的超时时间。
proxy_http_version
: 指定与后端服务器通信使用的HTTP协议版本。
proxy_set_header Connection "";
: 设置请求头中的Connection
字段为空,表示不保持连接。
chunked_transfer_encoding
: 控制是否启用分块传输编码,默认为off
,表示禁用。
proxy_pass
: 指定代理转发的目标服务器地址,这里是http://minio
,表示将请求转发给名为minio
的后端服务器。通过以上配置,Nginx会监听9000端口的请求,并将请求转发给名为
minio
的后端服务器进行处理。同时,还可以通过设置请求头、超时时间、HTTP协议版本等来对请求进行定制化的处理。
2.启动Nginx
docker run \
-p 8000:8000 \
-p 8080:8080 \
--name nginx \
--restart=always \
-v /opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /opt/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /opt/nginx/log:/var/log/nginx \
-v /opt/nginx/html:/usr/share/nginx/html \
-d nginx:latest
说明:
至此,nginx搭建完成,访问http://10.13.165.121:8080/、http://10.13.165.121:8000/即可代理成功
3.界面使用
3.1获取accessKey和secretKey
1.创建用户
2.创建密钥
日志
参考文档:
MinIO | High Performance, Kubernetes Native Object Storage
Minio SDKs - Python Client API文档 - 《Minio Cookbook 中文版》 - 书栈网 · BookStack
minio/minio-py: MinIO Client SDK for Python (github.com)
完整示例 - Java Photo API Service - 《Minio Cookbook 中文版》 - 书栈网 · BookStack
minio/minio: High Performance Object Storage for AI (github.com)
注意:
参考文档时,此处踩坑。需要参考英文文档,因为中文文档更新不及时
Docker 安装Nginx
步骤一:创建目录
# 创建挂载目录
mkdir -p /opt/nginx/conf
mkdir -p /opt/nginx/log
mkdir -p /opt/nginx/html
步骤二:添加执行权限
chmod 777 nginx
步骤三:生成容器
docker run --name nginx -p 9001:80 -d nginx
步骤四:复制nginx.conf文件
docker cp nginx:/etc/nginx/nginx.conf /opt/nginx/conf/nginx.conf
步骤五:复制conf.d文件夹
docker cp nginx:/etc/nginx/conf.d /opt/nginx/conf/conf.d
步骤六:复制html文件夹
docker cp nginx:/usr/share/nginx/html /opt/nginx/
步骤七:删除该容器
# 关闭该容器
docker stop nginx
# 删除该容器
docker rm nginx
步骤八:重新运行该容器
docker run \
-p 8080:80 \
--name nginx \
--restart=always \
-v /opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /opt/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /opt/nginx/log:/var/log/nginx \
-v /opt/nginx/html:/usr/share/nginx/html \
-d nginx:latest
步骤九:浏览器访问nginx文章来源:https://www.toymoban.com/news/detail-678075.html
文章来源地址https://www.toymoban.com/news/detail-678075.html
到了这里,关于学习笔记MinIo对象存储-Docker分布式集群搭建踩坑!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!