跳到内容

多节点多磁盘 (MNMD)

1. 安装前阅读

本文档涵盖 RustFS 多节点多磁盘模式部署,适用于企业级性能、安全性和可扩展性。它还提供了生产工作负载所需的架构图。请在安装前阅读。我们的启动模式和清单如下:

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

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

至少需要 4 台服务器,每台服务器至少需要 1 块磁盘才能安全地启动分布式对象存储集群。

在下面的架构图中,数据通过负载均衡随机写入任何服务器。使用默认的 12 + 4 模式,数据块默认被拆分为 12 个数据块 + 4 个奇偶校验块,存储在不同服务器的不同磁盘上。

任何单服务器故障或维护都不会影响数据安全。

任何 4 块磁盘内的数据损坏都不会影响数据安全。

RustFS Multiple Node Multiple Disk Mode

2. 前提条件

  1. 操作系统版本
  2. 防火墙
  3. 主机别名或域名解析
  4. 内存要求
  5. 时间同步
  6. 容量规划
  7. 磁盘规划
  8. 文件系统规划

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 集群需要相同、连续的主机名。有两种方法可以实现连续主机名:

1. DNS 配置

请配置您的 DNS 解析服务器,以确保名称的连续性。

2. HOSTS 配置

修改 /etc/hosts 中的本地别名设置,如下所示:

bash
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 node4

2.4. 内存要求

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

2.5. 时间同步

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

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

bash
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 标签来标记磁盘。

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

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
# 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
  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 发布。