首页 > 解决方案 > MongoDB集群时间与挂钟时间相差太远

问题描述

我正在维护一个内部依赖于 Mongo DB 的火箭聊天服务器。最近 linux 机器的日期被意外更改为 2022 年,由于我将其更改回来,mongo 实例拒绝启动,声称“新集群时间 1666775701 与此节点挂钟时间 1603715107 太远”

如何从 mongo shell 将 mongo 的时钟设置回正确的时间?

标签: mongodb

解决方案


tldr

使用足够大的maxAcceptableLogicalClockDriftSecs来启动您的实例以覆盖该时间段。从错误消息看来 63060594 应该足够了,但要慷慨,例如 94608000(3 年)。服务器启动后备份数据。如果您负担得起,请核对数据库并从备份中恢复它。使用正常/默认 maxAcceptableLogicalClockDriftSecs 重新启动 mongo

解释

Mongo 因果一致性模型基于Lamport 逻辑时钟。它在 oplog 内部使用,所有复制逻辑都依赖它。

当您不小心将系统日期更改为未来时,时间戳会相应地提前。当您将系统日期回滚到基于 ntp 的时间时,您还需要重置时间戳。默认 maxAcceptableLogicalClockDriftSecs 为您提供 1 年的时间,这对于正常操作来说绰绰有余。

调整这个值可以让你启动 mongo 并恢复它的状态。它不会修复用户空间中的任何日期 - 这完全是您的责任。Mongo 知道从您的应用程序角度注意日期的含义。

您不需要使用自定义命令行参数启动火箭服务器 - 手动启动 mongo、备份数据、核对数据库、恢复数据、停止 mongod、启动火箭服务器。


推荐阅读