多节点多磁盘 (MNMD)
1. 安装前阅读
本文档涵盖 RustFS 多节点多磁盘模式部署,适用于企业级性能、安全性和可扩展性。它还提供了生产工作负载所需的架构图。请在安装前阅读。我们的启动模式和清单如下:
请阐明您的三种安装启动模式
安装前检查清单 以确保所有指标都符合生产指导特性。如果不需要生产标准,可以跳过本指南。
至少需要 4 台服务器,每台服务器至少需要 1 块磁盘才能安全地启动分布式对象存储集群。
在下面的架构图中,数据通过负载均衡随机写入任何服务器。使用默认的 12 + 4 模式,数据块默认被拆分为 12 个数据块 + 4 个奇偶校验块,存储在不同服务器的不同磁盘上。
任何单服务器故障或维护都不会影响数据安全。
任何 4 块磁盘内的数据损坏都不会影响数据安全。

2. 前提条件
- 操作系统版本
- 防火墙
- 主机别名或域名解析
- 内存要求
- 时间同步
- 容量规划
- 磁盘规划
- 文件系统规划
2.1. 操作系统版本
我们建议使用 Linux 内核版本 4.x 及更高版本。版本 5.x/6.x 可以实现更好的 I/O 吞吐量和网络性能。
您可以使用 Ubuntu 22.04 和 RHEL8.x 来安装 RustFS。
2.2. 防火墙
Linux 系统默认是开启防火墙的。您可以使用以下命令检查防火墙状态
systemctl status firewalld如果您的防火墙状态为 "active",则可以使用以下命令关闭防火墙
systemctl stop firewalld
systemctl disable firewalld或者允许 RustFS 端口 9000
firewall-cmd --zone=public --add-port=9000/tcp --permanent
firewall-cmd --reload部署中的所有 RustFS 服务器必须使用相同的监听端口。如果您使用端口 9000,则其他服务器上的所有端口也必须是端口 9000。
2.3. 主机名 (单节点单磁盘和单节点多磁盘可以跳过此步骤)
单节点单磁盘和单节点多磁盘不设置主机别名,请跳过此步骤。
创建 RustFS 集群需要相同、连续的主机名。有两种方法可以实现连续主机名:
1. DNS 配置
请配置您的 DNS 解析服务器,以确保名称的连续性。
2. HOSTS 配置
修改 /etc/hosts 中的本地别名设置,如下所示:
vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.1 node1
192.168.1.2 node2
192.168.1.3 node3
192.168.1.4 node42.4. 内存要求
RustFS 在测试环境运行至少需要 2 GB 内存,生产环境至少需要 128 GB 内存。
2.5. 时间同步
多节点一致性必须使用时间服务器来保持时间一致性,否则服务可能无法启动。相关时间服务器包括 ntp、timedatectl 或 timesyncd。
RustFS 需要时间同步。您可以使用以下命令检查时间同步状态:
timedatectl status如果状态为 "synchronized",则表示时间同步正常。
2.6. 容量和 EC 规划
在规划对象存储容量时,我们建议考虑:
- 初始数据量:您计划一次性迁移或存储多少数据?(例如:500 TB)
- 数据增长量:每日/每周/每月数据增长容量
- 规划周期:您希望此硬件规划能支持多久? (推荐:3 年)
- 考虑您公司的硬件迭代和更新周期。
EC (Erasure Coding) 规划如下
| 场景 | 推荐的奇偶校验级别 | 描述 |
|---|---|---|
| 标准生产环境 | EC:4 | 可容忍最多 4 块磁盘(或节点)故障,在可靠性和存储效率之间取得良好平衡。 |
| 高可用性需求 | EC:4 - 8 或更高 | 适用于数据可用性要求极高的场景,但会牺牲更多存储空间。 |
| 开发测试环境 | EC:2 | 提供基本的冗余保护,适用于非关键业务。 |
2.7. 磁盘规划
由于 NFS 在高 I/O 条件下会产生幻写和锁定问题,因此在使用 RustFS 时禁止将 NFS 作为底层存储介质。官方强烈建议使用 JBOD (Just a Bunch of Disks) 模式,即简单的磁盘捆绑。这意味着将物理磁盘直接、独立地暴露给操作系统,由 RustFS 软件层负责数据冗余和保护。
原因如下:
- 更好的性能: RustFS 的纠删码引擎经过高度优化,可以直接并发读写多个磁盘,实现比硬件 RAID 控制器更高的吞吐量。硬件 RAID 反而成为性能瓶颈。
- 更低的成本: 无需昂贵的 RAID 卡,降低硬件采购成本。
- 更简单的管理: RustFS 统一管理磁盘,简化存储层操作和维护。
- 更快的故障恢复: RustFS 的修复过程比传统 RAID 重建更快,并且对集群性能影响更小。
官方建议在磁盘上使用 NVMe SSD 作为存储介质,以确保更高的性能和吞吐量。
2.8. 文件系统选择
对于磁盘文件系统格式化,RustFS 官方强烈建议所有用于存储的磁盘都使用 XFS 文件系统。RustFS 的开发和测试均基于 XFS,以确保最佳性能和稳定性。不建议使用 ext4、BTRFS 或 ZFS 等其他文件系统,因为它们可能导致性能下降或不可预测的问题。
RustFS 是一个为高并发和高性能设计的对象存储系统。当客户端上传或下载大对象时,RustFS 会将其分片并并行并发地读写到纠删集中的多个磁盘。
XFS 优势:XFS (eXtents File System) 从设计之初就以高性能和可扩展性为目标。它在大文件处理和高并发 I/O 场景下表现出色。其内部的日志功能和数据结构(如 B+ 树)能够高效处理大量并行读写请求,这与 RustFS 的工作模式完美匹配。相比之下,虽然 ext4 等文件系统近年来在性能上有了很大改进,但在面对极端并发负载时,XFS 通常能提供更稳定和优异的吞吐量。
对象存储通常需要处理海量文件和巨大的单个文件(TB 级别)。XFS 是一个 64 位文件系统,能够支持极大的文件大小(高达 8 EB)和文件系统规模。其元数据管理非常高效,即使在单个目录中拥有数百万个文件,其性能下降也远小于其他文件系统。这对于 RustFS 将每个对象(或对象的版本)作为独立文件存储在后端文件系统的方式至关重要。
当 RustFS 写入新对象或对象版本时,为了确保写入性能并减少文件碎片,它会进行空间预留。XFS 提供了一个名为 fallocate 的高效 API,允许应用程序预留一段连续的磁盘空间。RustFS 利用这一特性在写入文件之前分配所需的空间,避免了写入过程中动态扩展和元数据更新带来的性能开销,同时最大限度地减少了文件碎片,从而保证了后续的读取性能。
为了更好地进行磁盘发现,在格式化 XFS 文件系统时,我们建议使用 Label 标签来标记磁盘。
首先,您需要检查磁盘系统情况
sudo lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 465.7G 0 disk
├─sda1 8:1 0 512M 0 part /boot/efi
└─sda2 8:2 0 465.2G 0 part /
nvme0n1 8:16 0 3.7T 0 disk <-- if this is our format new disk
nvme1n1 8:32 0 3.7T 0 disk <-- if this is our format new disk
nvme2n1 8:48 0 3.7T 0 disk具体格式化命令如下:
sudo mkfs.xfs -i size=512 -n ftype=1 -L RUSTFS0 /dev/sdb我们可以在格式化时添加一些推荐的选项来优化性能
- -L
- -i size=512:RustFS 官方推荐将 inode 大小设置为 512 字节,这对于存储大量小对象(元数据)的场景具有性能优势。
- -n ftype=1:启用 ftype 功能。这允许文件系统在目录结构中记录文件类型,可以提高 readdir 和 unlink 等操作的性能,对 RustFS 非常有利。
挂载
# write new line
vim /etc/fstab
LABEL=RUSTFS0 /data/rustfs0 xfs defaults,noatime,nodiratime 0 0
#save & exit
# mount disk
sudo mount -a3. 配置用户名
对于 RustFS 启动,我们建议配置一个没有登录权限的专用用户来启动 RustFS 服务。在 rustfs.service 启动控制脚本中。
- 不修改默认启动账号: 默认的用户和组是
root和root。如果您想使用默认的root和root,则无需修改。 - 修改默认启动账号: 您可以使用 groupadd 和 useradd 命令创建用户和组,然后在添加后修改 systemctl 启动配置文件中的用户名和密码。
以下示例演示了创建用户、组以及设置访问 RustFS 指定数据目录的权限(可选)
groupadd -r rustfs-user
useradd -M -r -g rustfs-user rustfs-user
chown rustfs-user:rustfs-user /data/rustfs*注意
- 如果创建了 rustfs-user 用户和组,您需要将
/etc/systemd/system/rustfs.service中的 User 和 Group 更改为rustfs-user - 将
/data/rustfs*调整为指定的挂载目录。
4. 下载安装包
请您先安装 wget 或 curl 来下载 rustfs 安装包。
# Download address
wget https://dl.rustfs.com/artifacts/rustfs/release/rustfs-linux-x86_64-musl-latest.zip
unzip rustfs-linux-x86_64-musl-latest.zip
chmod +x rustfs
mv rustfs /usr/local/bin/5. 配置环境变量
- 创建配置文件
# Multiple node multiple disk mode
sudo tee /etc/default/rustfs <<EOF
RUSTFS_ACCESS_KEY=rustfsadmin
RUSTFS_SECRET_KEY=rustfsadmin
RUSTFS_VOLUMES="http://node{1...4}:9000/data/rustfs{0...3}"
RUSTFS_ADDRESS=":9000"
RUSTFS_CONSOLE_ENABLE=true
RUST_LOG=error
RUSTFS_OBS_LOG_DIRECTORY="/var/logs/rustfs/"
EOF- 创建存储目录
sudo mkdir -p /data/rustfs{0..3} /var/logs/rustfs /opt/tls
sudo chmod -R 750 /data/rustfs* /var/logs/rustfs6. 配置系统服务
- 创建 systemd 服务文件
sudo tee /etc/systemd/system/rustfs.service <<EOF
[Unit]
Description=RustFS Object Storage Server
Documentation=https://rustfs.cn/docs/
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
NotifyAccess=main
User=root
Group=root
WorkingDirectory=/usr/local
EnvironmentFile=-/etc/default/rustfs
ExecStart=/usr/local/bin/rustfs \$RUSTFS_VOLUMES
LimitNOFILE=1048576
LimitNPROC=32768
TasksMax=infinity
Restart=always
RestartSec=10s
OOMScoreAdjust=-1000
SendSIGKILL=no
TimeoutStartSec=30s
TimeoutStopSec=30s
NoNewPrivileges=true
ProtectHome=true
PrivateTmp=true
PrivateDevices=true
ProtectClock=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectControlGroups=true
RestrictSUIDSGID=true
RestrictRealtime=true
# service log configuration
StandardOutput=append:/var/logs/rustfs/rustfs.log
StandardError=append:/var/logs/rustfs/rustfs-err.log
[Install]
WantedBy=multi-user.target
EOF- 重新加载服务配置
sudo systemctl daemon-reload7. 启动服务与验证
- 启动服务并设置开机自启动
sudo systemctl enable --now rustfs- 验证服务状态
systemctl status rustfs- 检查服务端口
netstat -ntpl- 查看日志文件
tail -f /var/logs/rustfs/rustfs*.log- 访问控制台
输入服务器的 IP 地址和端口,尝试访问控制台。您看到的界面如下:
