RustFS 上生产第一步:从单机到 4 节点多盘集群(MNMD)部署实操

单机装 RustFS 是十分钟的事:官方安装脚本一条命令跑完,数据落在 /data/rustfs0 一块盘上。但这条命令装出来的形态叫 SNSD(单节点单磁盘),文档里写明没有冗余,盘坏了数据只能靠备份捞。真正上生产,官方给的是另一套起步形态:MNMD(多节点多磁盘),至少 4 台服务器、每台至少 1 块盘,数据跨服务器跨盘打散。这篇按官方 Linux 部署文档把从单机到 4 节点集群的路径走一遍:三种形态怎么分、集群配置怎么写、12+4 的纠删码布局能丢什么、装完怎么验证。所有命令和配置项都对着官方文档写,文档没有的不猜。

三种部署形态,官方怎么分

安装文档按部署形态组织,首页给了一张对比表,照录如下:

模式 节点 磁盘 容错能力 典型用途
SNSD 1 1 无,需依赖备份 开发、测试和低密度非关键业务
SNMD 1 多块 节点内最多容忍 M 块校验盘故障 单台服务器上的中等规模非关键业务
MNMD 4+ 每节点多块 通过跨服务器纠删码实现磁盘级和节点级容错 生产工作负载

单机那条安装脚本装出来就是 SNSD:二进制进 /usr/local/bin/rustfs,systemd 服务自动注册并拉起,S3 API 监听 9000,控制台 9001。这个形态的定位是评估和开发,上生产别停留在这一档。SNMD 在一台机器上插多块盘,能扛盘级故障,但机器一宕整个存储就没了。MNMD 把数据分片摊到多台服务器的多块盘上,MNMD 页对它的定义是"生产工作负载的部署模式,可提供企业级性能、安全性和扩展能力"。

从单机切到集群,有一个前提要提前想清楚:单节点布局和分布式布局不兼容 ,已有单机里的数据不会原地变成集群,得按 MNMD 重新部署一套,再把老数据按桶拷过去。好在数据面是标准 S3 接口,用 rc(RustFS 官方命令行客户端,需在工作站单独安装)的对象拷贝命令逐桶迁移即可,这一点和换硬件搬家没什么区别。

集群起步:4 节点 × 4 盘的拓扑

安全启动一个分布式集群,MNMD 部署文档给出的最低要求是 4 台服务器、每台至少 1 块盘。文档示例拓扑取 4 节点 × 4 盘:请求先进负载均衡,再分发到四个节点;采用默认 12+4 纠删码布局时,每个对象拆成 12 个数据分片和 4 个校验分片,存储在不同服务器的不同磁盘上。文档给的两条安全边界原话是:任意单台服务器发生故障或维护都不会影响数据安全;最多 4 块磁盘损坏不会影响数据安全。

主机名要求相同格式且连续,DNS 或 /etc/hosts 二选一。用 hosts 的话,四个节点写同一份:

复制代码
192.168.1.1 node1
192.168.1.2 node2
192.168.1.3 node3
192.168.1.4 node4

除主机名外,装前还有两条硬性要求:所有节点使用相同的监听端口、保持时钟同步。分布式部署里四个节点的地位是对等的,任何一台都能处理完整的读写请求,负载均衡图里画在节点前面,分工是把流量摊到四台机器上,装集群本身不依赖它,上线接真实流量前配好即可。操作系统、防火墙、时间同步、磁盘格式化、服务用户、二进制下载和 systemd 单元这些通用前提条件,文档单独列了一节,要求在每个节点上完成。生产部署前还有一份安装前检查清单,硬件、网络、软件、安全四类逐项过,这一步别省;硬件清单对存储控制器的口径是禁用 RAID 功能、使用直通模式,这一点在规划盘位时就要定下来。

每个节点三件事:建目录、写配置、起服务

单机脚本把装二进制、注册服务、启动一次做完;集群部署的顺序是拆开的。按 MNMD 页的流程,先在每个节点上完成通用前提条件和服务设置,二进制文件和 systemd 单元就位,然后建目录、写配置,最后统一拉起服务。

第一步建存储和日志目录,四个节点相同:

bash 复制代码
sudo mkdir -p /data/rustfs{0..3} /var/log/rustfs /opt/tls
sudo chmod -R 750 /data/rustfs* /var/log/rustfs

/data/rustfs0 到 rustfs3 对应规划的四块盘的挂载点,/opt/tls 是给后续启用 TLS 留的目录,文档默认一并创建。

