当 SeaweedFS 的 Master 节点(A)发生故障且无法恢复 时,你可以快速启动一个新的 Master 来接管集群。关键在于:Master 本身不存储文件数据,只管理元数据(Volume 分布信息),而这些元数据可以从 Volume 节点自动重建。
好消息:SeaweedFS 的设计使得 Master 是无状态或弱状态的,无需备份即可恢复!
恢复目标
- 启动新 Master(例如在机器 D 上)
- 自动发现 B 和 C 上的 Volume
- 恢复完整的拓扑结构(Topology)
- 客户端可继续读写(无缝或短暂中断)
正确恢复步骤
第一步:准备新 Master 机器(D)
- 确保 D 能访问 所有 Volume 节点(B 和 C)的 gRPC 端口(默认 18080)
- 安装相同版本的
weed二进制
第二步:启动新 Master(关键:使用相同的 -mdir 或全新目录)
情况 A:你有原 Master 的 mdir 备份(推荐)
# 将原 A 的 /data/seaweedfs/master 目录复制到 D
scp -r user@old_A:/data/seaweedfs/master /data/seaweedfs/
# 在 D 上启动(IP 可不同!)
weed master \
-ip=192.168.1.20 \ # 新 IP
-port=9333 \
-mdir=/data/seaweedfs/master \ # 使用原数据目录
-defaultReplication=001
优势:立即恢复原有拓扑,Volume ID 映射完整。
情况 B:没有 mdir 备份(最常见)
# 创建新目录
mkdir -p /data/seaweedfs/master_new
# 启动新 Master(会自动从 Volume 节点重建拓扑)
weed master \
-ip=192.168.1.20 \
-port=9333 \
-mdir=/data/seaweedfs/master_new \
-defaultReplication=001 \
-volumePreload=true # ← 关键参数!强制启动时扫描所有 Volume
🔑
-volumePreload=true:
启动时主动连接所有已知 Volume 节点(通过-peers或 DNS 发现),拉取其 volume 信息并重建拓扑。
第三步:告知 Volume 节点新 Master 地址
方法 1:重启 Volume 节点(推荐,简单可靠)
修改 B 和 C 的启动命令,将 -mserver 指向新 Master:
# 在 B 上
weed volume \
-ip=192.168.1.11 \
-port=8080 \
-mserver=192.168.1.20:9333 \ # ← 新 Master D
-dir=/data/seaweedfs/volume \
-max=0 \
-publicIp=fs.example.com
💡 重启后,Volume 会自动向新 Master 注册,并上报自己持有的所有 volume。
方法 2:不重启 Volume(高级)
SeaweedFS Volume 会定期尝试重连 Master。如果你:
- 保留原 Master 的 IP(通过 VIP/浮动 IP/DNS 切换)
- 或 Volume 配置了多个 Master(但 SeaweedFS 不支持多 Master)
❌ 注意:SeaweedFS 不支持多 Master 主从或 Raft 集群(官方明确说明),所以必须通过外部手段切换 IP。
第四步:验证恢复结果
- 访问新 Master UI:
http://192.168.1.20:9333应看到 B 和 C 在 Topology 中,且显示正确的 Volume 数量。 - 检查 volume 重建:
curl http://192.168.1.20:9333/dir/status输出应包含所有原有 volume ID。 - 测试读写:
curl -F "file=@test.jpg" http://192.168.1.20:9333/assign
重要注意事项
1. 客户端需要更新 Master 地址
- 所有客户端(上传/下载)需将
assign请求指向 新 Master IP - 建议通过 DNS 域名(如
master.fs.example.com)访问 Master,故障时只需改 DNS 记录
2. Filer 用户额外操作
如果你用了 Filer:
- 需重新启动 Filer,指向新 Master
- Filer 的元数据(目录结构)不会丢失(因存储在独立数据库,如 SQLite/BoltDB)
3. Volume 必须在线
- 恢复期间,B 和 C 必须正常运行!
- 如果 Volume 也离线,其上的数据将无法被 Master 发现 → 逻辑上“丢失”(但文件仍在磁盘)
高可用建议(预防未来故障)
| 方案 | 说明 |
|---|---|
| DNS + 健康检查 | 用域名访问 Master,故障时切 IP(最快 60 秒生效) |
| Keepalived + VIP | 在内网部署虚拟 IP,Master 故障时漂移到备用机 |
定期备份 mdir | 虽非必需,但可加速恢复(rsync 每小时同步一次) |
| 监控告警 | 对 Master 进程、9333 端口做存活检测 |
📌 官方立场:
“Master is designed to be restarted quickly. It does not hold critical data that can not be recovered.”
—— SeaweedFS Wiki
总结:Master 故障恢复流程
| 步骤 | 操作 |
|---|---|
| 1 | 准备新机器 D,安装 weed |
| 2 | 启动新 Master(加 -volumePreload=true) |
| 3 | 重启所有 Volume 节点,指向新 Master |
| 4 | 更新客户端配置(或 DNS) |
| 5 | 验证拓扑和读写功能 |
整个过程可在 5 分钟内完成,且不会丢失任何文件数据(只要 Volume 节点完好)。