使用 RustFS 构建高性能 S3 兼容存储集群
☰
从零开始部署 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)**为基本单位进行扩容,新节点加入后自动触发数据再平衡。
操作步骤:
- 在新节点安装相同版本的 RustFS,配置主机名和 hosts 解析
- 挂载数据盘(JBOD 模式)
- 所有节点更新启动命令中的主机名列表,从
{1...4}扩展为{1...5} - 重启所有节点服务
1# 新启动命令示例(扩展到 5 节点)
2rustfs server --console-address ":9001" http://rustfs-node{1...5}/data/disk{1...5}
缩容:优雅移除节点
缩容需通过**退役(Decommission)**流程完成,确保数据安全迁移。
操作步骤:
- 通过 Admin API 标记待移除节点为退役状态
- 集群自动将数据迁移到其他健康节点
- 监控迁移进度直至完成
- 安全关闭退役节点的服务
- 更新剩余节点的启动命令,移除已下线节点
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 官方文档及社区最佳实践整理,具体操作请以官方最新文档为准。
