seaweedfs当master出现故障时,我如何重新启动一个新的master?

当 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。


第四步:验证恢复结果

  1. 访问新 Master UI: http://192.168.1.20:9333 应看到 B 和 C 在 Topology 中,且显示正确的 Volume 数量。
  2. 检查 volume 重建: curl http://192.168.1.20:9333/dir/status 输出应包含所有原有 volume ID。
  3. 测试读写: 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 节点完好)。


Comments

No comments yet. Why don’t you start the discussion?

发表回复