MongoDB与时间设置冲突.md
原文链接
现象
在 MongoDB 社区论坛的这篇帖子中,用户报告了一个问题,即在将其 Mac 日期手动设置为 2036 年后,再回到 2022 年时,MongoDB 出现了错误提示:“新的$clusterTime 与这个节点的墙上时钟时间相差太远”。为了解决这个问题,有两种可能的方案:
- 将客户端的时间设置为与集群的时间相匹配。这可能是一个不切实际的解决方案,因为所有操作将被记录为在未来发生。
- 转储并恢复整个数据库,并将服务器的时间修正为正确的时间。
该帖子指出,MongoDB 在分布式系统中确定操作顺序时使用 Lamport 时钟,Lamport 时钟具有时间戳始终增加的特性。在 MongoDB 6.0.3 中,Lamport 时钟对时间的前后移动有最大一年的容忍度。如果集群的任何部分的时间差超过一年,则会出现此错误。
原理
Lamport 时钟
Lamport 时间戳是一种在分布式计算机系统中用来建立事件部分排序的逻辑时钟算法,由其创造者 Leslie Lamport 命名。这个算法的关键特点包括:
事件排序:它帮助确定分布式系统中事件的顺序,这些系统的节点或进程不完全同步。算法提供了一种方法,以数值方式捕获事件之间的“发生在之前”的关系。
机制:分布式系统中的每个进程维护一个数值计数器(逻辑时钟)。规则包括:
- 在每个本地事件之前增加计数器。
- 在每条发送的消息中包含计数器值。
- 收到消息时,将计数器更新为其当前值和接收消息中的时间戳中的较大值,然后增加 1。
概念性应用:这个逻辑时钟在进程间消息传递的上下文中具有意义。当一个进程收到消息时,它会与发送方的时钟重新同步,确保时间戳的有序进展。
时间戳的唯一性:不同事件在同一进程中的时间戳永远不相等是必要的,这要求事件之间至少有一个时钟跳动。
处理方案
- 验证调整容忍度参数是否可以解决此问题
- 修改 MongoDB 启动参数
- 测试验证
MongoDB与时间设置冲突.md
https://abrance.github.io/2023/11/14/domain/db/MongoDB与时间设置冲突/