确定新辅助成员的初始同步(STARTUP2)的索引构建阶段的总体进度的有效方法是什么?在我的情况下(几天),索引构建阶段需要很长时间,能够看到它在过程中的位置会很棒。
日志输出如下所示:
Tue Jan 27 20:04:45.006 [rsSync] Index: (2/3) BTree Bottom Up Progress: 782212700/946547617 82%
就我而言,这意味着“82%的某些物体,来自未知数量的未知数量的物体。”
答案 0 :(得分:2)
目前还没有监控此进度的方法,尽管有一张票据可以使用rs.status()增强对STARTUP2的监控:
https://jira.mongodb.org/browse/SERVER-7526 https://jira.mongodb.org/browse/SERVER-7019
也就是说,这个阶段所需的时间大致是每个索引乘以索引数所需时间的函数。反过来,每个索引所需的时间是每个索引中文档数量的函数。
因此,如果您测量创建索引所需的时间,请将其除以该索引中的文档总数。这应该可以让您大致了解索引单个文档的速度。然后将其乘以所有索引中的文档总数,这样可以让您了解剩余的时间。
现在,这是一个粗略的想法 - 影响总时间的一件事是需要索引的数据总量与可用内存量。如果你必须创建一个索引,在创建了另一个触及相同文档的索引之后,如果数据仍然缓存在内存中,它可能会快得多。没有办法轻易预测这一点,除了说总文件大小是否>>由于以前的文档缓存,你的内存不会超过内存。
长期我会投票https://jira.mongodb.org/browse/SERVER-7019,看看我们是否可以将其纳入队列,因为没有大型MongoDB数据库真的很痛苦。
答案 1 :(得分:0)
现在可以通过修复SERVER-7526和SERVER-7019来实现:
MongoDB 4.2.1及更高版本:
在mongo shell中运行:
db.adminCommand( { replSetGetStatus: 1 } )
如果在成员的初始同步期间(即STARTUP2状态)在成员上运行replSetGetStatus或mongo shell助手rs.status(),该命令将返回replSetGetStatus.initialSyncStatus指标。
以下是 initialSyncStatus 的示例输出:
"initialSyncStatus" : {
"failedInitialSyncAttempts" : 0,
"maxFailedInitialSyncAttempts" : 10,
"initialSyncStart" : ISODate("2019-10-29T20:01:12.516Z"),
"initialSyncAttempts" : [ ],
"fetchedMissingDocs" : 0,
"appliedOps" : 0,
"initialSyncOplogStart" : Timestamp(1572379269, 4),
"databases" : {
"databasesCloned" : 3,
"admin" : {
"collections" : 4,
"clonedCollections" : 4,
"start" : ISODate("2019-10-29T20:01:13.393Z"),
"end" : ISODate("2019-10-29T20:01:14.777Z"),
"elapsedMillis" : 1384,
"admin.system.roles" : {
"documentsToCopy" : 1,
"documentsCopied" : 1,
"indexes" : 2,
"fetchedBatches" : 1,
"start" : ISODate("2019-10-29T20:01:13.911Z"),
"end" : ISODate("2019-10-29T20:01:14.196Z"),
"elapsedMillis" : 285
},
MongoDB 3.4.0-4.2.0:
执行
对处于STARTUP2状态的成员执行db.adminCommand( { replSetGetStatus: 1, initialSync: 1 } )
命令
MongoDB参考: replSetGetStatus