跳到主要内容

RustFS 单机单盘部署方案(SNSD)

一、安装前必读​

本文档包含了 RustFS 单机单盘部署模式(Single Node Single Disk,SNSD)。

1. 请明确您的三种安装启用模式​

  1. 单机单盘模式(SNSD) (当前文档)
  2. 单机多盘模式(SNMD)
  3. 多机多盘模式(MNMD)

2. 适用场景说明​

单机单盘适用于低密度非关键业务,在生产环境建议进行数据备份,避免出现数据风险。 1 台服务器中只有一个数据盘,所有的数据全部落入这一个数据盘中。

二、先决条件​

2.1. 操作系统版本​

我们推荐 Linux 内核为 4.x 及以上的版本。因为,5.x / 6.x 的版本可以获得更好的 IO 吸吐和网络性能。 您可以使用 Ubuntu 22.04 和 RHEL8.x 来安装 RustFS。

2.2 防火墙​

# 开放新的HTTP端口
sudo ufw allow 22/tcp
sudo ufw allow 9000/tcp
sudo ufw allow 9001/tcp

# 重载防火墙
sudo ufw reload

# 验证规则
sudo ufw status numbered

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

2.3 内存条件​

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

2.4 时间同步​

多节点的一致性必须要使用时间服务器维护时间的一致性,不然可能会出现无法启动服务的情况。相关时间服务器例如使用 ntp , timedatectl , 或者 timesyncd 。

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

timedatectl status

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

2.5 容量和EC规划​

在规划对象存储容量的时候,我们建议您根据:

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

EC(纠删码)规划如下:

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

三、硬件要求​

最低配置​

  • CPU:至少 2 核
  • 内存:至少 2GB(测试环境),生产环境建议 128GB
  • 磁盘:1 块硬盘或分区(用于系统和数据存储)
  • 网络:千兆以太网
  • 操作系统:Ubuntu 22.04 LTS 或 RHEL8.x

推荐配置​

  • CPU:4 核或更多
  • 内存:8GB 或更多
  • 磁盘:系统盘 50GB SSD,数据盘 100GB SSD 或更多
  • 操作系统:Ubuntu 22.04 LTS

四、硬盘资源配置​

1. 磁盘规划​

对于单机单盘部署,建议按以下方式规划磁盘资源:

系统盘​

  • 容量:至少 50GB SSD
  • 用途:操作系统、RustFS 二进制文件、日志文件
  • 文件系统:xfs(强烈推荐)

数据盘​

  • 容量:至少 100GB(可根据实际需求扩展)
  • 用途:存储对象数据
  • 文件系统:xfs(强烈推荐)
  • 挂载点:/data/rustfs0

2. 磁盘性能建议​

  • 推荐使用 SSD:提供更好的 I/O 性能
  • 避免使用机械硬盘:可能成为性能瓶颈
  • 禁止使用 NFS:NFS 在高 IO 情况下会产生幻写和锁的问题

2.6 磁盘规划补充说明​

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

原因如下:

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

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

3. 磁盘配置示例​

假设服务器配备以下磁盘:

  • /dev/sda:系统盘(50GB)
  • /dev/sdb:数据盘(100GB 或更大)

4. 磁盘资源监控​

在单机部署环境中,建议定期监控磁盘使用情况:

# 查看磁盘使用情况
df -h

# 查看磁盘IO统计
iostat -x 1

# 查看目录大小
du -sh /data/rustfs0

# 查看inode使用情况
df -i

5. 磁盘扩容指南​

当数据盘空间不足时,可按以下步骤进行扩容:

  1. 物理扩容:增加硬盘容量或添加新硬盘

  2. 分区扩容:

    # 使用parted调整分区大小
    sudo parted /dev/sdb resizepart 1 100%

    # 扩展xfs文件系统
    sudo xfs_growfs /data/rustfs0

2.7 文件系统选择​

RustFS 官方在磁盘文件系统格式上,强烈推荐在所有用于存储的磁盘上使用 XFS 文件系统。RustFS 的开发和测试都基于 XFS,能够确保最佳的性能和稳定性。不建议使用 ext4、BTRFS 或 ZFS 等其他文件系统,因为它们可能会导致性能下降或出现不可预知的问题。

RustFS 是一个为高并发、高性能设计的对象存储系统。当客户端上传或下载大对象时,RustFS 会将其分片,并以并行的方式同时读写到纠删集(Erasure Set)中的多块磁盘上。

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

sudo mkdir -p /data/rustfs0
systemctl daemon-reload

# mount disk
sudo mount -a

五、系统准备​

1. 更新系统并安装依赖​

# 更新软件源
sudo apt update && sudo apt upgrade -y

# 安装核心依赖
sudo apt install -y curl wget ntpdate net-tools xfsprogs unzip

2. 时间同步​

# 同步阿里云NTP服务器
sudo ntpdate ntp.aliyun.com

# 设置定时同步(每5分钟一次)
echo "*/5 * * * * root ntpdate ntp.aliyun.com" | sudo tee -a /etc/crontab

六、RustFS 部署​

1. 配置用户名​

