MongoDB 复制超时
MongoDB replication timeout
我使用 MongoDB 3.4.3 并且在一个副本集中有三台机器。让其名称为server1
、server2
和server3
。 server2
处于持续回滚状态,所以我们将其关闭。 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。
我使用 MongoDB 3.4.3 并且在一个副本集中有三台机器。让其名称为server1
、server2
和server3
。 server2
处于持续回滚状态,所以我们将其关闭。 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。