minio

一、竞品调研

在这里插入图片描述

当前的一些开源方案,这些存储方案里面可以分为两种:

  • 一种是可以自定对象名称的;
  • 另外一种是系统自动生成对象名称。


我们的对象名是自己生成的,里面包含了业务逻辑。

1、像 FS 就是国内大佬开源的一个分支存储,但是因为不能自定义文件名所以不合适。
2、还有像领英的 Ambry、MogileFS 其实都不能自定对象名的,所以是不合适的。
3、LeoFS 对我们来说不是很可控,所以不合适。
4、TFS 是淘宝开源的,但是目前已经很少有人维护它并且也不是很活跃,所以当时就没有考虑。
5、ceph 是一个比较强大的分布式存储,但是它整个系统非常复杂需要大量的人力进行维护,对我们的产品不是很符合,所以暂时不考虑。

因为原项目文件使用阿里云OSS上传,现需求要部署到客户本地不可以使用外网,所以要替换文件存储方案MinIO文档地址
MinIO 是在 GNU Affero 通用公共许可证 v3.0 下发布的高性能对象存储。它是与 Amazon S3 云存储服务兼容的 API。使用 MinIO 为机器学习、分析和应用程序数据工作负载构建高性能基础架构。,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等

MinIO可单点部署,可分布式集群部署,操作部署方便,可支持扩容,SDK和阿里OSS用起来差不多,刚好满足我的需求,唯一缺陷就是不支持动态扩容.

minio是开源对象存储产品,具有简单、稳定、高性能特性。本文将minio的基本配置的一些方法。minio有单点运行、纠删码、分布式纠删码三种方式。单点运行配置简单,只需启动minio服务并指定相关数据目录即可。在生产环境中常用的纠删码和分布式纠删码两种,纠删码类型是minio在单节点服务器配置多个数据盘作为数据存放目录的配置方式。分布式纠删码是minio跨节点配置方式,所有节点的盘位组建纠删码,保证业务数据访问的高可用。

1、MinIO的架构

minio_第1张图片

左边是 MINIO 集群的示意图,整个集群是由多个角色完全相同的节点所组成的。因为没有特殊的节点,所以任何节点宕机都不会影响整个集群节点之间的通信。
通过 rest 跟 RPC 去通信的,主要是实现分布式的锁跟文件的一些操作。

右边这张图是单个节点的示意图,每个节点都单独对外提供兼容 S3 的服务。
 

2 概念

  • Drive:可以理解为一块磁盘
  • Set:一组Drive的集合
    • 一个对象存储在一个Set上
    • 一个集群划分为多个Set
    • 一个Set包含的Drive数量是固定的
      • 默认由系统根据集群规模自动计算得出
      • MINIO_ERASURE_SET_DRIVE_COUNT
    • 一个SET中的Drive尽可能分布在不同的节点上

在这里插入图片描述

(1)上图中,每一行是一个机器节点,这里有32个集群,每个节点里有一个小方块,我们称之为Drive,Drive可简单地理解为磁盘。一个节点有32个Drive,相当于32个磁盘。
(2)Set是另外的概念,Set是一组Drive的集合,所有红色标识的Drive组成了一个Set。

(3)一个对象最终是存储在一个Set里面的。

3、MinIO核心流程

3.1、数据编码

Erasure Code:冗余编码

  • 将一个对象编码成若干个数据块校验块
  • Reed-Solomon算法
  • 低冗余、高可靠

MinIO的编码方式,我们简称为Erasure Code码,是通过算法还原数据的方法。MinIO使用Reed-Solomon算法,该算法把对象编码成若干个数据块和校验块。
为了表述方便,把数据库和校验块统称为编码块,之后我们可以通过编码块的一部分就能还原出整个对象。

在这里插入图片描述

如上图,如我们所知,一个对象存储在一个Set上面,这个Set包含16个Drive,其中灰色的一半是数据库,橙色的一半是校验块,这种方式最多能忍受一半的编码丢失或损坏。所有编码块的大小是原对象的2倍,跟传统多副本存储方案相比,他只冗余存了一份,但可靠性更高。

接下来讲Bit Rot Protection,直译就是腐烂。它只物理设备上的一些文件细微的损坏,还没有被操作系统所硬件所察觉,但是他已经损坏了。
Bit Rot Protection:

  • HighwayHash

MinIO把之前的编码块进行 HighwayHash 编码,最后要校验这个编码,以确保每个编码是正确的。

基于 Erasure Code 和 Bit Rot Protection 这两个特性,所以MinIO的数据可靠性做的高。

