从零开始部署 RustFS 高可用对象存储集群的全流程指南,涵盖架构设计、JBOD 磁盘配置、负载均衡、扩缩容操作及性能规划。

引言:为什么选择 RustFS?

在分布式对象存储领域,MinIO 曾是许多团队的首选,但其 AGPL 协议对商业应用不太友好,且官方仓库已于 2026 年 2 月进入维护模式。在此背景下,RustFS 凭借 Apache-2.0 协议和卓越的性能表现,成为备受关注的新选择。

RustFS 的核心亮点:

特性 说明
开源协议 Apache-2.0,商业友好,无协议风险
开发语言 Rust,无 GC 停顿,内存安全
核心技术 基于 io_uring 实现零拷贝、真正异步 I/O
性能数据 4K 随机读 IOPS 比 MinIO 高 42%,内存占用仅为其 1/10 左右
架构模式 去中心化对等架构,无单点故障
部署体量 单二进制文件 < 100MB,启动迅速

系统架构设计

整体架构图

flowchart TB
    Client[("S3 客户端")]
    LB[("负载均衡器<br>Nginx/HAProxy")]

    subgraph Cluster [RustFS 高可用集群]
        direction LR
        N1[("节点 1<br>存储+计算")]
        N2[("节点 2<br>存储+计算")]
        N3[("节点 3<br>存储+计算")]
        N4[("节点 4<br>存储+计算")]
    end

    Client --> LB
    LB --> N1 & N2 & N3 & N4

    N1 <--> N2
    N2 <--> N3
    N3 <--> N4
    N4 <--> N1

    subgraph Data [数据分布 EC:4+2]
        direction LR
        D1[("数据块1")]
        D2[("数据块2")]
        D3[("数据块3")]
        D4[("数据块4")]
        P1[("校验块1")]
        P2[("校验块2")]
    end

    N1 -.-> D1
    N2 -.-> D2
    N3 -.-> D3
    N4 -.-> D4
    N1 -.-> P1
    N2 -.-> P2
                ┌─────────────┐
                │  S3 客户端   │
                └──────┬──────┘
                       │
                ┌──────▼──────┐
                │ 负载均衡器   │
                │(Nginx/HAProxy)│
                └──┬───┬───┬──┘
                   │   │   │
          ┌────────▼┐ ┌▼────▼────────┐
          │  RustFS 集群 (EC:4+2)     │
          │          │               │
          │  ┌──┐ ┌──┐ ┌──┐ ┌──┐    │
          │  │N1│ │N2│ │N3│ │N4│    │
          │  └──┘ └──┘ └──┘ └──┘    │
          │  ════════════════════    │
          │  对等节点,任意故障不影响 │
          └─────────────────────────┘

### 核心设计原则

1. **节点对等**:所有节点完全对等,无主从之分,任意节点故障不影响整体服务。
2. **纠删码(EC)**:采用 EC:4+2 模式(4 数据块 + 2 校验块),允许最多 2 个节点或磁盘同时故障,存储利用率达 66.7%。
3. **去中心化元数据**:每个节点为其存储的数据分片维护本地元数据,无集中式元数据瓶颈。
4. **负载均衡**:前置 Nginx 或 HAProxy 提供统一访问入口。

## 节点通信与数据存储机制

### 节点间通信

所有节点间通信基于 gRPC 协议,包含以下核心服务:

| 服务 | 功能 |
|------|------|
| Storage Service | 跨节点的数据读写请求 |
| Metadata Service | 元数据查询与管理 |
| Lock Service | 分布式锁,保证并发写入一致性 |
| Admin Service | 集群管理与状态同步 |

### 数据分布策略

RustFS 通过层次化算法决定数据存放位置:

- **存储池(Pool)**:集群顶层资源组织单位
- **纠删码集合(Erasure Set)**:数据存储的基本单元,一��对象完整存储在一个 Set 内
- **磁盘(Disk)**:每个 Set 由分布在不同节点上的多块磁盘组成

对象落点由 **一致性哈希(Consistent Hashing)** 决定,进入 Set 后通过 Reed-Solomon 纠删码 切分为 K 个数据块和 M 个校验块,分片位置由 CRC32 哈希 确定。

