)
你docker run -p 9000:9000 rustfs/rustfs:latest server /data起了一个 RustFS用mc建了桶、传了几百个对象一切正常。直到某天这台机器磁盘满了、被重启、或者进程被 OOM kill——你会发现所有对象都在这台机器的盘上它一挂读写全断。单机跑通只证明能存不等于高可用。从能存走到挂一台还能用靠的是 RustFS 的分布式模式把多台机器的盘组成一个存储池对象按**纠删码Erasure CodingEC**跨节点分片冗余。下面这份 Compose 是官方真实可用的配置我把它拆开讲清楚也把几个容易踩的坑和边界讲明白。1. 单节点能跑但生产差这三样单节点的数据只落在本地盘没有跨机器冗余。它带来的三个硬伤正是生产环境不能接受的进程挂 服务断只有一个实例重启期间所有 S3 请求失败。盘坏 数据丢除非后端块存储本身有 RAID 或云快照兜底否则单盘故障直接丢数据。不可观测不知道它活着没、盘快满没、冗余齐不齐。RustFS 的应对是把多个节点组进同一个集群用纠删码把数据跨节点分片。但这里要老老实实说一句边界官方功能表与社区讨论里Distributed Mode 目前标的是 Under Testing。意思是多节点能力已经实现、也有人在用下面这份配置就改编自官方仓库的docker-compose.cluster.yaml但项目方还没把它标成 GA。所以本文是一份能跑、可验证的部署清单不是无脑上生产的保证——第 5 节会讲上线前必须补的几件事。2. 这份三节点 Compose 长什么样三台节点各自跑一个 RustFS 容器启动时把全部节点的数据端点写进同一个RUSTFS_VOLUMESRustFS 据此自动按纠删码跨节点组成存储池。完整文件直接复制就能起把rustfs/rustfs:1.0.0-rc.2换成你验证过的标签version:3.8x-rustfs-common:rustfs-commonimage:rustfs/rustfs:1.0.0-rc.2user:10001:10001environment:RUSTFS_ADDRESS:0.0.0.0:9000RUSTFS_CONSOLE_ENABLE:trueRUSTFS_CONSOLE_ADDRESS:0.0.0.0:9001RUSTFS_ACCESS_KEY:${RUSTFS_ACCESS_KEY:-rustfsadmin}RUSTFS_SECRET_KEY:${RUSTFS_SECRET_KEY:-rustfsadmin}# 分布式关键把所有节点的数据端点都列进来RustFS 自动按纠删码跨节点冗余RUSTFS_VOLUMES:http://node1:9000/data,http://node2:9000/data,http://node3:9000/datahealthcheck:test:[CMD,curl,-f,http://localhost:9000/health]interval:15stimeout:5sretries:5start_period:30sservices:node1::*rustfs-commonhostname:node1container_name:rustfs-node1ports:-9000:9000-9001:9001volumes:-./data/node1:/data-./logs/node1:/logsnode2::*rustfs-commonhostname:node2container_name:rustfs-node2ports:-9100:9000-9101:9001volumes:-./data/node2:/data-./logs/node2:/logsnode3::*rustfs-commonhostname:node3container_name:rustfs-node3ports:-9200:9000-9201:9001volumes:-./data/node3:/data-./logs/node3:/logs几个地方值得停下来看镜像固定到1.0.0-rc.2不用latest。latest会随每次发布漂移哪天行为变了你都没法回滚。生产环境必须钉死具体标签升级前先看 release notes、先在测试集群验证。user: 10001:10001RustFS 容器内以 uid/gid 10001 的非 root 用户运行绑定挂载的目录必须对这个用户可写否则容器起得来但写不进数据。官方docker-compose-simple.yml甚至专门起了一个volume-permission-helper容器来做chown -R 10001:10001。这是真实踩过的坑下面第 5 节还会提。端口错开node1 用 9000/9001node2/3 映射到 9100/9200避免同一台宿主机上端口冲突。如果你每台机器只跑一个节点可以都映射 9000。healthcheck打/healthRustFS 在 9000 端口暴露了/health探活端点官方 Helm chart 的存活/就绪探针也是它compose 直接用配合docker compose ps就能看健康状态。没有RUSTFS_CLUSTER_MODE之类的开关分布式不是靠某个开启集群的变量而是靠RUSTFS_VOLUMES里出现多个节点端点这件事本身来触发的。这点下面第 4 节专门讲免得你照着网上不存在的变量去配。3. 环境变量逐条说含一个常见误区变量作用本清单取值RUSTFS_ADDRESS容器内监听地址:端口0.0.0.0:9000RUSTFS_CONSOLE_ENABLE/RUSTFS_CONSOLE_ADDRESS控制台开关与地址true/0.0.0.0:9001RUSTFS_ACCESS_KEY/RUSTFS_SECRET_KEY访问密钥务必自定义环境变量注入不写死默认值RUSTFS_VOLUMES集群全部数据端点逗号分隔也支持http://node{0...3}:9000/data{0...3}展开写法三个节点的/dataRUSTFS_OBS_LOGGER_LEVEL/RUSTFS_OBS_LOG_DIRECTORY日志级别与目录info//app/logsRUSTFS_UNSAFE_BYPASS_DISK_CHECK是否跳过磁盘拓扑严格检查仅本地测试生产保持默认falsefalse这套变量来自官方仓库的docker-compose-simple.yml与docker-compose.cluster.yaml可直接套用。下面是这份三节点集群的拓扑客户端直接打任意节点的 9000 端口节点之间按纠删码跨节点分片冗余4. 跑起来并实测冗余边界先建好宿主机目录并给 10001 授权再启动mkdir-pdata/node1 data/node2 data/node3 logs/node1 logs/node2 logs/node3chown-R10001:10001 data logsdockercompose up-ddockercomposeps# 三个节点 STATUS 应变为 healthycurl-fhttp://localhost:9000/healthechonode1 alive用mc配端点、建桶、传文件mcaliassetrustfs http://localhost:9000 rustfsadmin rustfsadminmcmb rustfs/testbucketmccp./bigfile.tar rustfs/testbucket/mclsrustfs/testbucket接下来是关键的一步——亲手停一台看纠删码到底扛不扛得住dockerstop rustfs-node2mclsrustfs/testbucket# 仍能列出mccatrustfs/testbucket/bigfile.tar/dev/null# 仍能读证明数据跨节点冗余生效dockerstart rustfs-node2我在这台机器上实测就是这个表现停一台读路径不受影响。具体能容忍几台同时宕机取决于纠删码的 data/parity 配比由节点数与每节点盘数决定在 EC 容错范围内的节点宕机集群继续服务这正是分布式相对单机的价值。你第一次部署也建议走一遍比看文档直观得多。一个重要的迁移边界单节点模式SNSD不使用纠删码其数据布局与分布式模式不兼容。你不能往一个已有的单节点部署里直接加节点——必须先备份现有数据再用全部节点 fresh 起一个分布式集群最后用mc mirror把数据导回去社区讨论 #2248 也是这么建议的。5. 踩坑与上线前要补的事默认账号必须改镜像默认rustfsadmin / rustfsadmin第一次起来就用环境变量传自己的RUSTFS_ACCESS_KEY/RUSTFS_SECRET_KEY别留默认值。目录权限再强调一次10001:10001这个坑前面提了。如果docker compose up后写不进数据先ls -ld data/node1看属主不是 10001 就chown一下。healthcheck 的 curl 依赖示例里用curl探活前提是镜像里带 curl。如果你用的精简镜像没有把 healthcheck 换成 TCP 探活或者挂自己的探活脚本。版本固定rc 阶段迭代快钉死标签、升级前看 release notes、先在测试集群验证再放量。磁盘拓扑检查生产保持RUSTFS_UNSAFE_BYPASS_DISK_CHECKfalse让 RustFS 做严格的磁盘拓扑校验避免把不合规的盘纳进集群。关于 Under Testing这个边界生产前我建议补四件事① 在小集群跑通读写 故障切换就是第 4 节那套② 配监控告警把/health探活、metrics 和磁盘水位都接进 Prometheus/Grafana下一篇可以专门写③ 定备份用 rclone 定时同步到另一套存储或用 Bucket Replication 做跨集群镜像④ 关注 GA 后把测试中状态去掉再全面上生产。6. 总结与下一步从一条docker run到一份三节点 Compose核心就四件事固定版本标签、把节点端点写进RUSTFS_VOLUMES触发纠删码、把/health探活接上、把 10001 的目录权限搞对。分布式能力现在是测试中状态但配置是真实的、冗余是能实测验证的按上面这套走你已经有一个可读高可用、能容节点故障的 RustFS 集群——别忘了它的复制靠的是纠删码和跨集群时Bucket Replication而不是某个不存在的RUSTFS_REPLICATION_FACTOR。下一步可以做这三件按性价比排先把默认账号换掉把 metrics 暴露出来——这是上生产前最低成本的两步。用 rclone 或 Bucket Replication 做跨集群备份验证一套挂了数据还能从别处拉回来。等 GA 后再把单节点验证过的负载逐步迁进来别一上来就全量。参考与引用RustFS GitHub 仓库 —— 官方docker run示例、默认账号rustfsadmin/rustfsadmin、容器以 UID 10001 非 root 运行、Console 端口 9001。RUSTFS_VOLUMES列出全部节点端点即触发分布式本文三节点配置改编自此。RustFS Helm Chart README —— K8s 分布式部署、/health探活探针、podSecurityContext中10001运行用户、默认rustfsadmin/rustfsadmin。Discussions #2248单节点扩多节点与换节点 —— 分布式仍 Under Testing、单节点与分布式数据布局不兼容、节点在 EC 容错范围内宕机集群照跑、换盘后 auto-healing 重建。Issue #1842为什么没有副本模式环境变量 —— 维护者确认RUSTFS_STORAGE_MODE/RUSTFS_REPLICATION_FACTOR等变量不存在RustFS 用纠删码跨集群镜像靠 Bucket Replication。RustFS 官方文档Docker 安装 —— Docker 部署、docker run、S3 端口 9000 / Console 9001 与/health探活说明。以下是深入学习 RustFS 的推荐资源RustFS官方文档 RustFS 官方文档- 提供架构、安装指南和 API 参考。GitHub 仓库 GitHub 仓库 - 获取源代码、提交问题或贡献代码。社区支持 GitHub Discussions- 与开发者交流经验和解决方案。意见反馈GitHub Issues