另外,MinIO提供了一个管理工具,可以对所有编码块进行校验,如果发现编码块有问题,再去修复它。
 

3.2、存储形式

minio_第2张图片

上图直观地展示了每个节点上的数据存放形式。所有对象的编码块和meta信息,最终是以目录和文件的形式,存储在文件系统上的。

比如My Bucket就是在所有节点的顶级目录创建了对应的目录叫My Bucket。然后当我们上传一个对象的时候,就会在这个对象所对应的Set上面创建一个目录叫My Object,之后把所有编码块的数据跟meta信息都保存在此目录下面,这就是MinIO的真实存储数据的方式。

meta数据是json文件,编码块是part.1文件。黑色的右图是meta信息示例图,里面除了包含正常的meta信息外,还包括了怎样做ec编码,以便之后可以解码出来。

3.3 存储机制

Minio 使用纠删码 erasure code和校验和 checksum。 即便丢失一半数量(N/2)的硬盘,仍然可以恢复数据。

校验和

保护数据免受硬件故障和无声数据损坏

纠删码

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

Minio采用Reed-Solomon code将对象拆分成N/2数据和N/2 奇偶校验块。 这就意味着如果是12块盘,一个对象会被分成6个数据块、6个奇偶校验块,可以丢失任意6块盘(不管其是存放的数据块还是奇偶校验块),仍可以从剩下的盘中的数据进行恢复。

RS code编码数据恢复原理

RS编码以word为编码和解码单位,大的数据块拆分到字长为w(取值一般为8或者16位)的word,然后对word进行编解码。 数据块的编码原理与word编码原理相同,后文中以word为例说明,变量Di, Ci将代表一个word。
把输入数据视为向量D=(D1,D2,..., Dn), 编码后数据视为向量(D1, D2,..., Dn, C1, C2,.., Cm),RS编码可视为如下(图1)所示矩阵运算。
图1最左边是编码矩阵(或称为生成矩阵、分布矩阵,Distribution Matrix),编码矩阵需要满足任意n*n子矩阵可逆。为方便数据存储,编码矩阵上部是单位阵(n行n列),下部是m行n列矩阵。下部矩阵可以选择范德蒙德矩阵或柯西矩阵。

minio_第3张图片

RS最多能容忍m个数据块被删除。 数据恢复的过程如下:
(1)假设D1、D4、C2丢失,从编码矩阵中删掉丢失的数据块/编码块对应的行。(图2、3)
(2)由于B' 是可逆的,记B'的逆矩阵为 (B'^-1),则B' * (B'^-1) = I 单位矩阵。两边左乘B' 逆矩阵。 (图4、5)
(3)得到如下原始数据D的计算公式 。

minio_第4张图片

 (4)对D重新编码,可得到丢失的编码

3.4、上传和下载流程

1、上传流程:
1)先根据对象名去做一个Hash,计算出对应的Set,然后来创建临时目录。创建临时目录的目的是为了确保数据强一致性,所以中间数据都会被写入到这个临时目录里(直到所有数据写完后,再统一把目录写入到最终的路径上)
2)接下来读数据编码,每次最多读10M的数据处理,然后做编码,再被写入到磁盘上,循环的过程就是把数据保存下来。
3)数据保存完后,再写meta信息。
4)然后挪到最终的位置上,删除临时目录。

2、读取流程:
1)先根据对象名做Hash,找到对象对应的Set
2)然后去读取meta信息,通过meta信息来获得编码的方式,然后去解码。它是以10M数据做EC编码,读的时候也是逐个part解析,每个part给他做解码,然后写入到一个io write里面。
备注:我们刚刚说了,做EC码时,只要一半的编码块就能还原整个对象,所以读meta时读了N份,但是读数据时只要读N/2就可以了。

四、部署和扩容

1、如何部署

#启动一个12个节点的MinIO集群,每个节点有12个Drive
minio server http://10.3.1.{1...12}/data/{1...12}

MinIO的部署默认不需要配置文件,几秒钟就可以把集群搭建起来,把简洁做到了极致。

2、MinIO压测

可采用 cosBench 工具做压测,cosBench是专门对对象存储做压测的工具。

在12个节点,每个节点12个盘,混合读写64KB。
结果是:
1、读请求:4千QPS,响应的平均延迟是35毫秒;
2、写请求:900 QPS时,平均响应时间是45毫秒。

五、MinIO的局限

局限1、搭建集群后,不允许扩容