### 数据写入流程

HTTP 请求 → 认证 → 预处理(加密/压缩)→ EC 分片 → io_uring 零拷贝写入 → 并行落盘


### 一致性保证

- **read-after-write 强一致性**:写入成功后,后续读取立即可见
- **分布式锁 + 仲裁机制(Quorum)**:协调并发操作
- **故障自愈**:节点故障后自动重建丢失的数据分片

## 高可用集群部署:多机多盘方案

### 环境准备

| 配置项 | 要求 |
|--------|------|
| 节点数量 | 至少 4 台(生产环境推荐) |
| 每节点磁盘 | 5 块(建议 NVMe SSD) |
| 网络 | 万兆(10GbE)或更高 |
| 操作系统 | Ubuntu 22.04 LTS / RHEL 8.x,内核 5.x+ |
| 内存 | 测试 ≥2GB,生产 ≥128GB |
| 时间同步 | 所有节点启用 NTP |

### 步骤一:配置主机名与 Hosts 解析

所有节点必须配置连续、有序的主机名,这是节点间互相发现的必要条件。

```bash
# 各节点分别执行
hostnamectl set-hostname rustfs-node1  # node2, node3, node4 依此类推

# 所有节点执行,修改 /etc/hosts
cat >> /etc/hosts << EOF
192.168.1.10 rustfs-node1
192.168.1.11 rustfs-node2
192.168.1.12 rustfs-node3
192.168.1.13 rustfs-node4
EOF

步骤二:磁盘格式化与挂载(JBOD 模式)

什么是 JBOD? JBOD(Just a Bunch Of Disks)即不组建 RAID,不合并 LVM,让操作系统直接识别每块独立磁盘。RustFS 官方强烈建议使用 JBOD 模式,原因如下:

  • 避免与软件 EC 做双重校验,减少性能损耗
  • 单盘故障时恢复更快,影响范围更小
  • 充分发挥 io_uring 的并行 I/O 优势
 1# 格式化 5 块数据盘(假设为 /dev/sdb 到 /dev/sdf)
 2for i in b c d e f; do
 3    sudo mkfs.xfs /dev/sd$i -f
 4done
 5
 6# 创建挂载点
 7sudo mkdir -p /data/disk{1..5}
 8
 9# 挂载磁盘
10sudo mount /dev/sdb /data/disk1
11sudo mount /dev/sdc /data/disk2
12sudo mount /dev/sdd /data/disk3
13sudo mount /dev/sde /data/disk4
14sudo mount /dev/sdf /data/disk5
15
16# 设置开机自动挂载(添加到 /etc/fstab)
17cat >> /etc/fstab << EOF
18/dev/sdb /data/disk1 xfs defaults,noatime 0 2
19/dev/sdc /data/disk2 xfs defaults,noatime 0 2
20/dev/sdd /data/disk3 xfs defaults,noatime 0 2
21/dev/sde /data/disk4 xfs defaults,noatime 0 2
22/dev/sdf /data/disk5 xfs defaults,noatime 0 2
23EOF

步骤三:安装 RustFS

1# 下载最新版本(请替换为实际最新版本号)
2wget https://github.com/rustfs/rustfs/releases/latest/download/rustfs-linux-amd64
3sudo mv rustfs-linux-amd64 /usr/local/bin/rustfs
4sudo chmod +x /usr/local/bin/rustfs

步骤四:启动集群

所有节点使用完全相同的启动命令,通过 http://node{1...4}/data/disk{1...5} 参数指定集群成员和磁盘路径:

1export RUSTFS_ROOT_USER=admin
2export RUSTFS_ROOT_PASSWORD=your-strong-password
3rustfs server \
4  --console-address ":9001" \
5  http://rustfs-node{1...4}/data/disk{1...5}

步骤五:配置 systemd 服务(推荐)

 1cat > /etc/systemd/system/rustfs.service << EOF
 2[Unit]
 3Description=RustFS
 4Documentation=https://docs.rustfs.com
 5After=network-online.target
 6
 7[Service]
 8Environment="RUSTFS_ROOT_USER=admin"
 9Environment="RUSTFS_ROOT_PASSWORD=your-strong-password"
10ExecStart=/usr/local/bin/rustfs server --console-address ":9001" http://rustfs-node{1...4}/data/disk{1...5}
11Restart=always
12RestartSec=10
13
14[Install]
15WantedBy=multi-user.target
16EOF
17
18systemctl daemon-reload
19systemctl enable rustfs
20systemctl start rustfs

步骤六:配置 Nginx 负载均衡

 1upstream rustfs_cluster {
 2    hash $request_uri consistent;
 3    server rustfs-node1:9000;
 4    server rustfs-node2:9000;
 5    server rustfs-node3:9000;
 6    server rustfs-node4:9000;
 7}
 8
 9server {
10    listen 80;
11    server_name s3.your-domain.com;
12
13    location / {
14        proxy_pass http://rustfs_cluster;
15        proxy_set_header Host $host;
16        proxy_set_header X-Real-IP $remote_addr;
17        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
18        proxy_set_header X-Forwarded-Proto $scheme;
19        client_max_body_size 0;
20        proxy_request_buffering off;
21    }
22}

集群扩缩容操作指南

扩容:添加新节点

RustFS 以**存储池(Pool)**为基本单位进行扩容,新节点加入后自动触发数据再平衡。

操作步骤:

  1. 在新节点安装相同版本的 RustFS,配置主机名和 hosts 解析
  2. 挂载数据盘(JBOD 模式)
  3. 所有节点更新启动命令中的主机名列表,从 {1...4} 扩展为 {1...5}
  4. 重启所有节点服务
1# 新启动命令示例(扩展到 5 节点)
2rustfs server --console-address ":9001" http://rustfs-node{1...5}/data/disk{1...5}

缩容:优雅移除节点

缩容需通过**退役(Decommission)**流程完成,确保数据安全迁移。

操作步骤:

  1. 通过 Admin API 标记待移除节点为退役状态
  2. 集群自动将数据迁移到其他健康节点
  3. 监控迁移进度直至完成
  4. 安全关闭退役节点的服务
  5. 更新剩余节点的启动命令,移除已下线节点
1# 发起退役(示例 API 调用)
2curl -X POST "http://<任意节点IP>:9000/v3/pools/decommission" \
3     -H "Authorization: Bearer <Admin Token>" \
4     -d '{"node": "http://rustfs-node4/data/rustfs"}'

关键配置注意事项

注意事项 说明
JBOD 优先 强烈建议不使用 RAID,让 RustFS 直接管理每块独立磁盘
磁盘配置一致性 所有节点的磁盘数量、容量、型号应保持一致,避免木桶效应
EC 策略不可变 集群创建后 EC 配置无法更改,需提前规划
最少节点数 高可用集群至少需要 4 个节点
版本一致性 集群中所有节点必须运行相同版本的 RustFS
存储池不可变 Pool 创建后其内部配置无法修改,扩容通过添加新 Pool 实现
数据备份 扩缩容操作前务必做好全量数据备份

性能与容量规划参考

EC 模式对比

EC 模式 容错能力 存储利用率 适用场景
EC:2 2 块盘故障 ~50% 开发测试
EC:4 4 块盘故障 ~75% 标准生产(官方推荐)
EC:8 8 块盘故障 ~80% 高可用要求

容量估算

以 4 节点 × 5 磁盘 = 20 块盘的集群为例,采用 EC:4 模式(12+4):

  • 可用容量 ≈ 总物理容量 × 75%
  • 可容忍任意 4 块磁盘同时故障

总结

RustFS 为构建高性能、高可用的 S3 兼容对象存储提供了极具竞争力的开源方案。其核心优势可归纳为:

  • 商业友好:Apache-2.0 协议,无使用风险
  • 性能卓越:基于 Rust 和 io_uring,资源占用低,IOPS 表现出色
  • 部署简单:单二进制文件,启动命令即可组建集群
  • 运维便捷:去中心化架构,滚动升级,动态扩缩容

对于正在寻找 MinIO 替代方案、或希望构建高性能 S3 存储的团队,RustFS 值得认真评估和尝试。


本文档基于 RustFS 官方文档及社区最佳实践整理,具体操作请以官方最新文档为准。