MongoDB 4.2 P-S-S副本集主节点oplog时间比实际晚1小时如何解决?
问题结论速览
1. MongoDB ISODate的取值来源
MongoDB中的ISODate是标准UTC时间的封装实现,直接读取操作系统内核提供的UTC时间,和操作系统配置的本地时区无关:
- 你在Mongo Shell执行
Date()返回的是经过本地时区格式化后的时间,你示例中输出的GMT+0100 (CET)时区的9:29是本地时间,属于展示层的时区转换结果 - 你执行
ISODate()返回的8:30是UTC时间,和你当前的CET时区刚好差1小时,属于完全正常的输出。
你提到的oplog操作时间比实际本地时间晚1小时,本质是oplog的ts时间戳字段同样存储UTC时间,和你本地时区的时间存在固定偏移,不是逻辑错误。
2. 能否手动调整时间修复异常
不支持手动修改MongoDB内部的时间取值逻辑,也禁止手动修改已生成的oplog时间:
- MongoDB没有提供任何可配置的时间偏移参数,所有内部时间戳都是直接调用系统API获取的UTC时间,没有手动修改的入口
- 随意修改已生成的oplog记录会直接破坏副本集的数据一致性校验逻辑,会导致节点同步失败、集群不可用等严重问题。
异常修复方案
你可以按照以下步骤排查解决你的问题:
- 先校验系统UTC时间是否正确:不要只核对本地时区时间,在节点操作系统执行
date -u命令查看输出的UTC时间,和标准UTC时间比对,如果存在偏差优先通过NTP服务同步修正系统时间 - 如果系统UTC时间确认无误,但MongoDB进程读取的时间仍然和系统UTC不一致,是因为调整夏令时时MongoDB进程没有重新读取系统时间配置,滚动重启副本集即可:
- 先逐个重启所有从节点,重启完成后确认从节点状态正常、同步没有延迟
- 对主节点执行
rs.stepDown()触发主备切换,等新主节点选举成功后,重启旧主节点 - 所有节点重启完成后,MongoDB会重新读取系统时间配置,oplog时间生成逻辑就会恢复正常
内容的提问来源于stack exchange,提问作者Kakumei
相关产品推荐
相关产品推荐

