本来打算用minio 作为文件存储,但是发现2025年开始minio 逐渐开始减少对社区版本的支持,同时砍掉很多功能,而且2026年3月开始不再发布编译好后的社区版本,故只能转战,对比了几款常见的开源S3应用:
| 项目 | 开源情况 | 备注 |
| MinIO | 商业公司完全掌控,商业化导向强 | 成熟,但逐渐放弃社区用户。 |
| SeaweedFS | 独立开源社区,提供商业支持与 Enterprise 版 | 小文件性能远超 MinIO,适合规模化拓展 |
| Ceph | Red Hat、IBM、Canonical 等多巨头共同维护 | 企业级应用,维护复杂,功能全面 |
| Garage | 欧洲 NGI 基金资助,偏向极客与自建开发者 | 在低带宽、非对称设备间实现稳定同步的现代对象存储 |
| RustFS | 独立开源项目 | Minio极简替换,使用rust重写,轻量级轻载业务部署。 |
所以本着选新不选旧的逻辑;Garage没有校验方案,现在最贵的就是存储,显然选择是不经济的;而SeaweedFS和Ceph维护又相对复杂,虽然RustFS还不够成熟,但是社区活跃度足够,而且大部分功能已经稳定,所以暂定。
0.环境说明
RustFS 是基于 Rust 编写的高性能、内存安全、完全兼容 S3 协议的开源分布式对象存储系统。
配置 EC 4+2(纠删码 Reed-Solomon:4个数据块 + 2个校验块)代表集群将数据切分为 8份数据与4 份冗余校验,允许任意2 个节点同时故障而数据不丢失,有效磁盘空间利用率为 66.7%。
这个模式纠结了比较久,最早是想使用EC6:2,这样磁盘利用率有75%,后面因为考虑到是部署于四台不同的机器上,为了保证稳定性,已经方便迁移(切分成小块存储,但是同时增加了系统空间的浪费),使用了EC 8:4来实践。实际实践过程中因为节点过多,导致故障排查困难,最后还是改用了EC4:2。
为了保持内网时间一致性,同时在内网建立统一对时服务器。
实体物理机是:三台PVE机器(D4服务器+D3服务器+mini主机)+一台WINSVR(mini主机)混合架构。
宿主机(虚拟机)配置如下:
| CPU | 2Cores |
| RAM | 4G |
| 硬盘 | 208 G (LVM) |
| 操作系统 | DEBIAN 12.14 |
| 开放端口(rustfs节点) | API: 9000(TCP)Console: 9001(TCP) |
| 开放端口(对时节点) |
使用LVM配置磁盘分区,各LVS卷分配空间如下:
| 目录 | 存储空间 | 作用 |
| /var | 10G | 日志 |
| /data | 180G | 主要文件存储 |
| / | 10G | 根目录 |
| swap | 4G | 虚拟内存 |
| free | 5G | 必要时分配给其它不足分区 |
集群架构详情:
| 配置项 | 值 / 说明 |
| 节点总数 (N) | 4个存储节点 (rustfs-node1 ~ rustfs-node6)+1对时节点 |
| 纠删码模式 (K+M) | EC 4+2(4数据分片 + 2 校验分片) |
| 单个 Erasure Set 大小 | RUSTFS_ERASURE_SET_DRIVE_COUNT=6 |
| 标准冗余校验数 | RUSTFS_STORAGE_CLASS_STANDARD=EC:2 |
| 允许最大故障节点数 | 2 个节点(超过 2 个节点同时损坏会导致写失败/数据丢失) |
| 可用空间利用率 | 66.7% (8/12) |
| 端口定义 | S3 API: 9000 | Console 控制台: 9001 |
1.规划
1️⃣IP地址规划
先规划出12个IP地址以实现12节点 RUFUS(这里我分配的节点地址为:192.168.8.1~192.168.8.13)
| 节点名称 | IP地址 | 备注 |
| 对时节点 | 192.168.8.1 | |
| FsNode1~12 | 192.168.8.2~192.168.8.7 | RustFs节点1~6 |
2️⃣对时服务配置部署(主机宿主机)
安装服务
apt update && sudo apt install -y chrony
修改对时配置文件
nano /etc/chrony/chrony.conf
在文件尾部添加如下内容:
# 1. 如果对时服务器能连接上层公网/上游 NTP,可保留上游 pool(如果完全纯内网离线,可注释掉这几行)
pool ntp.aliyun.com iburst
pool cn.pool.ntp.org iburst
# 2. 允许 192.168.8.1/24 内网网段的所有节点向本服务器同步时间
allow 192.168.8.1/24
# 3. 关键配置:当上游 NTP 离线/断网时,将本机作为权威时间源(Stratum 10),确保内网节点依然能平滑对时
local stratum 10
# 4. 指定绑定的内网 IP,防止响应未授权网卡的 NTP 请求
bindaddress 192.168.8.1
启动并设置开机自启
# 启动服务
systemctl enable --now chrony # RHEL/CentOS 叫 chronyd,Ubuntu 叫 chrony
systemctl restart chrony 2>/dev/null || sudo systemctl restart chronyd
服务端测试
chronyc tracking
3️⃣对时客户端配置
安装服务
apt update && sudo apt install -y chrony
修改对时配置文件
nano /etc/chrony.conf
客户端配置如下,在文件尾部添加如下内容:
# 清空或注释其他公网 NTP 服务器,强行绑定内网对时源
server 192.168.8.1 iburst maxpoll 6
# 允许快速步进调整(在启动时如果时差过大直接强制纠正,而不是缓慢微调)
makestep 1.0 3
# 3. 记录时间漂移
driftfile /var/lib/chrony/drift
# 禁用 IPv6 源干扰(可选,若不需要 IPv6 对时)
ipversion 4
# 禁用从其他网卡接收 NTP 广播
bindcmdaddress 127.0.0.1
检查对时服务是否运行成功:
#重启服务
systemctl restart chrony
# 强制客户端立即发起多轮连续探测
chronyc reselect
chronyc refresh
# 稍等 5 秒后查看状态
chronyc sources -v
若收到以下指令说明对时服务运行成功
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* 192.168.8.1 10 6 377 2 +115us[ +115us] +/- 200us
2.部署rustfs
一键安装docker
curl -fsSL https://get.docker.com
#或 curl -fsSL https://get.docker.com | bash -s arg --mirror Aliyun
部署docker compose
mkdir -p /data/rustfs #数据存储目录
mkdir -p /usr/docker/rustfs && cd /usr/docker/rustfs
nano docker-compose.yml
写入如下内容:
#Node1配置,Node2~Node6 只需要修改 备注有%x.wolfmark.org%的内容
services:
FsNode1: #每个节点修改,根据序号%x.wolfmark.org%
image: rustfs/rustfs:1.0.0-beta.12 #当前最新稳定版,建议定版
container_name: FsNode1 #FsNode1~6 %x.wolfmark.org%
restart: always
network_mode: host # 使用 host 网络模式,容器将共享宿主机网络栈
# -------------------------------------------------------------
# 1. 命令行直接启动参数 (Command)
# -------------------------------------------------------------
command:
- "--address"
- "0.0.0.0:18701"
- "--console-address" # 不需要控制台的节点可以去除这两行 %x.wolfmark.org%
- "0.0.0.0:18700" # 不需要控制台的节点可以去除这两行 %x.wolfmark.org%
- "--console-enable"
- "--access-key"
- "rustfsadmin"
- "--secret-key"
- "rustfsadmin123" # 建议修改为强密码
- "http://192.168.8.2:9000/data"
- "http://192.168.8.3:9000/data"
- "http://192.168.8.4:9000/data"
- "http://192.168.8.5:9000/data"
- "http://192.168.8.6:9000/data"
- "http://192.168.8.7:9000/data"
# -------------------------------------------------------------
# 2. 环境变量(用于内部集群拓扑、双网卡路由与 EC 8+4 策略)
# -------------------------------------------------------------
environment:
# 外网重定向与对外提供服务重定向入口
- RUSTFS_ADDRESS=192.168.8.2:9000# API 端口,根据实际IP修改 %x.wolfmark.org%
- RUSTFS_CONSOLE_ADDRESS=192.168.8.2:9001# 控制台端口,根据实际IP修改 %x.wolfmark.org%
# 纠删码矩阵配置 (EC 8+4)
- RUSTFS_ERASURE_SET_DRIVE_COUNT=6 # 4个驱动节点为一个EC组
- RUSTFS_STORAGE_CLASS_STANDARD=EC:2 # 2个冗余校验块
# -------------------------------------------------------------
# 3. 硬件资源限制 (Resource Limits)
# -------------------------------------------------------------
deploy:
resources:
limits:
cpus: '2.0'
memory: 3.5G
reservations:
cpus: '0.5' # 保证容器至少能分配到 0.5 个 CPU 核心
memory: 1.0G # 保证容器至少预留 1.0G 内存
# -------------------------------------------------------------
# 4. 挂载路径 (Mount Path)
# -------------------------------------------------------------
volumes:
- /data/rustfs:/data
- /etc/localtime:/etc/localtime:ro
entrypoint: ["/usr/bin/rustfs", "server"]
编辑完成后按Ctrl+O保存 Ctrl+X 退出
然后依次从节点1到节点6运行
docker compose up -d
3.验证及挂载
登录节点1,检查日志
cd /usr/docker/rustfs
docker compose logs -f
无报错,且显示如下内容:
fsNode365G-01 | ping_resp:body(flatbuffer): Ok(PingBody { payload: Some([104, 101, 108, 108, 111, 44, 32, 99, 97, 108, 108, 101, 114]) })




















近期评论