MinIO一旦集群搭建成功后,就不可以更改集群节点数。因为存在在MinIO的对象到底存储在哪个

局限2、大集群最大节点数为32

MinIO实现了一个峰值锁叫DSync。它在节点数量少时,性能非常高;但节点数量过多时,性能就下降了。功能实现的最大节点就是32,所以导致MinIO单个集群的最大节点数也是32。

官方回复是,他们十年做GlusterFS的经验看,一个超大的集群是难以维护的,尤其是宕机之后的恢复时间也特别长,所以他们在做MinIO的时候一个核心设计理念就是简单,易于维护。

扩容方案


1、可同时向多个集群写入
2、当集群容量达到阈值,从写集群中剔除,变成只读
3、读取的时候,根据编码到文件名上的集群信息,从而路由到正确的集群。

MinIO本身提供一个叫联合模式的方式来组建集群,但是要额外引入其他依赖。可以考虑在LB层根据其请求里面的一些header信息做流量转发。

当配置多个集群的时候,可以先从配置中获取可用的集群,再从LB上根据请求的header信息,可控制向哪个集群写。当某个集群的容量达到阈值时,可以从配置中剔除该集群,把他变成只读集群。读取的时候把集群ID或信息码编码到文件名上去,这样可以通过解析文件名就能获取到对应的集群。
 

六、关于IO

IO有Buffered IO 和 Direct IO:

  • buffered IO:在读写的时候回经过一个page Cache
  • Direct IO:是绕过page Cache,直接对磁盘操作,所以性能会差些。

再回顾下MinIO的写入流程:MinIO数据最终的形式是写入文件系统的文件,也就是随机写的。随机写的性能肯定不如顺序写。
其次,EC编码在低冗余情况下是高可靠的,但同时也让他写入数量变多了,基本上一个对象写入需要做2N次操作,其实N次是数据的操作,N是meta的操作。基于上述原理,可总结出下述优化方案:
优化方案1、小文件合并成大文件

小文件合并成大文件,只需要把底层文件的部分稍微改一下,把原来随机写的小文件改成顺序写的大文件,这样就可以利用page cache来提供磁盘的能力。

具体实现:预先打开一个文件,分配一个固定的空间,目的是保证文件在磁盘上真是存储的数据是连续的。当写文件的时候,就给加锁,保证数据写入,因为这些原因,小文件的索引需要保存下来,所以我们引入了一个levelDB像大文件的ID和size的一些东西,之所以采用level DB是因为他的性能非常好。

接下来看MinIO的读流程:它主要发生在IO的地方有两个:一个是meta信息,然后再读data的时候,至少从N/2个节点上读取。每一次读取meta或者data的时候包括两部分:第一个从levelDB中读取索引,从大文件中读取对应的数据。

然后我们针对这个做了一个优化方案,我们把meta信息,因为meta信息没多少,我们把他压缩到level DB里,直接读就行了,不用读索引了。

再回顾下MinIO的读流程:
1、从N个节点上读取meta信息
2、至少从N/2个几点上读取data
3、每一次读取的时间包括两部分:
- 从level DB读取索引
- 从大文件中读取对应的数据
4、并发读的最终时间取决于最长的一个
 

优化方案总结

1、将meta信息压缩后,直接存入level DB,减少一组IO
2、将level DB存在性能更高的SSD
3、降低单个Set的Drive数量

Minio 是个基于 Golang 编写的开源对象存储套件,基于Apache License v3.0开源协议,虽然轻量,却拥有着不错的性能。它兼容亚马逊S3云存储服务接口。可以很简单的和其他应用结合使用,例如 NodeJS、Redis、MySQL等。

MinIO 的应用场景

场景1:如下图,MinIO 的应用场景除了可以作为私有云的对象存储服务来使用,也可以作为云对象存储的网关层,无缝对接 Amazon S3 或者 MicroSoft Azure 。

minio_第5张图片

场景2:单主机单硬盘模式

minio_第6张图片

场景3:单主机多硬盘模式

minio_第7张图片

 场景4:多主机多硬盘分布式

minio_第8张图片

特点

  • 高性能:作为高性能对象存储,在标准硬件条件下它能达到55GB/s的读、35GG/s的写速率,并而 MinIO 支持一个对象文件可以是任意大小,从几kb到最大5T不
  • 可扩容:不同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支持
    • 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不容易出错、更快启动
  • 支持纠删码:MinIO使用纠删码、Checksum来防止硬件错误和静默数据污染。在最高冗余度配置下,即使丢失1/2的磁盘也能恢复数据

参考

