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

这篇具有很好参考价值的文章主要介绍了学习笔记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

minio集群,Linux,docker,分布式,运维

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支持:

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

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

1.6存储形式

​ 文件对象上传到MinlO,会在对应的数据存储磁盘中,以Bucket名称为目录,文件名称为下一级目录,文件名下是part.1和xl.meta(老版本,最新版本如下图),前者是编码数据块及检验块,后者是元数据文件。

minio集群,Linux,docker,分布式,运维

说明:

  • 纠删码是用奇偶的方式去存储的
  • MinIo在新版本,会存放一个Hash码,进行文件的完整性校验。若Hash码校验不同,则代表文件不完整。

1.7存储方案

minio集群,Linux,docker,分布式,运维

说明:

​ 当MinIO集群搭建完成后,会提供API的接口。只需要额外暴露一个端口,就可以达到分布式存储的方式

minio集群,Linux,docker,分布式,运维
说明:

8节点,每个节点1块硬盘

minio集群,Linux,docker,分布式,运维
说明:

​ 4节点,每个节点4块盘

2.基本用例

2.1单机部署

2.1.2无纠删码模式

2.1.2.1概述

minio集群,Linux,docker,分布式,运维

说明:

​ 在单机部署进行无纠删码模式的启动,对于每一份对象数据,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参数来标识服务器在其中运行的文件夹

当程序启动成功,控制台会打印如下内容:

minio集群,Linux,docker,分布式,运维

说明:

  • 可以看到登录密码和登录用户默认为:minioadmin

注意:

  • 以上步骤为正常执行流程,但此时会发现, 有一个警告:

    minio集群,Linux,docker,分布式,运维

  • 警告内容提示,控制器的端口为动态,而不是静态固定,此时需要手动指定端口。若需要修改初始账号密码,也需要额外指定。请继续往下看。

补充:

  • 默认用户名密码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集群,Linux,docker,分布式,运维

步骤三:浏览器连接MinIO服务

​ 在 Web 浏览器中打开 http://127.0.0.1:9000 以访问 MinIO 控制台。 您也可以输入指定为服务器命令输出一部分的任何网络地址。 例如,示例输出中的控制台:http://192.0.2.10:9090 http://127.0.0.1:9090 指示用于连接到控制台的两个可能地址。

minio集群,Linux,docker,分布式,运维

2.1.2.3Docker方式
步骤一:检查系统的指定端口占用情况
">
sudo netstat -tuln | grep 9000
sudo netstat -tuln | grep 9090

说明:

  • 查看指定9000和9090端口,为接下来的Docker端口映射做准备
  • 使用格式: sudo netstat -tuln | grep

若出现端口占用情况,如下所示,则需将Docker的映射端口进行合理跟换

若出现无端口占用情况,则不会返回任何消息

minio集群,Linux,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接口。
步骤三:查看监听端口信息

minio集群,Linux,docker,分布式,运维

查看系统上的网络连接和监听端口信息

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集群,Linux,docker,分布式,运维

​ 纠删码是一种恢复丢失和损坏数据的数学算法,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个。

minio集群,Linux,docker,分布式,运维

说明:

​ 如果文件小于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接口。

补充:查看存储目录

minio集群,Linux,docker,分布式,运维

  • 通过mc客户端工具可以看到,photo存储桶中的8个磁盘中存有磁盘文件的校验码以及源文件信息
步骤二:浏览器连接MinIO服务

minio集群,Linux,docker,分布式,运维

说明:

​ 看到此界面,即可成功使用MinIo服务

2.2分布式集群部署

2.2.1概述

2.2.1.1含义

​ 分布式Minio可以让你将多块硬盘(甚至在不同的机器上)组成一个对象存储服务。由于硬盘分布在不同的节点上,分布式Minio避免了单点故障。

minio集群,Linux,docker,分布式,运维

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
    

    minio集群,Linux,docker,分布式,运维

步骤三:设置开机自动挂载
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

minio集群,Linux,docker,分布式,运维

注意:

  • 若正常使用时节点宕机,会出现如下提示

    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/即可代理成功

minio集群,Linux,docker,分布式,运维

3.界面使用

3.1获取accessKey和secretKey

1.创建用户
minio集群,Linux,docker,分布式,运维

2.创建密钥

minio集群,Linux,docker,分布式,运维

日志

参考文档:

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

minio集群,Linux,docker,分布式,运维

步骤五:复制conf.d文件夹

docker cp nginx:/etc/nginx/conf.d /opt/nginx/conf/conf.d

minio集群,Linux,docker,分布式,运维

步骤六:复制html文件夹

docker cp nginx:/usr/share/nginx/html /opt/nginx/

minio集群,Linux,docker,分布式,运维

步骤七:删除该容器

# 关闭该容器
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

minio集群,Linux,docker,分布式,运维文章来源地址https://www.toymoban.com/news/detail-678075.html

