Skip to content

运维操作手册(Runbook) ​

出问题时谁在多少步内做什么 —— 启停、3 节点拓扑、只读/隔离处置、备份与恢复。

事实来源: RB-1 的触发表是冻结设计,不是实现状态。RB-2 / RB-3 走同一模板,随各自实现落地补全。

条目怎么读 ​

每条按顺序回答五个问题:什么告警了 → 对读者意味着什么 → broker 已经自动做了什么 → 我该敲什么 → 怎么验证恢复了。答不出最后一条的条目,就是没写完。

RB-1:quorum 降级 → 只读 ​

告警来源: mortarmq_quorum_state 离开 0(healthy),或 mortarmq_leader_epoch 停止推进。影响面: 生产者收到错误;消费者可见上界(commit_seq)冻结 —— 但永不回退。

触发表 ​

level条件totalin-syncmin ISR生产者响应消费者可见性客户端错误运维动作
2leader + 至少 1 个 follower 在 hard gap 内 flush322OK durability=quorumcommit_seqnone正常
1quorum 可达成但有 follower 落后 > soft gap322OK durability=quorum + FOLLOWER_LAG 警告commit_seqFOLLOWER_LAG启动追赶并观察
0(soft timeout)quorum ack 在超时内未完成322ERR READ_ONLY_DEGRADEDcommit_seq 冻结READ_ONLY_DEGRADED查 follower 磁盘 / 网络
0(no follower)hard gap 内没有任何 follower flush312ERR READ_ONLY_DEGRADEDcommit_seq 冻结READ_ONLY_DEGRADED先修 follower,再恢复写入
−1(explicit)显式降级模式(未来旋钮 min_in_sync;今天配置面无此键)311OK durability=min_isr实现必须定义;默认不实现none显式承担 unclean 风险
−2(conflict)分歧出现在 commit_seq 及以下3n/a2ERR QUARANTINED分区被隔离DIVERGENT_COMMITTED从审计日志人工对账

spec 锚点(REQ-REP-004): 仅 1/3 存活场景写路径返回 0x6002 READ_ONLY_DEGRADED,上行欠客户端的就是这个码;0x6003 IN_SYNC_REPLICAS_NOT_ENOUGH 是分类内更具体的变体(点名缺失的副本)。时序值(冻结设计,replication lease-timing 表):quorum_ack_timeout_ms = 50 ms(level 0 soft-timeout 截止)、leader_heartbeat_ms = 500 ms、prepare_timeout_ms = 1000 ms、follower_lease_ms = 2000 ms。

broker 已经自动做了什么 ​

level 0 及以上不需要人工介入来保护数据 —— broker 选择拒绝写入,而不是承认一件它提交不了的事。这正是设计意图:失败模式是一次看得见的错误,不是静默丢数据。

唯一需要人在恢复正常运作之前出手的是 0(no follower):min ISR 是 2 而只有 1 个副本在同步中,follower 修好之前写入一律被拒。

人工步骤 ​

  1. 确认你在哪一级 —— mortarmq leader get 打印 leader_id、leader_epoch、quorum_state。
  2. 若是 level 0(soft timeout):查 follower 的磁盘与网络 —— fsync 延迟是常见元凶,follower 上的 mortarmq_partition_last_seq 会显示它卡住。
  3. 若是 level 0(no follower):先修 follower,等追赶完成,再恢复写入。
  4. 若是 level −2:什么都别重启。从审计日志人工对账;这里任何「自动修复」都是错的。

验证恢复 ​

  • mortarmq leader get → quorum_state 回到 0,leader_epoch 不变或恰好因一次选举递增。
  • mortarmq_broker_uptime_seconds 仍在增长(进程从未重启)。
  • /metrics 上 mortarmq_quorum_state gauge = 0。

升级路径 ​

只有 level −2 需要人工介入 metadata log。其他任何在一个追赶窗口内没恢复的情况,转 RB-2(元数据隔离)。

RB-2:元数据隔离处置 ​

  • 触发: 0x2004 METADATA_QUARANTINED,或 data/metadata/ 下出现 quarantine/ 目录。
  • 自动行为: broker 已经隔离该分区并停止服务它(即上表 level −2)。
  • 人工步骤: 目录布局 —— data/metadata/quarantine/ 存放被拒状态供检查,绝不自动重放。

RB-3:kill -9 后 leader 恢复 ​

  • 触发: leader 进程未经正常关停而消失。
  • 自动行为: 重启后 broker 重放 segment 日志与投递台账;重投定时器从台账重建,因此 at-least-once 扛过这次崩溃。
  • 人工步骤: 用 mortarmq leader get 确认恢复后的 leader_epoch。

尚未真演练

没有任何条目被端到端实战验证过。触发表是冻结设计,三条条目是未来每条条目必须长成的样子 —— 其中 验证恢复 那一段是永远不许留空的部分。