minio原理和使用 - 简书

MinIO学习笔记_胜天半子-CSDN博客_minio

单节点部署

MinIO | Code and downloads to create high performance object storage

1.docker 方式

[root@localhost s3]# docker run -p 9001:9001  -d harbor.jettech.com/jettechtools/k3s/minio:latest server ./data --console-address ":9001"

MinIO 部署开始使用默认的根凭据minioadmin:minioadmin。您可以使用 MinIO 控制台测试部署,这是一个
内置于 MinIO 服务器的嵌入式对象浏览器。将主机上运行的 Web 浏览器指向http://127.0.0.1:9000并使用

您还可以使用任何与 S3 兼容的工具进行连接,例如 MinIO 客户端mc命令行工具。有关
使用mcmc命令行工具的更多信息,请参阅使用 MinIO 客户端进行测试。对于应用程序开发,
见MinIO | The MinIO Quickstart Guide并单击MinIO的SDK中导航,查看MinIO的SDK支持的语言。

注意:要在持久存储上部署 MinIO,您必须使用该podman -v选项将本地持久目录从主机操作系统映射到容器。例如,-v /mnt/data:/data将主机操作系统驱动器映射/mnt/data/data容器上。

2.二进制或rpm包方式

rpm:
[root@localhost data]# wget https://dl.min.io/server/minio/release/linux-amd64/minio-20211229064906.0.0.x86_64.rpm
或
二进制
[root@localhost s3]# wget https://dl.minio.io/server/minio/release/linux-amd64/minio

2.1 配置,编辑 /etc/default/minio 配置文件,按照实际目录配置 MINIO_VOLUMES、 MINIO_ACCESS_KEY 、 MINIO_SECRET_KEY 等参数,如果自定义minio占用端口号,需要配置 MINIO_OPTS 参数,但一般使用默认端口号9000,所以无需配置该参数。但要确保 MINIO_VOLUMES 有读写权限。https://github.com/minio/minio-service/tree/master/linux-systemd

MINIO_VOLUMES 目录有读写权限
[root@localhost s3]# cat /etc/default/minio 
MINIO_VOLUMES="/root/wubo/s3/data"
MINIO_ACCESS_KEY=admin
MINIO_SECRET_KEY=123456aA
MINIO_OPTS="--address :9000  --console-address :9001   --listeners 1"



[root@localhost s3]# cat <> /etc/default/minio
# Volume to be used for MinIO server.
MINIO_VOLUMES="/tmp/minio/"
# Use if you want to run MinIO on a custom port.
MINIO_OPTS="--address :9199 --console-address :9001"
# Root user for the server.
MINIO_ROOT_USER=Root-User
# Root secret for the server.
MINIO_ROOT_PASSWORD=Root-Password
EOT

本地NAS运行minio,注解:此种方式适合在数据存储目录为NAS目录时的配置方法。

gluster v set fareyes disperse.eager-lock off
export MINIO_ACCESS_KEY=minio
export MINIO_SECRET_KEY=minio123
minio gateway nas /shared/nasvol

2.2 在 /etc/systemd/system 目录下,配置 minio.service 服务。rpm自动就已经有了不用下载

cd /etc/systemd/system/; curl -O https://raw.githubusercontent.com/minio/minio-service/master/linux-systemd/minio.service

编辑 /etc/systemd/system/minio.service 文件,可采用默认 User=root 、Group=root参数,也可根据实际情况配置此参数。

[root@localhost s3]# cat /etc/systemd/system/minio.service 
[Unit]
Description=MinIO
Documentation=https://docs.min.io
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio

[Service]
WorkingDirectory=/usr/local

User=root
Group=root
ProtectProc=invisible

EnvironmentFile=-/etc/default/minio
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES

# Let systemd restart this service always
Restart=always

# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=1048576

# Specifies the maximum number of threads this process can create
TasksMax=infinity

# Disable timeout logic and wait until process is stopped
TimeoutStopSec=infinity
SendSIGKILL=no

[Install]
WantedBy=multi-user.target

# Built for ${project.name}-${project.version} (${project.name})

2.3 启动服务


systemctl enable minio.service --now

参考官方链接:
https://github.com/minio/minio-service/tree/master/linux-systemd

minio_第9张图片

服务器数据目录结构

[root@localhost s3]# find data/bucket*
data/bucket1
data/bucket1/b1
data/bucket1/b1/b1.txt
data/bucket2
data/bucket2/b2
data/bucket2/b2/b2.tx

在服务器上面创建

