如何在不删除ledger的前提下恢复已终止的Pulsar bookie节点
BookKeeper 4.12.0 死节点ledger无删除恢复方案
问题根因说明
该场景是BookKeeper 4.12.0的已知问题:lostBookieRecoveryDelay=0配置下自动恢复触发逻辑偶现卡住,且decommissionbookie命令默认会尝试与下线节点同步元数据,节点完全终止后会陷入无限重试,导致重复制流程无法推进。你集群配置的managedLedgerDefaultWriteQuorum=3,每个ledger至少有3个副本,死节点下线后仍有2个可用副本,完全可以恢复完整数据,无需删除ledger。
前置操作
- 先将死节点标记为只读,避免新ledger写入该节点拓扑:
bookkeeper shell suspendbookie -bookieid <死节点IP:port> - 校验所有可用bookie的机架标签满足
bookkeeperClientMinNumRacksPerWriteQuorum=2的要求,确认新拉起的ASG节点已经配置正确的机架标签,否则重复制会因机架校验不通过卡住。
强制触发重复制
- 直接跳过decommission逻辑,执行单节点批量恢复命令:
bookkeeper shell auditbookie -bookieid <死节点IP:port> -fix
该命令会扫描所有存储在死节点上的ledger,直接批量提交重复制任务到恢复队列,无需等待死节点响应。 - 如果仍有部分ledger恢复卡住,逐个执行强制恢复:
bookkeeper shell recoverledger -deleteCookie -force -ledgerid <对应ledgerID>-force参数会跳过死节点连接步骤,直接用剩下的2个可用副本作为数据源生成新副本,-deleteCookie会清除死节点在元数据中的锁记录,避免恢复任务被锁阻塞。 - 如果恢复队列任务堆积不执行,重启任意一个运行AutoRecovery服务的节点即可触发队列重新调度,这是BookKeeper 4.12.0的已知bug。
后续优化建议
- 升级Pulsar版本至2.8.4+,对应BookKeeper版本升级至4.14.4+,该版本已修复自动恢复触发、任务堆积的已知问题
- 生产环境建议将
lostBookieRecoveryDelay调整为900s,避免节点临时抖动导致的不必要重复制 - ASG拉起新节点后,先校验机架标签配置正确再接入生产流量
内容的提问来源于stack exchange,提问作者Chirag
相关产品推荐
相关产品推荐

