跳到内容

单节点多磁盘模式 (SNMD)

1. 安装前阅读

本文档涵盖单节点多磁盘部署模式。

  1. 请阐明您的三种安装启动模式

  2. 安装前检查清单 以确保所有指标都符合生产指导特性。 如果不需要生产标准,则可以跳过此指导。

当前文档适用于单节点多磁盘模式。 单节点多磁盘模式适用于中等非关键业务。 在生产环境中,指定 M 块硬盘损坏通常不会造成数据风险。 但如果整台服务器损坏或超过 M 块磁盘损坏,数据将丢失。 请注意重要数据的备份。

在单个服务器内,只有多个数据盘,数据以分片形式存储在多个数据盘上。

一个数据块被拆分成指定 K 个数据块和 M 个校验块。 至多 K 个数据块不能丢失,至多 M 个校验块不能丢失。

以下图为例

RustFS Single Node Multiple Disk Mode

2. 前提条件

  1. 操作系统版本
  2. 防火墙
  3. 内存要求
  4. 时间同步
  5. 容量规划
  6. 磁盘规划
  7. 文件系统选择

2.1. 操作系统版本

我们推荐 Linux 内核版本 4.x 及以上。 5.x/6.x 版本可以实现更好的 I/O 吞吐量和网络性能。

您可以使用 Ubuntu 22.04 和 RHEL8.x 来安装 RustFS。

2.2. 防火墙

Linux 系统默认是开启防火墙的。您可以使用以下命令检查防火墙状态

bash
systemctl status firewalld

如果您的防火墙状态为 "active",则可以使用以下命令关闭防火墙

bash
systemctl stop firewalld
systemctl disable firewalld

或者允许 RustFS 端口 9000

bash
firewall-cmd --zone=public --add-port=9000/tcp --permanent
firewall-cmd --reload

部署中的所有 RustFS 服务器必须使用相同的监听端口。 如果您使用端口 9000,则其他服务器上的所有端口也必须是端口 9000。

2.3. 内存要求

RustFS 在测试环境运行至少需要 2 GB 内存,生产环境至少需要 128 GB 内存。

2.4. 时间同步

多节点一致性必须使用时间服务器来保持时间一致性,否则服务可能无法启动。 相关时间服务器包括 ntptimedatectltimesyncd

RustFS 需要时间同步。 您可以使用以下命令检查时间同步状态

bash
timedatectl status

如果状态为 "synchronized",则表示时间同步正常。

2.5. 容量和 EC 规划

在规划对象存储容量时,我们建议考虑

  • 初始数据量:您计划一次性迁移或存储多少数据?(例如:500 TB)
  • 数据增长量:每日/每周/每月数据增长容量
  • 规划周期:您希望此硬件规划能支持多长时间? (建议:3年)
  • 考虑您公司的硬件迭代和更新周期。

EC (Erasure Coding) 规划如下

场景推荐的奇偶校验级别描述
标准生产环境EC:4最多可容忍 4 块磁盘(或节点)故障,在可靠性和存储效率之间取得良好平衡。
高可用性需求EC:4 - 8 或更高适用于数据可用性要求极高的场景,但会牺牲更多存储空间。
开发测试环境EC:2提供基本的冗余保护,适用于非关键业务。

2.6. 磁盘规划

由于 NFS 在高 I/O 条件下会产生幻写和锁问题,因此在使用 RustFS 时,禁止将 NFS 作为底层存储介质。 官方强烈推荐使用 JBOD(Just a Bunch of Disks)模式,即简单的磁盘捆绑。 这意味着将物理磁盘直接且独立地暴露给操作系统,由 RustFS 软件层负责数据冗余和保护。

原因如下

  • 更好的性能: RustFS 的纠删码引擎经过高度优化,可以直接并发读写多个磁盘,实现比硬件 RAID 控制器更高的吞吐量。 硬件 RAID 反而会成为性能瓶颈。
  • 更低的成本: 无需昂贵的 RAID 卡,降低硬件采购成本。
  • 更简单的管理: RustFS 统一管理磁盘,简化存储层面的运维。
  • 更快的故障恢复: RustFS 的 healing 过程比传统 RAID 重建更快,并且对集群性能影响更小。

官方推荐在磁盘上使用 NVMe SSD 作为存储介质,以确保更高的性能和吞吐量。

2.7. 文件系统选择

对于磁盘文件系统格式化,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 提供了一个高效的 API fallocate,允许应用程序预先保留一块连续的磁盘空间。 RustFS 利用此特性在写入文件之前就为其分配好所需的空间,避免了写入过程中动态扩容和元数据更新带来的性能开销,同时最大限度地减少了文件碎片,确保了后续的读取性能。

为了更好地进行磁盘发现,在格式化 XFS 文件系统时,我们推荐使用 Label 标签来标记磁盘。

首先,您需要检查磁盘系统情况

bash
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

具体格式化命令如下

bash
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 非常有利。

挂载

bash
# write new line
vim /etc/fstab
LABEL=RUSTFS0 /data/rustfs0   xfs   defaults,noatime,nodiratime   0   0

#save & exit

# mount disk
sudo mount -a

3. 配置用户名

对于 RustFS 启动,我们推荐配置一个无登录权限的专用用户来启动 RustFS 服务。 在 rustfs.service 启动控制脚本中。

  1. 不修改默认启动账号: 默认的用户和组为 rootroot。 如果您希望使用默认的 rootroot,则无需修改。
  2. 修改默认启动账号: 您可以通过 groupadd 和 useradd 命令创建用户和组,然后在添加后修改 systemctl 启动配置文件中的用户名和密码。

以下示例展示了创建用户、组和设置访问 RustFS 指定数据目录的权限(可选)

bash
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 安装包。

bash
# 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. 配置环境变量

  1. 创建配置文件
bash
# Single node multiple disk mode
sudo tee /etc/default/rustfs <<EOF
RUSTFS_ACCESS_KEY=rustfsadmin
RUSTFS_SECRET_KEY=rustfsadmin
RUSTFS_VOLUMES="/data/rustfs{0...3}"
RUSTFS_ADDRESS=":9000"
RUSTFS_CONSOLE_ENABLE=true
RUST_LOG=error
RUSTFS_OBS_LOG_DIRECTORY="/var/logs/rustfs/"
EOF
  1. 创建存储目录
bash
sudo mkdir -p /data/rustfs{0..3} /var/logs/rustfs /opt/tls
sudo chmod -R 750 /data/rustfs* /var/logs/rustfs

6. 配置系统服务

  1. 创建 systemd 服务文件
bash
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
  1. 重新加载服务配置
bash
sudo systemctl daemon-reload

7. 启动服务与验证

  1. 启动服务并设置开机自启动
bash
sudo systemctl enable --now rustfs
  1. 验证服务状态
bash
systemctl status rustfs
  1. 检查服务端口
bash
netstat -ntpl
  1. 查看日志文件
bash
tail -f /var/logs/rustfs/rustfs*.log
  1. 访问控制台

输入服务器的 IP 地址和端口,尝试访问控制台。 您看到的界面如下

Console

根据 Apache 许可证 2.0 发布。