mkdir data/bucket3/b3 -p
echo b3b3b3b3 >data/bucket3/b3/b3.txt

 此时 也有了。

我可以理解为是个文件服务器,实时能反映出系统目录下面的情况,类似NFS,ftp,nginx等文件服务器,这些知识不能在线操作而已。不知道我理解的对不对minio_第10张图片

客户端【mc】

MinIO Client (mc) — MinIO Baremetal Documentation

MinIO | MinIO Client Quickstart Guide

MinIO Client (mc) — MinIO Baremetal Documentation

1)下载赋权限

[root@localhost s3]# wget https://dl.min.io/client/mc/release/linux-amd64/mc
[root@localhost s3]# chmod +x mc 
[root@localhost s3]# mv /usr/local/bin/

MinIO Client (mc) — MinIO Baremetal Documentation2)Add a Cloud Storage Service

To add one or more Amazon S3 compatible hosts, please follow the instructions below. mc stores all its configuration information in ~/.mc/config.json file.

重要的

以下示例临时禁用 bash 历史记录以降低身份验证凭据以纯文本形式泄露的风险。这是一项基本的安全措施,并不能减轻所有可能的攻击媒介。在命令行上输入敏感信息时,请遵循操作系统的安全最佳实践。

bash +o history
mc alias set     --api  --path 
bash -o history

Example 

: 可以是用户名 或 Service Accounts 创建账户
:可以是密码或 Service Accounts 创建秘钥

minio_第11张图片

[root@localhost s3]# mc config host add jettechminio http://172.16.10.5:9000 3NY2SNH36G6JLU84IOBH AgTeNj6D9rxJQGbh2MSYbfKzSfmJkzrvmlLqzyb3 --api s3v4



mc 别名使用
mc alias set ALIAS URL ACCESSKEY SECRETKEY
[root@localhost s3]# mc alias set jettechminio http://172.16.10.5:9000 admin 123456aA --api s3v4
Added `jettechminio` successfully.

[root@localhost s3]# mc alias set jettechminio http://172.16.10.5:9000 3NY2SNH36G6JLU84IOBH AgTeNj6D9rxJQGbh2MSYbfKzSfmJkzrvmlLqzyb3 --api s3v4
Added `jettechminio` successfully.

测试连接 

[root@localhost s3]# mc admin info jettechminio
●  172.16.10.5:9000
   Uptime: 2 hours 
   Version: 2021-12-29T06:49:06Z
   Network: 1/1 OK 

30 B Used, 6 Buckets, 4 Objects

列出数据列表

[root@localhost s3]# mc ls jettechminio/
[2021-12-31 14:57:07 CST]     0B bucket1/
[2021-12-31 15:00:47 CST]     0B bucket2/
[2021-12-31 15:13:30 CST]     0B bucket3/
[2021-12-31 16:57:24 CST]     0B bucket4/
[2021-12-31 16:59:21 CST]     0B bucket5/
[root@localhost s3]# mc ls jettechminio/bucket1/b1
[2021-12-31 14:59:41 CST]     5B b1.txt

创建bucket

[root@localhost s3]# mc mb data/bucket6/b6
Bucket created successfully `data/bucket6/b6`.
[root@localhost s3]# ls
b4.txt  data  mc  minio  minio-20211229064906.0.0.x86_64.rpm
[root@localhost s3]# ls data/
bucket1  bucket2  bucket3  bucket4  bucket5  bucket6

测试上传一个文件

[root@localhost s3]# mc cp b4.txt data/bucket4/b4
 0 B / ? ┃░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░b4.txt:                          8 B / 8 B ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 1.55 KiB/s 0s[root@localhost s3]# 
[root@localhost s3]# mc ls jettechminio/bucket4/b4
[2021-12-31 17:16:56 CST]     8B b4

Shell autocompletionMinIO | MinIO Client Quickstart Guide

In case you are using bash, zsh or fish. Shell completion is embedded by default in mc, to install auto-completion use mc --autocompletion. Restart the shell, mc will auto-complete commands as shown below.

 [root@localhost s3]# mc --autocompletion.
[root@localhost s3]#  mc 
admin    config   diff     find     ls       mirror   policy   session  sql      update   watch
cat      cp       event    head     mb       pipe     rm       share    stat     version

数据保护

分布式 MinIO使用纠删码提供针对多个节点/驱动器故障和位腐烂的保护。由于分布式 MinIO 所需的最小磁盘为 4(与擦除编码所需的最小磁盘相同),因此在您启动分布式 MinIO 时,擦除代码会自动启动。

