学习笔记MinIo对象存储-Docker分布式集群搭建踩坑!

1.概述

1.1含义

​ MinIO 是一款基于Go语言的高性能对象存储服务,在Github上已有39K+Star。它采用了Apache License v2.0开源协议,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。 本文将使用 MinIO 来自建一个对象存储服务用于存储图片。

​ MinIO是一种高性能、分布式对象存储服务,专为云原生和容器化应用设计。它具有以下主要特点和功能:

  1. 对象存储:MinIO提供了一个简单而强大的对象存储接口,允许你存储和检索任意大小的文件,从几KB到几TB。
  2. 高性能:MinIO被设计为高性能的对象存储服务。它使用并行和分布式算法来加速数据的上传和下载,并通过多线程和流式传输来提供快速的访问速度。
  3. 可扩展性:MinIO支持水平扩展,可以根据需求增加存储容量和处理能力。你可以通过添加更多的MinIO实例来构建一个分布式存储集群,实现数据的高可用性和容错性。
  4. 高度兼容:MinIO与AWS S3 API兼容,这意味着你可以使用现有的S3工具和库与MinIO进行交互,无需进行修改。
  5. 安全性:MinIO提供了多种安全功能,包括数据加密、访问控制、身份验证和网络传输加密。你可以根据需求配置适当的安全策略来保护存储的数据。
  6. 高度可用:MinIO具有高度可用的架构,支持数据冗余和故障转移。当一个节点发生故障时,存储集群将自动恢复并保持可用性。
  7. 开源和免费: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/s35Gb/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支持:

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. 冗余度较低: 纠删码可以将原始数据分割成多个数据块,并生成一些冗余数据块,相比传统备份方式,所需的冗余度更低。这意味着纠删码可以以更高的存储效率提供数据冗余和容错。
  2. 容错能力强: 纠删码可以根据冗余数据块中的部分信息,恢复丢失或损坏的原始数据块。即使在数据丢失或硬件故障的情况下,仍然可以恢复完整的数据。不同的纠删码方案提供不同程度的容错能力,可以根据具体需求选择适当的方案。
  3. 数据分布均衡: 纠删码可以将数据分布在多个存储节点上,实现数据的分布式存储。这样可以避免数据集中在单个节点上,提高系统的负载均衡和性能。
  4. 节省存储空间: 纠删码可以以较低的冗余度提供数据的容错性,相比传统备份方式可以节省存储空间。特别是在大规模数据存储场景下,纠删码可以显著减少存储成本。

纠删码的应用范围广泛,包括云存储、分布式文件系统、大规模数据中心等领域。它在数据冗余和容错方面具有独特的优势,并且在面对大规模数据处理和存储需求时,成为了一种重要的技术手段。

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)
    

    说明:

    ​ 此时查看其余节点的日志

注意:

注意:

  • 若所挂载的硬盘容量不够大,会出现如下提示

    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: 设置请求头中的一些变量值,例如HostX-Real-IPX-Forwarded-ForX-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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/D_boj/article/details/131117462