到了这里,关于学习笔记MinIo对象存储-Docker分布式集群搭建踩坑!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux 部署 MinIO 分布式对象存储 & 配置为 typora 图床

    MinIO 是一款高性能的对象存储系统,它可以用于大规模的 AI/ML、数据湖和数据库工作负载。它的 API 与Amazon S3 云存储服务完全兼容,可以在任何云或本地基础设施上运行。MinIO 是 开源软件 ,也提供商业许可和支持 MinIO 的特点有: 简单 :MinIO 的安装和使用都非常简单,只需

    2024年02月07日
    浏览(58)
  • 云原生 | 从零开始,Minio 高性能分布式对象存储快速入手指南

    [ 点击 👉 关注「 全栈工程师修炼指南」公众号 ] 希望各位看友多多支持【关注、点赞、评论、收藏、投币】,助力每一个梦想。 【 WeiyiGeek Blog\\\'s - 花开堪折直须折,莫待无花空折枝  】 作者主页: 【 https://weiyigeek.top 】 博客地址: 【 https://blog.weiyigeek.top 】 作者答疑学习交

    2024年02月08日
    浏览(53)
  • 【分布式云储存】高性能云存储MinIO简介与Docker部署集群

    分布式存储服务一直以来是中大型项目不可或缺的一部分,一般常用的商用文件服务有七牛云、阿里云等等,自建的开源文件服务有FastDFS、HDFS等等。但是对于这些方案有的需要付费有些却太过于笨重,今天我们就分享一款轻量级完全可替代生产的高性能分布式储存服务Mini

    2024年02月07日
    浏览(57)
  • 【学习笔记】minIO分布式文件服务系统

    1.1 minIO是什么? MinIO是专门为海量数据存储、人工智能、大数据分析而设计的对象存储系统。(早前流行的还有FastDFS) 据官方介绍,单个对象最大可存储5T,非常适合存储海量图片、视频、日志文件、备份数据和容器、虚拟镜像等。 采用golang语言编译 客户端和用户端交互采

    2024年02月07日
    浏览(40)
  • minio分布式文件存储

    基本介绍 什么是  MinIO         MinIO 是一款基于 Go 语言的高性能、可扩展、云原生支持、操作简单、开源的分布式对象存储产品。基于 Apache License v2.0 开源协议,虽然轻量,却拥有着不错的性能。它兼容亚马逊S3云存储服务接口。可以很简单的和其他应用结合使用,例如

    2024年02月08日
    浏览(46)
  • 分布式文件存储MinIO-监控

    MinIO自身提供了关于集群状态和操作的相关的Prometheus SQL指标与支持Prometheus数据模型的监控指标收集工具进行搭配使用,无论是主机部署亦或是云上部署都可以进行集成。官方选定的第三方监控软件为Prometheus和InfluxDB,使用者可以根据各自公司对于监控设施的建设进行选择。

    2024年02月11日
    浏览(51)
  • docker 笔记5:redis 集群分布式存储案例

    尚硅谷Docker实战教程(docker教程天花板)_哔哩哔哩_bilibili 目录 1.cluster(集群)模式-docker版哈希槽分区进行亿级数据存储  1.1面试题 1.1.1  方案1 哈希取余分区 1.1.2 方案2 一致性哈希算法分区  原理 优点 一致性哈希算法的容错性  一致性哈希算法的扩展性  缺点  一致性哈希算

    2024年02月09日
    浏览(42)
  • Springboot整合minio组件-分布式文件存储

    一、快速开始 Minlo说明: Minio是Apcche旗下的一款开源的轻量级文件服务器,基于对象存储,协议是基于Apache License v2.0,开源可用于商务。 Minio主要用来存储非结构化的数据,类似文件,图片,照片,日志文件,各类备份文件等,按照官网描述,文件的大小从几KB到5TB。 Minio提

    2024年02月11日
    浏览(50)
  • OSS文件上传、MinIO分布式文件存储系统

    阿里云OSS上传图片 实现步骤: 1. 定义OSS相关配置 application-dev.yml application.yml 2. 读取OSS配置 在sky-common模块中,已定义 3. 生成OSS工具类对象 在sky-server模块 其中,AliOssUtil.java已在sky-common模块中定义 4. 定义文件上传接口 在sky-server模块中定义接口 MinIO分布式文件存储系统 MinI

    2024年01月24日
    浏览(44)
  • 【分布式文件存储】MinIO部署及实现文件上传下载

    目录 概述 MinIO集群部署 准备docker-compose.yml 测试启动 MinIO用户管理 Buckets管理  创建Buckets MinIO客户端 引入依赖   文件上传下载Demo 调用API碰到的问题 MinIO | 高性能, Kubernetes 原生对象存储 MinIO是全球领先的对象存储先锋,目前在全世界有数百万的用户。 高性能 ,在标准硬件

    2024年02月07日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包