第二步写配置文件 /etc/default/rustfs。集群模式下这份文件在四个节点上内容完全一致:

ini 复制代码
RUSTFS_ACCESS_KEY=<your-access-key>
RUSTFS_SECRET_KEY=<your-secret-key>
RUSTFS_VOLUMES="http://node{1...4}:9000/data/rustfs{0...3}"
RUSTFS_ADDRESS=":9000"
RUSTFS_CONSOLE_ENABLE=true
RUSTFS_CONSOLE_ADDRESS=":9001"
RUSTFS_OBS_LOGGER_LEVEL=error
RUSTFS_OBS_LOG_DIRECTORY="/var/log/rustfs/"

核心是 RUSTFS_VOLUMES。大括号展开把所有节点和所有磁盘挂载点枚举进一个表达式:node{1...4} 展开出 node1 到 node4 四台主机,/data/rustfs{0...3} 展开出每台机器上的四个挂载点,合起来是 4 节点 × 4 盘共 16 个存储端点。文档明确要求所有节点上的访问密钥、秘密密钥和 RUSTFS_VOLUMES 值必须完全相同,主机名要与 DNS 或 hosts 配置一致,差一处集群就组不起来。

凭证有两个细节容易踩。其一,access key 只用大写字母和数字,openssl 输出的 Base64 别原样填进 RUSTFS_ACCESS_KEY,Base64 可能带斜杠,与 AWS Signature Version 4 的凭证作用域分隔符冲突,这是快速入门页专门提醒过的。其二,别保留默认凭证:不设置这两个变量时,服务回退到内置的 rustfsadmin/rustfsadmin,文档口径是这个值只能用于一次性本地测试,接入网络前必须改掉。

第三步起服务,四台机器各自执行:

bash 复制代码
sudo systemctl enable --now rustfs

12+4 能丢几块盘,按盘和按节点各算一遍

RustFS 分布式底层用 Reed-Solomon 纠删码,这是一种把对象切成分片、再算出若干校验分片,丢掉部分分片仍能还原原数据的编码方式。按 EC 配置文档的记法,一个纠删集有 N 块盘、M 个校验分片,则数据分片 N-M 个,最多可重建 M 个不可用分片。默认 12+4 就是 16 块盘取 EC:4:12 份数据加 4 份校验,容量效率 75%,最多容忍 4 个分片不可用。MNMD 页"最多 4 块磁盘损坏不会影响数据安全"的出处就在这里。

节点级容错是另一笔账。很多人看到 EC:4 的第一反应是"那能同时坏四台服务器",这笔账不能这么算:EC 文档专门提醒:不要假定 EC:4 始终可以容忍四个完整节点故障,一个节点可能托管同一纠删集中的多个驱动器。16 块盘分给 4 个节点时,丢一台机器等于同一纠删集同时少了 4 个分片,刚好压在容忍边界上;节点分布方式、纠删集宽度变了,结论都会跟着变。起步拓扑照文档示例来是安全的,自己改拓扑时这笔账要重新对一遍。

校验数默认不用手设。RustFS 按每个纠删集的盘数自动确定 STANDARD 校验:8 到 16 块盘自动取 EC:4,6 到 7 块取 EC:3,以此类推。文档建议不设置 RUSTFS_STORAGE_CLASS_STANDARD,除非有明确且经过验证的持久性要求。要显式固定的话有三条规则要同时满足:校验数不得超过纠删集盘数的一半;STANDARD 校验数须大于等于 REDUCED_REDUNDANCY 的校验数;配置必须适用于包括最窄存储池在内的所有存储池。无效值会在启动期直接报错,不会静默降低校验数。还有一个 RUSTFS_ERASURE_SET_DRIVE_COUNT 能固定纠删集宽度(多驱动器纠删集宽度范围为 2 到 16),但该值必须能对称划分存储池拓扑,文档原话是"除非已验证完整存储池布局,否则请勿设置此变量",起步阶段不用碰它。

装完先验四项

四个节点服务都起来后,按文档顺序过一遍:

bash 复制代码
systemctl status rustfs               # 服务应为 active (running)
netstat -ntpl                         # 9000/9001 是否在监听
tail -f /var/log/rustfs/rustfs*.log   # 日志有无报错

netstat 属于 net-tools 包,RHEL 9、Ubuntu 22.04 起的新版系统默认不再预装,报 command not found 就换 ss -ntpl,看到的是同一份内核监听表。