高可用性

如果托管磁盘的服务器脱机,独立的 MinIO 服务器就会停机。相比之下,只要m/2 个服务器或m*n /2 个或更多磁盘在线,具有m 个服务器和n 个磁盘的分布式 MinIO 设置将使您的数据安全。

例如,每个节点有 200 个磁盘的 16 台服务器分布式设置将继续提供文件服务,默认配置下最多 4 个服务器可以离线,即大约 800 个磁盘关闭 MinIO 将继续读取和写入对象。

请参考默认值的更多理解尺寸指南选择取决于你删除的条带大小在这里。可以使用存储类更改奇偶校验设置

一致性保证

对于分布式和独立模式下的所有 I/O 操作,遵循严格MinIO 的先读后写写后列表一致性模型。仅当您使用磁盘文件系统(例如 xfs、ext4 或 zfs 等)进行分布式设置时,才能保证此一致性模型。

如果 MinIO 分布式设置在下面使用 NFS 卷,则不能保证 MinIO 将提供这些一致性保证,因为 NFS 是设计上不一致的文件系统(如果您必须使用 NFS,我们建议您至少使用 NFSv4 而不是 NFSv3)。

如果您了解独立的 MinIO 设置,则该过程基本保持不变。MinIO 服务器根据命令行参数自动切换到单机或分布式模式。

单节点多磁盘方式:

MinIO | Learn more about Deploying MinIO in Distributed Mode

纠删码类型是minio在单节点服务器配置多个数据盘作为数据存放目录的配置方式,我这里采用4个目录方式,相当于4个磁盘,官方介绍:分布式Minio至少需要4个硬盘,使用分布式Minio自动引入了纠删码功能

分布式模式下的 MinIO 使您可以将多个驱动器(甚至在不同的机器上)集中到一个对象存储服务器中。由于驱动器分布在多个节点上,分布式 MinIO 可以承受多个节点故障,同时确保完整的数据保护

分布式模式下的 MinIO 可以帮助您通过单对象存储部署来设置高可用存储系统。借助分布式 MinIO,您可以最佳地使用存储设备,而不管它们在网络中的位置。

[root@localhost s3]# ls
data1  data2  data3  data4

配置文件

MINIO_VOLUMES="/root/wubo/s3/data1 /root/wubo/s3/data2 /root/wubo/s3/data3 /root/wubo/s3/data4"
MINIO_ACCESS_KEY=admin
MINIO_SECRET_KEY=123456aA
MINIO_OPTS="--address :9000  --console-address :9001   --listeners 1"

 启动服务

