扩展分布式 MinIO 部署
MinIO 支持通过添加新的服务器池来扩展现有的分布式部署。每个池都扩展了集群的总可用存储容量。
扩展不提供业务连续性/灾难恢复 (BC/DR) 级别的保护。虽然每个池都是一组独立的服务器,具有用于可用性的不同擦除集,但一个池的完全丢失会导致 MinIO 停止部署中所有池的 I/O。类似地,在一个池中失去仲裁的擦除集表示存储在该集中的对象的丢失,而不管其他擦除集或池的数量是多少。
新服务器池**不需要**使用与任何现有服务器池相同的硬件和软件配置类型或大小,尽管这样做可能会简化集群管理并在池之间提供更可预测的性能。新池中的所有驱动器**应该**是同一类型和大小。查看 MinIO 的硬件建议,以获取有关选择适当配置的更完整指南。
要为您的单池或多池 MinIO 部署提供 BC-DR 级的故障转移和恢复支持,请使用站点复制。
此页面上的过程使用其他服务器池扩展现有的分布式 MinIO 部署。
先决条件
网络和防火墙
每个节点都应该具有到部署中所有其他节点的完全双向网络访问权限。对于容器化或编排的基础设施,这可能需要特定配置网络和路由组件,例如入口或负载均衡器。某些操作系统可能还需要设置防火墙规则。例如,以下命令在使用firewalld
的服务器上显式打开默认的 MinIO 服务器 API 端口9000
firewall-cmd --permanent --zone=public --add-port=9000/tcp
firewall-cmd --reload
部署中的所有 MinIO 服务器都**必须**使用相同的监听端口。
如果您设置了静态MinIO 控制台端口(例如:9001
),则您**也**必须授予对该端口的访问权限,以确保外部客户端的连接。
MinIO**强烈建议**使用负载均衡器来管理与集群的连接。负载均衡器应该使用“最少连接”算法将请求路由到 MinIO 部署,因为部署中的任何 MinIO 节点都可以接收、路由或处理客户端请求。
以下负载均衡器已知可以与 MinIO 良好配合使用
配置防火墙或负载均衡器以支持 MinIO 不在本过程的范围内。该为 MinIO 服务器配置 NGINX 代理参考提供了使用 NGINX 作为反向代理的基本配置,并配置了基本负载均衡。
顺序主机名
MinIO 在创建服务器池时**需要**使用扩展表示法{x...y}
来表示 MinIO 主机的顺序序列。因此,MinIO**需要**使用顺序编号的主机名来表示池中的每个minio server
进程。
在开始此过程之前创建必要的 DNS 主机名映射。例如,以下主机名将支持一个 4 节点的分布式服务器池
minio5.example.com
minio6.example.com
minio7.example.com
minio8.example.com
您可以使用扩展表示法 minio{5...8}.example.com
指定主机名的整个范围。
配置 DNS 以支持 MinIO 不在本过程范围内。
存储要求
以下要求总结了 MinIO 硬件建议中有关存储的部分
- 使用本地存储
直连存储 (DAS) 比网络存储(NAS、SAN、NFS)具有显著的性能和一致性优势。MinIO 强烈建议使用闪存存储(NVMe、SSD)存储主要数据或“热”数据。
- 使用 XFS 格式化驱动器
MinIO 强烈建议为存储预配 XFS 格式化的驱动器。MinIO 在其内部测试和验证套件中使用 XFS,从而在所有规模下都对性能和行为提供了额外的信心。
MinIO **不**测试也不推荐任何其他文件系统,例如 EXT4、BTRFS 或 ZFS。
- 使用一致的驱动器类型
MinIO 不区分驱动器类型,也不受益于混合存储类型。每个池必须使用相同的类型(NVMe、SSD)
例如,部署一个仅由 NVMe 驱动器组成的池。如果您将某些驱动器部署为 SSD 或 HDD,MinIO 会将这些驱动器与 NVMe 驱动器视为相同。这可能会导致性能问题,因为某些驱动器具有不同的或更差的读/写特性,并且无法以与 NVMe 驱动器相同的速率响应。
- 使用一致的驱动器大小
MinIO 将每个驱动器使用的容量限制为部署中最小的驱动器。
例如,部署一个由相同数量的 NVMe 驱动器组成的池,这些驱动器具有相同的
7.68TiB
容量。如果您部署一个3.84TiB
的驱动器,MinIO 会将池中所有驱动器的容量视为该较小的容量。- 配置顺序驱动器挂载
MinIO 使用 Go 扩展表示法
{x...y}
在创建新的服务器池时表示驱动器的顺序序列,其中服务器池中的所有节点都有一组相同的已挂载驱动器。将驱动器挂载路径配置为顺序序列以最好地支持此表示法。例如,使用/mnt/drive-n
模式挂载驱动器,其中n
从1
开始,每个驱动器递增1
。- 在重新引导时保持驱动器挂载和映射
使用
/etc/fstab
确保在节点重新引导时驱动器到挂载点的映射保持一致。非 Linux 操作系统应使用等效的驱动器挂载管理工具。
对驱动器的独占访问
MinIO **需要**对用于对象存储的驱动器或卷具有独占访问权限。任何其他进程、软件、脚本或人员都不应对提供给 MinIO 的驱动器或卷或 MinIO 在其上放置的对象或文件执行任何操作。
除非 MinIO 工程师指示,否则请勿使用脚本或工具直接修改、删除或移动提供的驱动器上的任何数据分片、奇偶校验分片或元数据文件,包括从一个驱动器或节点移动到另一个驱动器或节点。此类操作很可能导致广泛的损坏和数据丢失,超出 MinIO 的修复能力。
擦除码奇偶校验的最小驱动器数
MinIO 要求每个池满足部署的擦除码设置。具体来说,新池拓扑必须支持每个擦除集至少 2 x EC:N
个驱动器,其中 EC:N
是部署的标准奇偶校验存储类。此要求确保新服务器池能够满足部署的预期SLA。
您可以使用MinIO 擦除码计算器检查新池的擦除码条带大小 (K+M)。如果列出的最高值为至少 2 x EC:N
,则该池支持部署的擦除奇偶校验设置。
时间同步
多节点系统必须保持同步的时间和日期,以维持稳定的节点间操作和交互。确保所有节点定期同步到同一个时间服务器。操作系统的同步时间和日期的方法各不相同,例如使用 ntp
、timedatectl
或 timesyncd
。
查看您的操作系统文档,了解如何在节点之间设置和维护准确且相同系统时钟时间。
首先备份集群设置
使用mc admin cluster bucket export
和mc admin cluster iam export
命令分别在开始停用之前获取存储桶元数据和 IAM 配置的快照。您可以使用这些快照来恢复存储桶和IAM设置,以根据需要从用户或进程错误中恢复。
注意事项
写入文件
MinIO 不会自动在新的服务器池之间重新平衡对象。相反,MinIO 会对具有最多可用存储空间的池执行新的写入操作,并根据池上的可用空间量除以所有可用池上的可用空间量进行加权。
确定特定池上写入操作概率的公式为
\(FreeSpaceOnPoolA / FreeSpaceOnAllPools\)
考虑这样一种情况:一组三个池总共有 10 TiB 的可用空间,分布如下
池 A 有 3 TiB 的可用空间
池 B 有 2 TiB 的可用空间
池 C 有 5 TiB 的可用空间
MinIO 计算对每个池执行写入操作的概率如下
池 A:30% 的概率 (\(3TiB / 10TiB\))
池 B:20% 的概率 (\(2TiB / 10TiB\))
池 C:50% 的概率 (\(5TiB / 10TiB\))
除了可用空间计算外,如果写入选项(带奇偶校验)会导致驱动器使用率超过 99% 或已知的可用 inode 计数低于 1000,则 MinIO 不会写入该池。
如果需要,您可以使用mc admin rebalance
手动启动重新平衡过程。有关重新平衡工作原理的更多信息,请参阅跨部署管理对象。
同样,MinIO 也不会写入正在停用的池。
扩展是非破坏性的
添加新的服务器池需要在部署中同时重新启动所有 MinIO 服务器进程。
MinIO 强烈建议同时重新启动部署中的所有 MinIO 服务器进程。MinIO 操作是原子的并且严格一致的。因此,重启过程不会对应用程序和正在进行的操作造成干扰。
**不要**执行“滚动”(例如一次一个节点)重启。
基于容量的规划
MinIO 建议规划足够的存储容量以存储**至少** 2 年的数据,然后再达到 70% 的使用率。更频繁地或以“及时”的方式执行服务器池扩展通常表明存在架构或规划问题。
例如,考虑一个预计每年产生至少 100 TiB 数据的应用程序套件,以及在扩展之前 3 年的目标。部署在初始服务器池中具有约 500 TiB 的可用存储空间,以便集群在一定数据增长缓冲区的情况下安全地满足 70% 的阈值。新服务器池应**理想地**满足至少 500 TiB 的额外存储空间,以便在进一步扩展之前具有类似的使用寿命。
由于 MinIO 的擦除编码需要一些存储空间用于奇偶校验,因此总的**原始**存储空间必须超过计划的**可用**容量。考虑使用 MinIO 擦除码计算器来指导围绕特定擦除码设置的容量规划。
推荐的操作系统
本教程假设所有运行 MinIO 的主机都使用推荐的 Linux 操作系统。
部署中的所有主机都应运行匹配的软件配置。
扩展分布式 MinIO 部署
以下过程将服务器池添加到现有的 MinIO 部署中。每个池都扩展集群的总可用存储容量,同时保持集群的整体可用性。
下面提供的所有命令都使用示例值。请将这些值替换为您部署中适当的值。
在开始此过程之前,请查看先决条件。
在开始停用旧硬件池之前,请完成任何计划中的硬件扩展。
1) 在新服务器池中的每个节点上安装 MinIO 二进制文件
以下选项卡提供了在 64 位 Linux 操作系统上使用 RPM、DEB 或二进制文件安装 MinIO 的示例。RPM 和 DEB 软件包会自动将 MinIO 安装到必要的系统路径,并为 systemctl
创建一个 minio
服务。MinIO 强烈建议使用 RPM 或 DEB 安装方式。要更新使用 systemctl
管理的部署,请参阅更新 systemctl 管理的 MinIO 部署。
amd64(Intel 或 AMD 64 位处理器)
使用以下选项之一下载在 Intel 或 AMD 64 位处理器上运行 Linux 的机器的 MinIO 服务器安装文件。
使用以下命令下载最新的稳定版 MinIO RPM 并安装它。
wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20241029160148.0.0-1.x86_64.rpm -O minio.rpm
sudo dnf install minio.rpm
使用以下命令下载最新的稳定版 MinIO DEB 并安装它。
wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio_20241029160148.0.0_amd64.deb -O minio.deb
sudo dpkg -i minio.deb
使用以下命令下载最新的稳定版 MinIO 二进制文件并将其安装到系统 $PATH
中。
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
sudo mv minio /usr/local/bin/
arm64(Apple M1/M2 或其他 ARM 64 位处理器)
使用以下选项之一下载在 ARM 64 位处理器(例如 Apple M1 或 M2)上运行 Linux 的机器的 MinIO 服务器安装文件。
使用以下命令下载最新的稳定版 MinIO RPM 并安装它。
wget https://dl.min.io/server/minio/release/linux-arm64/archive/minio-20241029160148.0.0-1.aarch64.rpm -O minio.rpm
sudo dnf install minio.rpm
使用以下命令下载最新的稳定版 MinIO DEB 并安装它。
wget https://dl.min.io/server/minio/release/linux-arm64/archive/minio_20241029160148.0.0_arm64.deb -O minio.deb
sudo dpkg -i minio.deb
使用以下命令下载最新的稳定版 MinIO 二进制文件并将其安装到系统 $PATH
中。
wget https://dl.min.io/server/minio/release/linux-arm64/minio
chmod +x minio
MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=password ./minio server /mnt/data --console-address ":9001"
其他架构
2) 添加 TLS/SSL 证书
在检测到 MinIO ${HOME}/.minio/certs
目录中存在有效的 x.509 证书(.crt
)和私钥(.key
)时,MinIO 会自动启用传输层安全 (TLS) 1.2+。
对于 systemd
管理的部署,请使用运行 MinIO 服务器进程的用户的主目录。提供的 minio.service
文件以 minio-user
身份运行进程。上一步包含了创建此用户及其主目录 /home/minio-user
的说明。
将 TLS 证书放置到每个主机上的
/home/minio-user/.minio/certs
中。如果任何 MinIO 服务器或客户端使用由未知证书颁发机构(自签名或内部 CA)签名的证书,则必须将 CA 证书放置到部署中所有 MinIO 主机上的
/home/minio-user/.minio/certs/CAs
中。MinIO 会拒绝无效的证书(不受信任、已过期或格式错误)。
如果 minio.service
文件指定了不同的用户帐户,请使用该帐户的主目录。或者,使用 minio server --certs-dir
命令行参数指定自定义证书目录。修改 /etc/default/minio
中的 MINIO_OPTS
变量以设置此选项。运行 MinIO 服务器进程的 systemd
用户必须对指定的目录具有读取和列出权限。
有关将 MinIO 配置为 TLS 的更具体指南(包括通过服务器名称指示 (SNI) 进行多域名支持),请参阅网络加密 (TLS)。您可以选择跳过此步骤以在未启用 TLS 的情况下进行部署。MinIO 强烈建议不要在早期开发之外进行非 TLS 部署。
3) 创建 systemd
服务文件
.deb
或 .rpm
软件包会将以下 systemd 服务文件安装到 /usr/lib/systemd/system/minio.service
。对于二进制安装,请在所有 MinIO 主机上手动创建此文件。
注意
systemd
会在检查 /usr/lib/systemd/...
路径之前检查 /etc/systemd/...
路径,并使用它找到的第一个文件。为避免出现冲突或意外的配置选项,请检查该文件是否仅存在于 /usr/lib/systemd/system/minio.service
路径下。
有关文件路径搜索顺序的详细信息,请参阅systemd.unit 的手册页。
[Unit]
Description=MinIO
Documentation=http://min-io.cn/docs/minio/linux/index.html
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio
[Service]
WorkingDirectory=/usr/local
User=minio-user
Group=minio-user
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
# MinIO RELEASE.2023-05-04T21-44-30Z adds support for Type=notify (https://www.freedesktop.org/software/systemd/man/systemd.service.html#Type=)
# This may improve systemctl setups where other services use `After=minio.server`
# Uncomment the line to enable the functionality
# Type=notify
# Let systemd restart this service always
Restart=always
# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536
# 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})
minio.service
文件默认情况下以 minio-user
用户和组运行。您可以使用 groupadd
和 useradd
命令创建用户和组。以下示例创建了用户、组,并设置了访问 MinIO 旨在使用的文件夹路径的权限。这些命令通常需要 root(sudo
)权限。
groupadd -r minio-user
useradd -M -r -g minio-user minio-user
chown minio-user:minio-user /mnt/disk1 /mnt/disk2 /mnt/disk3 /mnt/disk4
指定的驱动器路径仅作为示例提供。请将其更改为与 MinIO 旨在使用的驱动器路径相匹配。
或者,将 User
和 Group
值更改为系统主机上的另一个用户和组,该用户和组具有必要的访问权限和权限。
MinIO 在github.com/minio/minio-service上发布了其他启动脚本示例。
要更新使用 systemctl
管理的部署,请参阅更新 systemctl 管理的 MinIO 部署。
4) 创建服务环境文件
在 /etc/default/minio
中创建一个环境文件。MinIO 服务使用此文件作为 MinIO和 minio.service
文件使用的所有环境变量的来源。
以下示例假设
部署包含一个由四个 MinIO 服务器主机组成的服务器池,这些主机具有顺序主机名。
minio1.example.com minio3.example.com minio2.example.com minio4.example.com
每个主机都有 4 个本地连接的驱动器,并具有顺序挂载点。
/mnt/disk1/minio /mnt/disk3/minio /mnt/disk2/minio /mnt/disk4/minio
新服务器池由八个新的 MinIO 主机组成,这些主机具有顺序主机名。
minio5.example.com minio9.example.com minio6.example.com minio10.example.com minio7.example.com minio11.example.com minio8.example.com minio12.example.com
所有主机都有八个本地连接的驱动器,并具有顺序挂载点。
/mnt/disk1/minio /mnt/disk5/minio /mnt/disk2/minio /mnt/disk6/minio /mnt/disk3/minio /mnt/disk7/minio /mnt/disk4/minio /mnt/disk8/minio
部署有一个在
https://minio.example.net
上运行的负载均衡器,用于管理跨所有 MinIO 主机的连接。负载均衡器在此步骤中不应将请求路由到新主机,但应已计划好必要的配置更新。
修改示例以反映您的部署拓扑。
# Set the hosts and volumes MinIO uses at startup
# The command uses MinIO expansion notation {x...y} to denote a
# sequential series.
#
# The following example starts the MinIO server with two server pools.
#
# The space delimiter indicates a seperate server pool
#
# The second set of hostnames and volumes is the newly added pool.
# The pool has sufficient stripe size to meet the existing erasure code
# parity of the deployment (2 x EC:4)
#
# The command includes the port on which the MinIO servers listen for each
# server pool.
MINIO_VOLUMES="https://minio{1...4}.example.net:9000/mnt/disk{1...4}/minio https://minio{5...12}.example.net:9000/mnt/disk{1...8}/minio"
# Set all MinIO server options
#
# The following explicitly sets the MinIO Console listen address to
# port 9001 on all network interfaces. The default behavior is dynamic
# port selection.
MINIO_OPTS="--console-address :9001"
# Set the root username. This user has unrestricted permissions to
# perform S3 and administrative API operations on any resource in the
# deployment.
#
# Defer to your organizations requirements for superadmin user name.
MINIO_ROOT_USER=minioadmin
# Set the root password
#
# Use a long, random, unique string that meets your organizations
# requirements for passwords.
MINIO_ROOT_PASSWORD=minio-secret-key-CHANGE-ME
您可以根据部署需要指定其他环境变量或服务器命令行选项。部署中的所有 MinIO 节点都应包含具有匹配值的相同环境变量。
5) 使用扩展配置重新启动 MinIO 部署
在部署中的每个节点上同时发出以下命令以重新启动 MinIO 服务。
sudo systemctl restart minio.service
使用以下命令确认服务在线且正常运行。
sudo systemctl status minio.service
journalctl -f -u minio.service
在服务器进程连接和同步时,MinIO 可能会记录数量增加的非关键警告。这些警告通常是短暂的,并且随着部署上线而解决。
MinIO 强烈建议同时重新启动部署中的所有 MinIO 服务器进程。MinIO 操作是原子的并且严格一致的。因此,重启过程不会对应用程序和正在进行的操作造成干扰。
**不要**执行“滚动”(例如一次一个节点)重启。
6) 下一步
更新任何负载均衡器、反向代理或其他网络控制平面,以将客户端请求路由到 MinIO 分布式部署中的新主机。虽然 MinIO 会自动在内部管理路由,但让控制平面处理初始连接管理可以减少网络跳数并提高效率。
查看MinIO 控制台以确认更新后的集群拓扑并监控性能。