MongoDB 复制超时

MongoDB replication timeout

我使用 MongoDB 3.4.3 并且在一个副本集中有三台机器。让其名称为server1server2server3server2 处于持续回滚状态,所以我们将其关闭。 server3 处于恢复状态并尝试从 server1 获取操作日志,但其尝试导致 ExceededTimeLimit 异常。所以这是 server3 日志的摘录:

2017-06-26T14:42:14.442+0300 I REPL     [replication-0] could not find member to sync from
2017-06-26T14:42:24.443+0300 I REPL     [rsBackgroundSync] sync source candidate: server1:27017
2017-06-26T14:42:24.444+0300 I ASIO     [NetworkInterfaceASIO-RS-0] Connecting to server1:27017
2017-06-26T14:42:24.455+0300 I ASIO     [NetworkInterfaceASIO-RS-0] Successfully connected to server1:27017
2017-06-26T14:42:54.459+0300 I REPL     [replication-0] Blacklisting server1:27017 due to required optime fetcher error: 'ExceededTimeLimit: Operation timed out, request was RemoteCommand 191739 -- server1:27017 db:local expDate:2017-06-26T14:42:54.459+0300 cmd:{ find: "oplog.rs", oplogReplay: true, filter: { ts: { $gte: Timestamp 1497975676000|310, $lte: Timestamp 1497975676000|310 } } }' for 10s until: 2017-06-26T14:43:04.459+0300. required optime: { ts: Timestamp 1497975676000|310, t: 20 }

所以这些检索 oplog 的尝试是无限的。根据 db.currentOp(),在 server1(副本集的主节点)上有一个 运行 长查询日志,试图检索操作日志。这些查询会降低 server1 的性能,因此我的数据库运行速度非常非常慢。

当前 server1 的 oplog 大小为 643 GB。我认为它的大小是复制不起作用的原因。 server2 也有 oplog 超时问题,所以我们暂时关闭了它。这种情况已经持续了一个多星期。我在主机上有超过 5 TB 的数据。如何恢复副本集?

upd: 我们的服务器每台有 64 GB 的内存。确实是虚拟机。

可以休息一下吗?因为看起来你的机器(server1)没有足够的内存。 5TB 的数据和那么大的 opLog,需要的内存量是数百 GB。我不会尝试 运行 该系统作为一个副本集。更像是 3-5 个分片集群(总共 9-15 个节点;每个分片有 3 个副本集)。好的规则是将节点大小始终保持在 2TB 以下,如果可以存档,1TB 是一个很好的起点。

如果可以停机,则应将 opLog 缩小到更合理的大小。您可以从 50GB 开始。可以找到步骤 here