然后浏览器打开任一节点的 9001 端口(或负载均衡地址),用配置文件里那对 access key 和 secret key 登录控制台。这一步顺带验证了凭证改没改对:还在用默认的 rustfsadmin 能登进去,说明有节点的配置没生效,回头查。功能验证用 rc 命令行客户端,和单机快速入门里同一套流程,区别只在地址指向集群:

bash 复制代码
rc alias set rustfs http://<node-ip>:9000 <your-access-key> <your-secret-key>
rc bucket create rustfs/my-bucket
rc object copy /path/to/hello.txt rustfs/my-bucket/hello.txt
rc object list rustfs/my-bucket

建桶、写入、列读都通,读写链路就算完整走过了。集群布局再看一眼:控制台的 Status 页面,或者 rc admin info cluster,能确认后端布局、纠删码校验数、驱动器可用性和存储池成员关系。四个节点里只要有一个把 RUSTFS_VOLUMES 写错,这一步的输出就能看出来。

冒烟验证还有两个细节值得留心。一是从任意一个节点跑都行,四个节点服务的是同一套桶空间,在 node1 写入的对象,从 node2 的客户端读应该拿到同一个内容,这本身就是分布式模式区别于单机的体验;如果你的客户端固定连某个节点,抽两个别的节点各跑一次读写,能提前暴露 hosts 解析或防火墙的问题。二是别名凭证:rc alias set 用的 access key 和 secret key,必须和各节点 /etc/default/rustfs 里写的完全一致,官方文档特别提醒所有节点的访问密钥、秘密密钥和 RUSTFS_VOLUMES 值必须完全相同,任何一处手滑,冒烟阶段就会以连不上或 403 的形式表现出来。凭证字段也有讲究,官方快速入门页说明 access key 只能含大写字母和数字,原因是 Base64 里的 / 会和 AWS SigV4 的分隔符冲突;文档同时警告别继续用默认的 rustfsadmin/rustfsadmin 对外服务。

离生产还差的三步,扩容是其中之一

MNMD 页结尾点了三个后续动作:集群前部署负载均衡(有 Nginx 集成指南)、为生产流量启用 TLS(有专门的 TLS 配置章节)、扩容前先看存储池扩容文档。前两件按官方章节跟即可。

扩容机制值得提前知道:RustFS 的扩容走存储池,往 RUSTFS_VOLUMES 里追加一段新的存储池表达式,全集群按相同拓扑重启,新写入进新池,旧数据不动,细节在存储池扩容文档。起步阶段把 RUSTFS_VOLUMES 写规范,就是给以后扩容铺路。升级也有官方路径:多节点集群一次替换一个节点,等它报告就绪再动下一台,按部署方式分二进制、容器、Kubernetes 三套流程,见升级文档。

收尾把动作排成一列:四台机器 hosts 与时钟同步对齐;建 /data/rustfs{0...3}、/var/log/rustfs 等目录;/etc/default/rustfs 四节点一字不差,凭证改掉默认值;systemctl enable --now rustfs 拉起;rc 建桶读写一轮,rc admin info cluster 看布局。走完这五步,一套 4 节点的 MNMD 集群就立住了。

RustFS 用 Rust 实现、按 Apache 2.0 许可证发布。部署相关的三份官方文档入口:多节点多磁盘(MNMD)、EC 配置、Linux 快速入门,源码在 GitHub 仓库。

相关推荐
旋生万物2 小时前
螺旋数不是玄学:Python 实现广义复数与等角螺线
开发语言·人工智能·python·云原生·aigc·软件工程·后端开发
openEuler社区3 小时前
2026年度openEuler社区贡献之星评选启动!
开源·openeuler
小白鸽i3 小时前
【Linux】已安装的软件如何重新构建deb安装包?
linux·运维·服务器
flytalei3 小时前
Kubernetes健康检查探针
云原生·容器·kubernetes
考虑考虑3 小时前
JFROG手动上传包
运维·后端·自动化运维
qq_401700413 小时前
CAN 开源库大全(嵌入式/上位机,适配STM32、Linux、Qt,附带Github地址)
linux·stm32·开源
Initialize-le3 小时前
备份显示成功、恢复却失败?四步验证法
运维
GeofferyLibrom3 小时前
PS5 自动化挂机指南:基于 Mac + Chiaki-ng 视觉识别——龙信2自动挂机实战
运维·macos·自动化