扩展一个分布式MinIO部署
重要
为了保证您的数据安全,更安全的MinIO服务器集群扩展,请联系MinIO中国:4008-566-339。
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而配置防火墙或负载均衡器不 在此过程的范围内。 Nginx服务器反向代理MinIO配置 参考提供了一份基本配置,可将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硬件建议的 Storage 部分:
- 使用本地存储
直接连接存储(DAS)在性能和一致性方面比网络存储( 网络附加存储(NAS)、 存储区域网络(SAN)、 网络文件存储(NFS))有显著优势。 MinIO 强烈建议使用闪存存储(NVMe,SSD)作为主要或 “热” 数据。
- 使用 XFS 格式化驱动器。
MinIO 强烈建议为存储提供 XFS 格式化的驱动器。 MinIO 在内部测试和验证套件中使用 XFS,以提供对性能和行为在所有规模上的额外信心。
MinIO 并 不 测试也不推荐其他文件系统,如 EXT4、BTRFS 或 ZFS。
- 使用一致类型的驱动器
MinIO 不区分驱动器类型,并且不从混合存储类型中受益。 每个 :term:`pool`(池)必须使用相同类型(NVMe,SSD)的驱动器。
例如,部署一个仅由 NVMe 驱动器组成的池。 如果您将一些驱动器作为 SSD 或 HDD 部署,MinIO 会将与 NVMe 驱动器相同的方式来处理这些驱动器。 这可能会导致性能问题,因为一些驱动器具有不同的或更差的读/写特性,并且不能像 NVMe 驱动器那样以相同的速率响应。
- 使用一致大小的驱动器
MinIO 将每个硬盘使用的大小限制为池中最小的硬盘。
例如,部署一个由容量相同的
7.68TiB
NVMe驱动器组成的数据池。 如果您部署了一个容量为3.84TiB
的驱动器,MinIO会将池中的所有驱动器都视为具有那个较小的容量。- 配置顺序挂载驱动器
MinIO 使用 Go 扩展表示法
{x...y}
来表示在创建新 server pool 时驱动器的顺序系列,其中 server pool 中的所有节点都具有相同的一组挂载驱动器。 将驱动器挂载路径配置为顺序系列,以最佳支持这种表示法。 例如,使用模式/mnt/drive-n
挂载您的驱动器,其中n
从1
开始,每增加一个驱动器就递增1
。- 在重新启动后保持驱动器挂载和映射不变
使用
/etc/fstab
确保在节点重新启动后驱动器到挂载点的映射一致。在重新启动后,非Linux操作系统应使用等效的驱动器挂载管理工具以保持驱动器到挂载点的映射一致。
Exclusive access to drives
MinIO 要求 专有 对提供给对象存储的驱动器或卷的访问。 其他任何进程、软件、脚本或人员都不得直接对提供给MinIO的驱动器或卷执行 任何 操作,也不得对MinIO放置在其上的对象或文件执行操作。
除非由MinIO工程部门指导,否则不要使用脚本或工具直接修改、删除或移动提供给MinIO的驱动器上的任何数据片段、校验片段或元数据文件,包括从一个驱动器或节点移动到另一个驱动器或节点。 这些操作很可能会导致广泛的数据损坏和丢失,超出了MinIO的修复能力。
纠删码校验最小磁盘数
MinIO 要求每个存储池都满足部署的 纠删码 设置。
具体来说,新存储池拓扑必须支持每个 纠删码集合 有至少 2 x EC:N
个驱动器,
其中 EC:N
是部署 的:ref:标准 <minio-ec-storage-class> 纠删码存储级别。
这要求确保新服务器池能够达到预期的 SLA 。
您可以使用 MinIO纠删码计算器
来检查新存储池的 纠删码条带大小 (K+M) 。
如果列出的最高值至少为 2 x EC:N
,则该池支持部署的纠删码校验设置。
时间同步
多节点系统必须保持同步的时间和日期,以维持稳定的节点间操作和交互。
确保所有节点定期同步到同一时间服务器。
操作系统之间用于同步时间和日期的方法可能会有所不同,例如使用 ntp
、 timedatectl
或 timesyncd
。
请查阅您操作系统的文档,了解如何在节点之间设置和维护准确且相同的主机时钟时间。
首先备份群集设置
在开始退役过程之前,使用 mc admin cluster bucket export
命令来备份存储桶元数据,以及使用 mc admin cluster iam export
命令来备份身份和访问管理(IAM)配置。
您可以使用这些快照来恢复存储桶( bucket )和身份和访问管理( IAM )设置,以应对用户或进程错误。
考虑因素
写入文件
MinIO 不会自动重新平衡新服务器池中的对象。 相反,MinIO 将新写入操作定向到剩余储存空间最多的存储池, 按照该池的剩余空间占所有可用存储池总剩余空间的比例加权计算。
确定将在特定存储池上执行写操作的概率的公式是:
\(FreeSpaceOnPoolA / FreeSpaceOnAllPools\)
考虑这样一种情况,即一组三个池总共有 10 TiB 的可用空间,分布如下:
存储池 A 有 3 TiB 的剩余空间
存储池 B 有 2 TiB 的剩余空间
存储池 C 有 5 TiB 的剩余空间
MinIO 计算出各存储池被选中的写入概率为:
存储池 A:30% 的概率 (:math: 3TiB / 10TiB )
存储池 B:20% 的概率 (:math: 2TiB / 10TiB )
存储池 C:50% 的概率 (:math: 5TiB / 10TiB )
除了进行剩余储存空间计算之外,如果一个写入选项(带校验)会导致某个驱动器使用量超过 99%,或已知的可用 inode 数量低于 100,MinIO 将不会写入该存储池。
如果需要,您可以手动启动平衡过程,方法是使用 mc admin rebalance
命令。
有关重新平衡的详细信息,请参阅 管理部署中的对象 。
同样地,正在停用的存储池也不会接收到写入操作。
同构节点配置
MinIO 强烈建议在新服务器池中为所有节点选择基本相似的硬件配置。 确保硬件(CPU、内存、主板、存储适配器)和软件(操作系统、内核设置、系统服务)在池中的所有节点上保持一致。
如果节点具有异构的硬件或软件配置,则新的服务器池可能呈现出不可预测的性能。 那些受益于在成本较低的硬件上存储旧数据的工作负载应该部署一个专用的 “warm” 或 “cold” MinIO 部署,并将数据 转移 到该层级。
新的服务器池在硬件和软件配置上 不需要 与任何现有的服务器池基本相似, 尽管这样可以简化集群管理并提高跨存储池的性能的可预测性。
想要了解有关为 MinIO 部署选择硬件的更多指南,请查看和阅读 生产环境硬件建议: 。
扩展是非中断的
添加新服务器池需要同时重新启动 部署中 所有 的MinIO服务器进程。
MinIO强烈建议同时重启部署中的所有MinIO服务器进程。 MinIO操作是原子性的且严格一致的。 因此,重启过程对应用程序和正在进行操作没有干扰。
不要 执行 “滚动” (例如逐个节点)重启。
基于容量的规划
MinIO 建议在达到 70% 使用率之前,规划足够的存储容量以存储 至少 2 年的数据。
经常执行 服务器池扩展 或采用 即时
方式进行扩展,通常意味着存在架构或规划上的问题。
例如,考虑一个预计每年至少产生100 TiB数据的应用程序套件,并且目标是在3年后进行扩展。 部署在初始服务器池中有大约500TiB的可用存储空间,这样集群可以在数据增长留有一定缓冲的情况下安全地达到70%的阈值。 新服务器池 理想情况下 应至少提供额外的500TiB存储空间,以允许在进一步扩展之前有类似的使用寿命。
由于MinIO的 擦除编码 需要一些存储空间用于奇偶校验,因此总的 原始 存储必须超过计划中的 可用 容量。 请使用MinIO的 Erasure Code Calculator 来指导规划,以特定 erasure code 设置为基础。
推荐的操作系统
本教程假设所有运行 MinIO 的主机都使用的是 建议的 Linux 操作系统 。
部署中的所有主机应运行匹配的 软件配置 。
扩展一个分布式MinIO部署
以下过程将在现有的 MinIO 部署中添加一个 服务器池 。 每个池扩展了集群的总可用存储容量,同时保持了集群的整体 availability 。
下面提供的所有命令都使用示例值。请使用适合您的部署的值替换这些值。
在开始此过程之前,请查看 先决条件 。
在 停用旧的硬件池 之前,请完成任何计划的硬件扩展。
1) 在新的服务器池中的各个节点上安装 MinIO 二进制包
下面的内容提供了在64位Linux操作系统上使用RPM、DEB或二进制文件安装MinIO的示例。
RPM和DEB软件包会自动将MinIO安装到必要的系统路径,并创建一个适用于 systemctl
的 minio
服务。
MinIO强烈建议使用RPM或DEB安装方式。
要更新使用的部署,其管理方式是: systemctl
, 详细内容请查看 minio-upgrade-systemctl.
amd64 (Intel or AMD 64位处理程序)
使用以下选项之一下载适用于运行 Linux 操作系统的 Intel 或 AMD 64 位处理器的 MinIO 服务器安装文件。
使用以下命令下载最新版本的稳定 MinIO RPM 并安装:
wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20250422221226.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_20250422221226.0.0_amd64.deb -O minio.deb
sudo dpkg -i minio.deb
使用以下命令下载安装最新版本的稳定 MinIO二进制包, 并设置
$PATH
:
wget https://dl.minio.org.cn/server/minio/release/linux-amd64/minio
chmod +x minio
sudo mv minio /usr/local/bin/
arm64 (ARM 64-bit processors)
使用以下选项之一为在 ARM 64 位处理器上运行 Linux 的机器下载 MinIO 服务器安装文件。
使用以下命令下载最新版本的稳定 MinIO RPM 并安装:
wget https://dl.min.io/server/minio/release/linux-arm64/archive/minio-20250422221226.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_20250422221226.0.0_arm64.deb -O minio.deb
sudo dpkg -i minio.deb
使用以下命令下载最新版本的稳定 MinIO 二进制文件, 并将其安装到系统
$PATH
中:
wget https://dl.minio.org.cn/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 启用 安全传输层 (TLS) 1.2+
检测到有效的 x.509 证书(.crt
)后自动进行
私钥(.key
)位于 MinIO ${HOME}/.minio/certs
目录中。
对于 systemd
管理的部署,请使用 $HOME
目录
运行 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
文件指定了不同的用户帐户,请使用
该帐户的 $HOME
目录。 或者,指定自定义
使用 minio server --certs-dir
的证书目录
命令行参数。 修改 MINIO_OPTS
环境变量
/etc/default/minio
设置此选项。 运行的 systemd
用户
MinIO 服务器进程 必须 具有指定的读取和
列出权限目录。
有关为 TLS 配置 MinIO 的更具体指南,包括多域 通过服务器名称指示 (SNI) 支持,请参考和阅读 网络加密(TLS) 。 你可以 您可以选择跳过此步骤以在不启用 TLS 的情况下进行部署。 MinIO强烈 建议*反对*早期开发之外的非 TLS 部署。
3) 创建 systemd
系统启动服务文件
.deb
or.rpm
安装包将安装 systemd 文件至/usr/lib/systemd/system/minio.service
。
对于二进制安装,请在所有 MinIO 主机上手动创建此文件。
备注
systemd
命令启动前,系统内部会检查/etc/systemd/...
这个路径,是否存在启动系统文件,如果冲突请在/usr/lib/systemd/...
路径,找到对应文件,避免重复创建后的冲突。
并且,为了避免冲突或意外的配置选项,请确保该文件仅存在于 /usr/lib/systemd/system/minio.service
。
请参考 systemd.unit 手册和说明 了解有关文件路径搜索顺序的详细信息。
[Unit]
Description=MinIO
Documentation=https://minio.org.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预定用于存储的文件夹路径。
这些命令通常需要管理员 ( 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
, 请访问 minio-upgrade-systemctl 查看。
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
所有主机都有 8 个本地附加的驱动器,带有连续的挂载点:
/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控制台 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服务:
sudo systemctl restart minio.service
使用以下命令确认服务是否在线和功能正常:
sudo systemctl status minio.service
journalctl -f -u minio.service
在服务器处理连接和同步时,MinIO 可能会记录大量非关键性警告。 这些警告通常是短暂的, 在部署上线后应该会解决。
MinIO强烈建议同时重启部署中的所有MinIO服务器进程。 MinIO操作是原子性的且严格一致的。 因此,重启过程对应用程序和正在进行操作没有干扰。
不要 执行 “滚动” (例如逐个节点)重启。
6) 下一步
更新任何负载均衡器、反向代理或其他网络控制平面,以路由客户端请求到 MinIO 分布式部署中的新主机。 虽然 MinIO 可以自动管理内部路由,但使用控制平面处理初始连接管理可以减少网络跳数并提高效率。
查看 MinIO控制台 以确认更新后的集群拓扑和监视性能。