部署 MinIO:多节点多驱动器
此页面上的步骤介绍了在多节点多驱动器 (MNMD) 或“分布式”配置中部署 MinIO。MNMD 部署提供企业级性能、可用性和可扩展性,是所有生产工作负载的推荐拓扑。
MNMD 部署支持擦除码 配置,这些配置可以容忍部署中最多一半节点或驱动器的丢失,同时继续提供读取操作服务。使用 MinIO 擦除码计算器 在规划和设计 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 支持使用一系列顺序的主机名或 IP 地址来表示部署中的每个minio server
进程。
此步骤假设使用顺序主机名,因为管理开销较低,尤其是在较大的分布式集群中。
在开始此步骤之前,创建必要的 DNS 主机名映射。例如,以下主机名将支持 4 节点分布式部署
minio-01.example.com
minio-02.example.com
minio-03.example.com
minio-04.example.com
您可以使用扩展符号 minio-0{1...4}.example.com
指定整个主机名范围。
非顺序主机名或 IP 地址
MinIO 不支持分布式部署的非顺序主机名或 IP 地址。您可以改为在每个节点上使用 /etc/hosts
设置支持扩展符号的简单 DNS 方案。例如
# /etc/hosts
198.0.2.10 minio-01.example.net
198.51.100.3 minio-02.example.net
198.0.2.43 minio-03.example.net
198.51.100.12 minio-04.example.net
以上主机配置支持 minio-0{1...4}.example.net
的扩展符号,将顺序主机名映射到所需 IP 地址。
存储要求
以下要求总结了 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 的修复能力。
内存需求
在版本 RELEASE.2024-01-28T22-35-53Z 中更改: MinIO 在启动时预先分配 2GiB 的系统内存。
MinIO 建议每个主机至少有 32GiB 的内存。有关 MinIO 中内存分配的更多指导,请参阅 内存。
时间同步
多节点系统必须保持同步的时间和日期,以维护稳定的节点间操作和交互。确保所有节点定期同步到同一时间服务器。操作系统的同步时间和日期的方法各不相同,例如使用 ntp
、timedatectl
或 timesyncd
。
检查您操作系统的文档,了解如何在节点之间设置和维护准确且相同系统时钟时间。
注意事项
擦除编码奇偶校验
MinIO 擦除编码 是一种数据冗余和可用性功能,它允许 MinIO 部署即使集群中丢失了多个驱动器或节点,也能自动实时重建对象。
MinIO 默认使用 EC:4
,或每个 擦除集 4 个奇偶校验块。您可以通过设置适当的 MinIO 存储类环境变量 来设置自定义奇偶校验级别。考虑使用 MinIO 擦除编码计算器 来指导您为集群选择适当的擦除编码奇偶校验级别。
重要
虽然您可以在任何时候更改擦除奇偶校验设置,但使用给定奇偶校验写入的对象不会自动更新为新的奇偶校验设置。
基于容量的规划
MinIO 建议规划足够的存储容量来存储至少 2 年的数据,然后达到 70% 的使用率。更频繁地执行 服务器池扩展 或在“即时”基础上执行通常表示架构或规划问题。
例如,考虑一个预计每年至少产生 100 TiB 数据的应用程序套件,以及扩展之前的 3 年目标。通过确保部署从一开始就拥有大约 500TiB 的可用存储空间,集群可以安全地满足 70% 的阈值,并为每年数据存储输出的增长提供额外的缓冲。
由于 MinIO 擦除编码 需要一些存储空间用于奇偶校验,因此总的原始存储空间必须超过计划的可用容量。考虑使用 MinIO 擦除编码计算器 来指导您围绕特定擦除编码设置规划容量。
推荐的操作系统
本教程假定所有运行 MinIO 的主机都使用 推荐的 Linux 操作系统,例如 RHEL8+ 或 Ubuntu 18.04+。
预先存在的数据
在分布式环境中启动新的 MinIO 服务器时,存储设备不能有现有的数据。
启动 MinIO 服务器后,所有与数据的交互都必须通过 S3 API 进行。使用 MinIO 客户端、MinIO 控制台 或 MinIO 软件开发工具包 之一来处理桶和对象。
警告
修改后端驱动器上的文件会导致数据损坏或数据丢失。
部署分布式 MinIO
以下过程创建一个新的分布式 MinIO 部署,该部署包含一个单个 服务器池。
以下提供的所有命令都使用示例值。将这些值替换为适合您的部署的值。
在开始此过程之前,请查看 先决条件。
1) 在每个节点上安装 MinIO 二进制文件
以下选项卡提供使用 RPM、DEB 或二进制文件将 MinIO 安装到 64 位 Linux 操作系统的示例。RPM 和 DEB 软件包会自动将 MinIO 安装到必要的系统路径,并为 systemctl
创建 minio
服务。MinIO 强烈建议使用 RPM 或 DEB 安装路线。要更新使用 systemctl
管理的部署,请参阅 更新 systemctl 管理的 MinIO 部署。
amd64(英特尔或 AMD 64 位处理器)
使用以下选项之一为在英特尔或 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) 创建 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 部署。
3) 创建服务环境文件
在 /etc/default/minio
处创建一个环境文件。MinIO 服务使用此文件作为 MinIO 和 minio.service
文件使用的所有 环境变量 的来源。
以下示例假设:
部署具有一个由四个具有顺序主机名的 MinIO 服务器主机组成的单一服务器池。
minio1.example.com minio3.example.com minio2.example.com minio4.example.com
所有主机都有四个本地连接的驱动器,具有顺序挂载点。
/mnt/disk1/minio /mnt/disk3/minio /mnt/disk2/minio /mnt/disk4/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 covers four MinIO hosts
# with 4 drives each at the specified hostname and drive locations.
# The command includes the port that each MinIO server listens on
# (default 9000)
MINIO_VOLUMES="https://minio{1...4}.example.net:9000/mnt/disk{1...4}/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 节点都应包含相同的环境变量,每个变量的值相同。
4) 添加 TLS/SSL 证书
MinIO 在检测到 MinIO ${HOME}/.minio/certs
目录中有效的 x.509 证书 (.crt
) 和私钥 (.key
) 时,会自动启用 传输层安全 (TLS) 1.2+。
对于 systemd
管理的部署,请使用运行 MinIO 服务器进程的用户使用的 $HOME
目录。提供的 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
命令行参数指定自定义证书目录。修改 /etc/default/minio
中的 MINIO_OPTS
变量以设置此选项。运行 MinIO 服务器进程的 systemd
用户必须对指定的目录具有读和列出权限。
有关为 TLS 配置 MinIO 的更具体指南(包括通过服务器名称指示 (SNI) 进行多域支持),请参阅 网络加密 (TLS)。您可以在可选地跳过此步骤以在未启用 TLS 的情况下进行部署。MinIO 强烈建议在早期开发之外不要进行非 TLS 部署。
5) 运行 MinIO 服务器进程
在部署中的每个节点上执行以下命令以启动 MinIO 服务
sudo systemctl start minio.service
使用以下命令确认服务已联机且正常运行
sudo systemctl status minio.service
journalctl -f -u minio.service
在服务器进程连接和同步时,MinIO 可能会记录大量非关键警告。这些警告通常是暂时的,应随着部署上线而解决。
更改于版本 RELEASE.2023-02-09T05-16-53Z: 如果 MinIO 检测到足够的驱动器以满足部署的 写入仲裁,它将启动。
如果在启动 MinIO 后有任何驱动器仍然脱机,请在启动生产工作负载之前检查并解决任何阻止其功能的问题。
MinIO 服务不会在主机重新启动时自动启动。您必须使用 systemctl enable minio.service
将进程作为主机启动的一部分启动。
sudo systemctl enable minio.service
6) 打开 MinIO 控制台
打开您的浏览器,并在端口 :9001
处访问任何 MinIO 主机名以打开 MinIO 控制台 登录页面。例如,https://minio1.example.com:9001
。
使用上一步中的 MINIO_ROOT_USER 和 MINIO_ROOT_PASSWORD 登录。
您可以使用 MinIO 控制台执行一般管理任务,例如身份和访问管理、指标和日志监控或服务器配置。每个 MinIO 服务器都包含它自己的嵌入式 MinIO 控制台。