Minio Cluster 详解
Minio Cluster 详解
Minio
Minio
- 官方详细文档
https://docs.min.io/docs
Minio 介绍
MinIO 是根据GNU Affero 通用公共许可证 v3.0 发布的高性能对象存储。它与 Amazon S3云存储服务兼容。
Minio Erasure Code
Minio 使用 Erasure Code 提供数据的冗余.
Erasure Code
是一种恢复丢失和损坏数据的数学算法, Minio 采用Reed-Solomon Code
将对象拆分成 N/2 数据 和 N/2 奇偶校验块。这就意味着如果是12块盘, 一个对象会被分成6个数据块、6个奇偶校验块, 你可以丢失任意6块盘(不管其是存放的数据块还是奇偶校验块), 你仍可以从剩下的盘中的数据进行恢复.
默认情况下, MinIO 在 N / 2 个数据 和 N / 2 个奇偶校验驱动器上分片对象。我们建议使用 N / 2 数据和 奇偶校验块,因为它可以确保对驱动器故障提供最佳保护。
MinIO对每个对象分别进行编码,因此可以逐步修复对象。部署后的存储服务器在服务器的整个生命周期内都不需要更换驱动器或进行修复。MinIO的擦除编码后端旨在提高运营效率,并在可用时充分利用硬件加速的优势。
Erasure Code 数据图
DataDrives :
纠删码中的数据盘,用来存储 Object 原始数据。ParityDrives:
纠删码中的冗余盘,用来存储 Object 计算出来的冗余数据。Minio 纠删码的默认配置为
1 : 1
, 即数据盘 ( DataDrives )和 冗余盘 ( ParityDrives ) 个数相同, 所以我们真正可用的存储空间,只有我们总空间的一半大小。
因为一个
ErasureCode 组/ Sets
中有多个 Drive(DataDrives + ParityDrives), 所以 Minio 会先将一块 Block 按照 Drives 数量, 划分为多个小块, 这些小块在 Minio 中叫做 Shards。比如一个 Block 是 10MB, 而 Set 里有 16 个 Drive(8 DataDrives + 8 ParityDrives), 此时 Minio 会将 Block 按照 10 MB / 8 DataDrives 的方式,将数据划分到 8 个 Data Shards,并额外再创建 8 个 空 Shards,用来存储编码后的冗余数据。接着 Minio 就会对 Data Shards 进行纠删码编码, 并将编码后的冗余数据存储到前面创建的 8 个空 Shards 中, 也就是 parity shards 中。
数据保护
分布式 MinIO 使用 Erasure Code
提供针对 多个节点/驱动器 故障 和 Bit Rot
保护。
由于分布式 MinIO 所需的 最小磁盘为 4(与擦除编码所需的最小磁盘相同), 因此在您启动分布式 MinIO 时,擦除代码会自动启动。
因此 只要
m / 2
个服务器 或m * n / 2
个或更多磁盘在线, 具有 m个服务器 和 n个磁盘 的分布式 MinIO 设置将使您的数据安全。 ( M 表示 服务器总数, N 表示 数据库盘 总数 )Erasure Code
是用来保证 Object 的每个 Block 的数据正确和可恢复的, 而Bitrot
技术是用来检验磁盘数据的正确性的。Erasure Code
技术比较复杂, 但是Bitrot
技术就比较简单了。本质就是在写数据之前, 先计算好数据的 hash, 然后将 hash 先写入磁盘, 再写入需要存储的数据。这样读取数据时,就可以通过重新计算 hash,和原始写入的 hash进行一致性比较,来判断数据是否有损坏。上传文件时,Minio 不是直接上传到 object 在磁盘的最终存储目录的,而是先写到一个临时目录,等所有数据都写到临时目录后,Minio 才会进行 rename 操作,将 object 数据存储到最终存储目录。
Minimum System Configuration for Production
服务器节点 | 节点磁盘数 | Sets 纠删组磁盘数量 | 奇偶校验块数量 | 读取数据保障 | 写入数据保障 |
---|---|---|---|---|---|
4 | 2 | 8 | 4 | 2 | 1 |
5 | 2 | 10 | 4 | 2 | 2 |
6 | 2 | 12 | 4 | 2 | 2 |
7 | 2 | 14 | 4 | 2 | 2 |
8 | 2 | 16 | 4 | 2 | 2 |
9 | 2 | 9 | 4 | 4 | 4 |
10 | 2 | 10 | 4 | 4 | 4 |
一致性保证
对于分布式和独立模式下的所有 I/O 操作,MinIO 遵循严格的先读后写和写后列表一致性模型。仅当您使用磁盘文件系统(例如 xfs、ext4 或 zfs 等)进行分布式设置时,才能保证此一致性模型。
Minio 分布式集群配置
分布式集群节点计算器: https://min.io/product/erasure-code-calculator
所有运行分布式 MinIO 的节点都应该共享一个公共根凭证, 以便节点相互连接和信任。为此,建议在执行MinIO服务器命令之前,在所有节点上配置环境变量
MINIO_ROOT_USER
和MINIO_ROOT_PASSWORD
。如果未配置, 默认的帐号密码为:minioadmin/minioadmin
。MinIO 创建每组
4 ~ 16
个驱动器的纠删码组。您提供的驱动器总数必须是这些数字之一的倍数。- 纠删码组: Minio 会将 磁盘 ( 4 、6、8、10、12、14、16 ) 总个数 组成 纠删组 (EC 集 / Sets ) . 既 比如 36 个总磁盘 最大可组成 3 个 16 磁盘 的 EC 集 . ( Minio 默认会划分最大的总和纠删组 ) — 具体的 纠删组 可在 磁盘目录 .minio.sys/format.json 文件中查看.
MinIO 自动选择选择最大的 EC 集大小, 它分为给定的驱动器总数或节点总数 - 确保保持均匀分布, 即每个节点参与每组相同数量的驱动器。
每个对象都写入单个 EC 集, 因此分布在不超过 16 个驱动器上。
建议所有运行分布式 MinIO 设置的节点是相同的, 即相同的操作系统、相同的磁盘数量和相同的网络互连。
MinIO 分布式模式需要新目录。如果需要,驱动器可以与其他应用程序共享。您可以通过使用 MinIO 专有的子目录来完成此操作。例如,如果您在 下安装了您的卷/export,/export/data 则将其作为参数传递给 MinIO 服务器。
运行分布式 MinIO 实例的服务器之间的间隔应小于 15 分钟。您可以启用NTP服务作为最佳实践,以确保跨服务器的时间相同。
分布式集群节点数量限制
Minio 官方建议一个集群最少 4 个节点,最多 32 个节点, 实质上是没有最多节点限制,但官方建议 32 个节点集群的原因有以下:
32 个节点 是一个很好的平衡故障域和规模的代理,使用超过 32 个节点违背了运行容器化工作负载的基本前提:应将应用程序(及其相关联的存储)分解成尽可能小的部分 一个 32 个节点 的集群的最大存储容量为 200 PB,你可以在 32 节点集群存储大量的数据.
在单个集群上管理超过 200 PB 所带来的复杂性非常大,当你有一个非常大的故障域时,如果少量服务器宕机,则整个基础架构都将崩溃,在管理大量节点的情况下,故障发生只是时间问题,而非是否发生的问题.
比较少的节点配置会增加可管理性,以及分析故障发生的根本原因更加容易.
对于大量节点集群来说,备份和迁移数据的时间需要很多.
云原生架构的基本前提,无论是计算还是存储,都是以小的、离散的块消耗资源;扩容时,应该添加更多实例,并将其尽可能密集的打包在基础架构中,而不是无限的扩展一个实例
即使每个集群只有32个节点,也可以将这些群集联合在一起,使它们可以作为一个巨型集群运行(并扩展到无穷大),同时仍保持体系结构的可管理性.
Minio 存储类
Minio分为两种存储类
标准存储类
标准存储类, 通过环境变量 MINIO_STORAGE_CLASS_STANDARD="EC:5” 配置比率
"EC:5"
表示允许 标准存储类 5个磁盘 故障损坏 不丢失数据.
标准存储类是部署 Minio 的默认存储类存储类。 一旦设置,默认情况下所有 PutObject 请求将遵循标准存储类下设置的数据/奇偶校验配置。
默认情况下,标准存储类数据和奇偶校验驱动器设置为 N/2(并且不能设置高于此值)。 N 为 磁盘总数量。
您可以选择将对象元数据集设置为为相应对象
X-Amz-Storage-Class:STANDARD
启用 STANDARD 存储类。Minio 服务器不会在元数据字段中返回存储类,如果类设置为STANDARD. 这符合 AWS S3 PutObject 行为。
低冗余存储类
低冗余存储类, 通过环境变量 MINIO_STORAGE_CLASS_STANDARD="EC:2” 配置比率
"EC:2"
表示允许 冗余存储类 2个磁盘 故障损坏 不丢失数据.
低冗余存储类 可以应用于不太重要的对象,需要较少的复制。要应用此类,需要在
X-Amz-Storage-Class:REDUCED_REDUNDANCY
在 PutObject(或多部分)请求中设置对象元数据。这表明 MinIO 服务器存储相应的对象,其数据和奇偶校验由低冗余类定义。默认情况下,低冗余存储类奇偶校验驱动器设置为 2(并且不能设置为低于此值)。
您需要设置 X-Amz-Storage-Class:REDUCED_REDUNDANCY 对象元数据,以便服务器端低冗余来启动。
如果类设置为低冗余,MinIO 服务器将在元数据字段中返回存储类。
分布式 Minio 扩容
分布式 Minio 需要扩容需要满足
http://{...}/data{...}
的语法参数。
|
|
在扩容集群时用到了 2组
http://{...}
的语法参数,所以旧集群以及扩容都必须使用这种语法形式创建, 命令行中的每组 server 称为一个 zone, 此示例中有 2 server pools,对于外部的写数据请求,Minio Server 会首先查找可用空间多的 Zone,然后再在 Zone 内选择 set 和 disk drive 。- 注意: 添加的每个 Zone 必须具有与 原始 Zone 相同的
Set集大小
, 以便维持相同的数据冗余 SLA。 例如, 如果您的第一个 Zone 是8个磁盘, 则可以添加每个 Server pools 包含 16、32或1024 个磁盘的 Zone。您只需确保部署SLA是原始数据冗余SLA的倍数。
- 注意: 添加的每个 Zone 必须具有与 原始 Zone 相同的
Minio 安装部署
Minio 分为 物理机部署, docker 部署, Kubernetes Operator 部署.
以下为 物理机部署方式
初始化 Minio 节点
内核优化
|
|
host 配置
- 配置 host 连接 已便用于
http://host
的方式配置 server 所有 minio 节点均配置
|
|
创建 Minio 用户
|
|
创建 磁盘目录
|
|
配置挂载
|
|
安装配置 Minio
下载 Minio 二进制文件
|
|
创建 minio env 配置文件
|
|
使用 tls 加密 ( 可选 )
https://docs.min.io/docs/generate-let-s-encypt-certificate-using-concert-for-minio.html
minio 启用 tls 证书
- 需要修改
MINIO_VOLUMES
变量中 http 为 https - 服务端之间通讯需要 证书 互相 认证.
- 需要修改
证书目录
/home/minio/.minio/certs
- 目录用于存放当前服务端public.crt
与private.key
证书/home/minio/.minio/certs/CAs
- 目录用于存放 集群其他节点 的public.crt
认证证书, 多个节点 使用public1.crt
,public2.crt
,public3.crt
存放多个.
使用
let's encypt 生成的证书
|
|
- 购买的证书
|
|
创建 systemctl 文件
|
|
|
|
启动 Minio 服务
- Server 节点间启动的时间间隔不要超过 15 分钟
|
|
配置 minio mc 客户端
下载 mc 客户端
|
|
创建 mc 客户端配置文件 ( mc 会读取 ~/.mc/config.json 文件 )
|
|
安装配置 Minio Console 管理 WebUI
下载 Console 二进制文件
|
|
创建 minio-console env 文件
|
|
配置 tls 证书 ( 可选 )
console 启用 tls 证书
- 需要修改
CONSOLE_MINIO_SERVER
变量中 http 为 https - 需要使用 服务端的
public.crt
证书认证
- 需要修改
|
|
创建 systemctl 文件
|
|
|
|
启动 minio console 服务
|
|
创建 minio console 登录用户
|
|
|
|
|
|
|
|
配置 Prometheus
监控路径 path: /minio/v2/metrics/cluster
- 访问授权需要配置 Token 或者 配置
MINIO_PROMETHEUS_AUTH_TYPE="public"
prometheus targets 添加
|
|
Minio 压力测试
- 压力测试使用官方提供工具
https://github.com/minio/warp
Minio Server = 4 Data = 4 Parity = 4 EC 比率为 4:4
|
|
Uploading 2500 objects of Random data; 10485760 bytes total
- 集群测试
|
|
- 输出结果
|
|
Minio 节点 负载采集
top -d 5 -u minio -b
minio-1 - 取最后五次
|
|
- minio-2 - 取最后五次
|
|
- minio-3 - 取最后五次
|
|
minio-4 - 取最后五次
|
|
文件恢复测试
当前 minio 配置为 4 : 4 的冗余 所以删除 4 个磁盘中 的文件 ( 直接删除 data 磁盘中 的文件 )
- 修复 30GiB 的文件 大概 2分多钟的时间
|
|
mc 命令
官方 mc 操作命令
客户端常用命令:
http://docs.minio.org.cn/docs/master/minio-client-complete-guide
管理员操作命令:
http://docs.minio.org.cn/docs/master/minio-admin-complete-guide
配置 Minio 存储类
- 注意: 使用 环境变量
MINIO_STORAGE_CLASS_RRS
、MINIO_STORAGE_CLASS_STANDARD
设置的配比 在mc config get storage_class
显示为 默认值.
|
|
v1.4.14