[root@localhost s3]# systemctl status minio
● minio.service - MinIO
   Loaded: loaded (/etc/systemd/system/minio.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2022-01-04 10:38:17 CST; 4s ago
     Docs: https://docs.min.io
  Process: 27969 ExecStartPre=/bin/bash -c if [ -z "${MINIO_VOLUMES}" ]; then echo "Variable MINIO_VOLUMES not set in /etc/default/minio"; exit 1; fi (code=exited, status=0/SUCCESS)
 Main PID: 27971 (minio)
    Tasks: 11
   Memory: 90.1M
   CGroup: /system.slice/minio.service
           └─27971 /usr/local/bin/minio server --address :9000 --console-address :9001 --listeners 1 /root/wubo/s3/data1 /root/wubo/s3/data2 /root/wubo/s3/data3 /root/wubo/s3/d...

Jan 04 10:38:18 localhost minio[27971]: WARNING: MINIO_ACCESS_KEY and MINIO_SECRET_KEY are deprecated.
Jan 04 10:38:18 localhost minio[27971]: Please use MINIO_ROOT_USER and MINIO_ROOT_PASSWORD
Jan 04 10:38:19 localhost minio[27971]: Automatically configured API requests per node based on available memory on the system: 103
Jan 04 10:38:19 localhost minio[27971]: Status:         4 Online, 0 Offline.
Jan 04 10:38:19 localhost minio[27971]: API: http://172.16.10.5:9000  http://10.42.0.1:9000  http://172.17.0.1:9000  http://10.42.0.0:9000  http://127.0.0.1:9000
Jan 04 10:38:19 localhost minio[27971]: Console: http://172.16.10.5:9001 http://10.42.0.1:9001 http://172.17.0.1:9001 http://10.42.0.0:9001 http://127.0.0.1:9001
Jan 04 10:38:19 localhost minio[27971]: Documentation: https://docs.min.io
Jan 04 10:38:19 localhost minio[27971]: You are running an older version of MinIO released 5 days ago
Jan 04 10:38:19 localhost minio[27971]: Update:
Jan 04 10:38:19 localhost minio[27971]: Run `mc admin update`
[root@localhost s3]# ls
data1  data2  data3  data4

多节点多磁盘模式

高可用

分布式纠删码是minio跨节点配置方式,所有节点的盘位组建纠删码,保证业务数据访问的高可用。

要启动分布式 MinIO 实例,您只需将驱动器位置作为参数传递给 minio 服务器命令。然后,您需要在所有参与节点上运行相同的命令。

笔记:

  • 所有运行分布式 MinIO 的节点应该共享一个公共根凭证,以便节点相互连接和信任。为了实现这一目标,它建议以root用户和root密码导出为环境变量,MINIO_ROOT_USERMINIO_ROOT_PASSWORD执行MinIO服务器命令之前,所有节点上。如果未导出,minioadmin/minioadmin则应使用默认凭据。
  • MinIO 创建每组416 个驱动器的纠删码组。您提供的驱动器总数必须是这些数字之一的倍数。
  • MinIO 选择最大的 EC 集大小,它分为给定的驱动器总数或节点总数 - 确保保持均匀分布,即每个节点参与每组相同数量的驱动器
  • 每个对象都写入单个 EC 集,因此分布在不超过 16 个驱动器上。
  • 建议所有运行分布式 MinIO 设置的节点是同构的,即相同的操作系统、相同的磁盘数量和相同的网络互连。
  • MinIO 分布式模式需要新目录。如果需要,驱动器可以与其他应用程序共享。您可以使用 MinIO 独有的子目录来完成此操作。例如,如果您已将卷安装在 下/export/export/data则将其作为参数传递给 MinIO 服务器。
  • 下面的 IP 地址和驱动器路径仅用于演示目的,您需要将它们替换为实际的 IP 地址和驱动器路径/文件夹。
  • 运行分布式 MinIO 实例的服务器之间的间隔应小于 15 分钟。您可以启用NTP服务作为最佳实践,以确保跨服务器的时间相同。
  • MINIO_DOMAIN 应定义和导出环境变量以支持存储桶 DNS 样式。
  • Windows操作系统上运行分布式 MinIO被认为是实验性的。请谨慎行事。

实施例1:启动分布式MinIO例如在n个节点,其中m驱动每个安装在/export1/exportm(如图下文),通过所有n个节点上运行此命令:

export MINIO_ROOT_USER=
export MINIO_ROOT_PASSWORD=
minio server http://host{1...n}/export{1...m}

注意:在上面的例子中nm代表正整数,不要复制粘贴,期望它工作根据本地部署和设置进行更改

注意: {1...n}显示有 3 个点!仅使用 2 个{1..n}点将被您的 shell 解释并且不会传递到 MinIO 服务器,从而影响擦除编码顺序,从而影响性能和高可用性。始终使用省略号语法{1...n}(3 个点!)以获得最佳纠删码分布

我的配置172.16.10.5节点和172.16.10.15节点相同配置,我的ip不连续

前置条件:
1.要求至少4个磁盘
2.至少2个校验盘
3.节点可支持最小2节点至最大32节点
4.所有节点间时间一致,不超过3s,可配置ntp时间同步。此条件非常重要,对性能影响明显。
安装minio(所有节点执行命令)

[root@localhost s3]# cat /etc/default/minio 
#MINIO_VOLUMES="/root/wubo/s3/data1 /root/wubo/s3/data2 /root/wubo/s3/data3 /root/wubo/s3/data4"
MINIO_VOLUMES="http://172.16.10.5/root/wubo/s3/data{1...4} http://172.16.10.15/root/wubo/s3/data{1...4}"
MINIO_ACCESS_KEY=admin
MINIO_SECRET_KEY=123456aA
MINIO_OPTS="--address :9000  --console-address :9001   --listeners 1"

MINIO_VOLUMES="http://172.16.10.5/root/wubo/s3/data{1...4} http://172.16.10.15/root/wubo/s3/data{1...4}"  命令表示:集群两节点ip地址为172.16.10.5和172.16.10.15,磁盘目录为两个节点的/root/wubo/s3/data{1,2,3,4}和/root/wubo/s3/data{1,2,3,4}四个目录。其中/root/wubo/s3可以为磁盘的挂载目录。

多硬盘多节点部署不可扩容的方式,下面是官方示例

分部署部署最少需要四个示例,不管是四个服务器,每台部署一个实例。还是一个服务器部署四个实例。
存储的文件会以n/2个节点内存分配到每个实例上,比如创建8个实例,上传的文件大小80MB,那么每个实例存在20MB

示例1: 启动分布式Minio实例,8个节点,每节点1块盘,需要在8个节点上都运行下面的命令。

export MINIO_ACCESS_KEY=admin
export MINIO_SECRET_KEY=123456
minio server http://172.16.10.5/export1 http://172.16.10.6/export2 \
               http://172.16.10.7/export3 http://172.16.10.8/export4 \
               http://172.16.10.9/export5 http://172.16.10.10/export6 \
               http://172.16.10.11/export7 http://172.16.10.12/export8

示例2: 启动分布式Minio实例,4节点,每节点4块盘,需要在4个节点上都运行下面的命令。

export MINIO_ACCESS_KEY=admin
export MINIO_SECRET_KEY=123456
minio server http://172.16.10.5/export1 http://172.16.10.5/export2 \
               http://172.16.10.5/export3 http://172.16.10.5/export4 \
               http://172.16.10.6/export1 http://172.16.10.6/export2 \
               http://172.16.10.6/export3 http://172.16.10.6/export4 \
               http://172.16.10.7/export1 http://172.16.10.7/export2 \
               http://172.16.10.7/export3 http://172.16.10.7/export4 \
               http://172.16.10.8/export1 http://172.16.10.8/export2 \
               http://172.16.10.8/export3 http://172.16.10.8/export4

可扩容的方式,使用MinIO纠删码,如果想要扩容,必须使用这种方式

扩展现有的分布式设置

MinIO 支持通过在命令行上指定新的集群集来扩展分布式纠删码集群,如下所示:

扩容方式,在原命令最后一行末尾添加扩容的节点,重启集群

首次部署

export MINIO_ROOT_USER=
export MINIO_ROOT_PASSWORD=
minio server http://host{1...n}/export{1...m}

例子

export MINIO_ACCESS_KEY=
export MINIO_SECRET_KEY=
minio server http://host{1...32}/export{1...32}

 扩容方式,在原命令最后一行末尾添加扩容的节点,重启集群

export MINIO_ROOT_USER=
export MINIO_ROOT_PASSWORD=
minio server http://host{1...n}/export{1...m} http://host{o...z}/export{1...m}

列子 

export MINIO_ACCESS_KEY=
export MINIO_SECRET_KEY=
minio server http://host{1...32}/export{1...32} http://host{33...64}/export{1...32}

现在整个集群就扩展了1024个磁盘,总磁盘变为2048个,新的对象上传请求会自动分配到最少使用的集群上。通过以上扩展策略,您就可以按需扩展您的集群。重新配置后重启集群,会立即在集群中生效,并对现有集群无影响。如上命令中,我们可以把原来的集群看做一个区,新增集群看做另一个区,新对象按每个区域中的可用空间比例放置在区域中。在每个区域内,基于确定性哈希算法确定位置。

说明: 您添加的每个区域必须具有与原始区域相同的磁盘数量(纠删码集)大小,以便维持相同的数据冗余SLA。
例如,第一个区有8个磁盘,您可以将集群扩展为16个、32个或1024个磁盘的区域,您只需确保部署的SLA是原始区域的倍数即可
 

现在服务器已将总存储扩展了(newly_ added_servers*m)个磁盘,使总数达到(existing_servers*m)+(newly_ added_servers*m) 个磁盘。新的对象上传请求会使用最少使用的集群自动启动。这种扩展策略无休止地工作,因此您可以根据需要永久扩展集群。当您重新启动时,它会立即且不会中断应用程序。命令行中的每组服务器称为一个池。本示例中有 2 个服务器池。新对象按照每个池中的可用空间量按比例放置在服务器池中。在每个池中,驱动器擦除集的位置是根据确定性散列算法确定的。

注意: 您添加的每个池都必须与原始池具有相同的纠删码奇偶校验配置,以便保持相同的数据冗余 SLA。

MinIO部署,以及扩容_Be a Laity!!的博客-CSDN博客_minio扩容

MinIO | Learn more about Deploying MinIO in Distributed Mode

minio对象存储_weixin_34363171的博客-CSDN博客

Deploy MinIO in Distributed Mode — MinIO Baremetal Documentation

测试 172.16.10.5 创建buckets 上传文件 

minio_第12张图片

 此时在172.16.10.15服务器也是可以看见的

minio_第13张图片

 minio_第14张图片

 minio_第15张图片

你可能感兴趣的:(p2p,wpf,tv)