docker compose rustfs 6节点实战 EC(4:2)

本来打算用minio 作为文件存储,但是发现2025年开始minio 逐渐开始减少对社区版本的支持,同时砍掉很多功能,而且2026年3月开始不再发布编译好后的社区版本,故只能转战,对比了几款常见的开源S3应用:

项目开源情况备注
MinIO商业公司完全掌控,商业化导向强成熟,但逐渐放弃社区用户。
SeaweedFS独立开源社区,提供商业支持与 Enterprise 版小文件性能远超 MinIO,适合规模化拓展
CephRed 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主机)混合架构。

宿主机(虚拟机)配置如下:

CPU2Cores
RAM4G
硬盘208 G (LVM)
操作系统DEBIAN 12.14
开放端口(rustfs节点)API: 9000(TCP)
Console: 9001(TCP)
开放端口(对时节点)

使用LVM配置磁盘分区,各LVS卷分配空间如下:

目录存储空间作用
/var10G日志
/data180G主要文件存储
/10G根目录
swap4G虚拟内存
free5G必要时分配给其它不足分区

集群架构详情:

配置项值 / 说明
节点总数 (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~12192.168.8.2~192.168.8.7RustFs节点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]) })

发表回复

Your email address will not be published.