RustFS 启动,我们建议您配置一个专门的无登录权限的用户进行启动 RustFS 的服务。

以下示例是修改创建用户、组并设置权限以访问 RustFS 指定的数据目录(可选):

# 创建用户组和用户
sudo groupadd -r rustfs-user
sudo useradd -M -r -g rustfs-user rustfs-user

# 授权存储目录权限
sudo chown rustfs-user:rustfs-user /data/rustfs*

# 验证用户创建成功
id rustfs-user

注意:

  • 如果创建了 rustfs-user 用户和组,需要将 /etc/systemd/system/rustfs.service 中的 User 和 Group 改为 rustfs-user
  • 将 /data/rustfs* 调整为指定的挂载目录

2. 下载 RustFS 二进制文件​

# 下载RustFS服务器端(稳定版)
curl -O https://dl.rustfs.com/artifacts/rustfs/release/rustfs-linux-x86_64-musl-latest.zip

unzip rustfs-linux-x86_64-musl-latest.zip

# 移动到安装目录
sudo mv rustfs /usr/local/bin/

# 下载MinIO客户端(mc)
sudo wget https://dl.min.io/client/mc/release/linux-amd64/mc -P /usr/local/bin/

# 授权执行权限
sudo chmod +x /usr/local/bin/rustfs /usr/local/bin/mc

# 验证安装
rustfs --version

3. 配置 RustFS 环境变量​

# 创建配置文件(单机单盘模式)
sudo tee /etc/default/rustfs <<EOF
RUSTFS_ACCESS_KEY=rustfsadmin
RUSTFS_SECRET_KEY=rustfsadmin
RUSTFS_VOLUMES="/data/rustfs0"
RUSTFS_ADDRESS=":9000"
RUSTFS_CONSOLE_ENABLE=true
RUST_LOG=error
RUSTFS_OBS_LOG_DIRECTORY="/var/logs/rustfs/"
EOF

# 创建存储目录
sudo mkdir -p /data/rustfs0 /var/logs/rustfs /opt/tls
sudo chmod -R 750 /data/rustfs* /var/logs/rustfs

# 授权文件权限
sudo chmod 600 /etc/default/rustfs
sudo chown rustfs-user:rustfs-user /etc/default/rustfs

# 创建日志目录并授权
sudo chown -R rustfs-user:rustfs-user /var/logs/rustfs

4. 配置系统服务​

# 创建 systemd 服务文件
sudo tee /etc/systemd/system/rustfs.service <<EOF
[Unit]
Description=RustFS Object Storage Server
Documentation=https://rustfs.com/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

5. 启动 RustFS 服务​

# 重载systemd配置
sudo systemctl daemon-reload

# 启动RustFS并设置开机自启
sudo systemctl enable --now rustfs

# 查看启动状态
sudo systemctl status rustfs

# 查看日志
sudo journalctl -u rustfs -f

七、访问验证​

1. 控制台访问​

通过浏览器访问:http://YOUR_SERVER_IP:9001

  • 用户名:rustfsadmin
  • 密码:rustfsadmin

2. API 访问测试​

# 配置mc别名
mc alias set rustfs-local http://localhost:9000 rustfsadmin rustfsadmin

# 创建测试桶
mc mb rustfs-local/test-bucket

# 上传文件
echo "Hello RustFS Standalone" > test.txt
mc cp test.txt rustfs-local/test-bucket/

# 列出文件
mc ls rustfs-local/test-bucket/

八、注意事项​

1. 适用场景​

  • 适用于低密度非关键业务
  • 不适用于生产环境(除非进行数据备份)
  • 无数据冗余和高可用性

2. 安全建议​

  • 不要在公网暴露服务端口
  • 定期更改管理员密码
  • 限制访问IP范围
  • 使用防火墙规则限制访问
  • 定期更新RustFS版本以获取安全补丁

3. 性能优化​

  • 使用 SSD 磁盘以获得更好性能
  • 根据实际需求调整系统资源分配
  • 合理规划存储容量和纠删码配置
  • 定期监控系统性能指标

4. 故障排查​

# 查看服务状态
sudo systemctl status rustfs

# 查看服务日志
sudo journalctl -u rustfs -f

# 检查磁盘使用情况
df -h

# 检查网络连接
ss -tuln | grep 9000

# 检查进程资源使用情况
top -p $(pgrep rustfs)

九、卸载 RustFS​

如需卸载 RustFS,请按以下步骤操作:

# 停止服务
sudo systemctl stop rustfs

# 禁用开机自启
sudo systemctl disable rustfs

# 删除服务文件
sudo rm /etc/systemd/system/rustfs.service

# 删除二进制文件
sudo rm /usr/local/bin/rustfs
sudo rm /usr/local/bin/mc

# 删除配置文件
sudo rm /etc/default/rustfs

# 删除日志目录
sudo rm -rf /var/log/rustfs

# 卸载磁盘(可选,根据需要决定是否删除数据)
sudo umount /data/rustfs0
sudo rm -rf /data/rustfs0

# 删除用户(可选)
sudo userdel -r rustfs-user