DEBUG.WIKI
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →

MongoDB change stream 重连失败:resume point may no longer be in the oplog

核对出错时历史窗口与业务检查点,明确缺口重新同步和未来保留策略,不承诺找回已删除事件。

change stream 重连时出现 Resume of change stream was not possible, as the resume point may no longer be in the oplog。服务后来又能连接数据库,不代表旧 resume token 仍可用。先核对恢复位置、实际错误和出错时的 oplog 保留范围,再决定继续恢复还是处理数据缺口。

这类报错可出现在副本集或分片集群的 change stream 路径。以下按传统副本集 oplog 与当前恢复规则说明,实际服务端、驱动和托管集群能力需要核对;不能仅凭错误文字确定是哪一次选举、断连或写入高峰导致历史丢失。

容量是字节数,恢复窗口是时间范围

oplog 滚动保存修改操作。写入速率和操作量变化时,同样大小的 oplog 能覆盖的时间也会变化;今天查看到较长窗口,不能证明昨天报错时也有同样长的历史。

保存完整错误码、标签、发生时间、驱动版本,以及应用真正用于恢复的持久化检查点。核对 token 来自哪个部署、数据库和监听范围,并确认恢复时沿用了生成它的 pipeline 和选项。不要把另一套环境的 token 或已改动含义的监听配置当成同一条流。

在支持这些方法的部署中,由具备必要权限的人员连接对应副本集成员,读取 oplog 状态。下面用于人工查看,不会调整大小:

rs.printReplicationInfo()

关注首末事件时间与检查点的关系,而不只看 configured oplog size。分片集群要检查相关分片的副本集,不能只在 mongos 上寻找一份本地 oplog。M0 和 Flex 等不支持此方法的托管环境,应使用平台提供的监控与支持入口。

这个方法输出供人阅读的报告;脚本采集应按平台能力采用结构化指标。后来采到的窗口只是后来状态,如果没有错误发生时的 token 和监控,不能补写确定的历史根因。

驱动恢复位置,不等于业务已经处理到的位置

change stream 事件的 _id 是一种 resume token。协议还提供 postBatchResumeToken,它可能表示服务端已经扫描到、更靠后的范围,即使那一批没有匹配事件。

如果监听的集合很少变化,却只长期保存最后一个匹配事件的 token,保存位置可能越来越旧。应检查实际驱动和消费循环是否按支持的方式取得推进后的恢复位置,而不是自己假定“没有新业务事件就没有新位置”。

不过,驱动缓存的 token 不自动成为可靠的业务检查点。前面还有事件未完成下游处理时,不能先持久化更靠后的 token;进程重启可能从未处理事件之后开始,造成漏消费。检查点提交要与业务处理顺序、并发和失败重试策略一致,token 原样保存,不修改事件 _id 来做自定义编号。

普通可恢复的网络或 getMore 错误,与历史已不支持的恢复位置不同。驱动的自动恢复也不能无限找回已被移除的历史,不要给所有异常加同一个无限重试循环。

历史已经缺失,就明确做缺口处理

若确认服务器已经没有支持旧位置的历史,扩大未来的 oplog 不会补回过去事件。把 resumeAfter 换成 startAfter 也不能凭空找回它们;startAfter 用于包括 invalidate 后重新开启流的相应场景,仍然要求服务器有足够历史。

从现在重新监听会跳过停机期间的变化,必须由业务明确接受,不能在删除旧检查点后报告“无损恢复”。下游需要与当前数据库一致时,应设计获准的重新同步、核对和切换流程,处理读取期间的新变化及重复事件。

当前全量快照可以帮助重建当前状态,但不能独自还原已经删除的记录或全部中间变化。审计、账务或必须保留事件历史的业务,还需要保存的事件、备份或其他可靠记录,不能以一次全量扫描替代。

Kafka source connector 有自己存储 offset、heartbeat 和处理错误的规则。不要把重置 offset 或临时容忍所有错误的连接器方案直接搬到普通驱动应用;这些操作会改变恢复进度,也可能掩盖其他错误。

增加未来保留时间,仍需监控消费进度

根据写入高峰、停机预算和磁盘空间评估 oplog 大小及受支持的最小保留时间。支持最小保留策略的版本会结合容量和条目年龄判断截断,oplog 还可能超过配置大小;不能把一个容量数字当成永久保留保证。

自建副本集的调整按成员实施,保留原配置并核对重启后是否持久有效。托管服务按平台能力处理,不随意删除 local.oplog.rs、执行压缩或手工修改日志内容。

验收应核对恢复后的检查点、下游状态、重复处理和缺口处理记录,同时监控业务消费落后与实际保留窗口。恢复配置可以回退,已经跳过的历史不会因此重新出现;没有完成数据核对时,应继续保留缺口状态。