重置成员同步期间的问题

Issues during repset members syncing

昨天我发现 repset 中的次要成员与主要成员不同步。差异太大,不适合 oplog,所以我不得不手动同步。根据手册,我停止了 mongod,完全删除了 dbpath 的内容并再次启动了 mongod。它以状态 "STARTUP2" 开始并开始初始同步。有超过 200G 需要同步,所以我让它保持同步然后回家了。 今天我看到状态从"STARTUP2"变成了"SECONDARY"

 "_id" : 0,
"name" : "lab7-mongo-4:27020",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 71414,
"optime" : Timestamp(1448011826, 2),
"optimeDate" : ISODate("2015-11-20T09:30:26.000Z"),
"lastHeartbeat" : ISODate("2015-11-20T09:38:41.000Z"),
"lastHeartbeatRecv" : ISODate("2015-11-20T09:38:41.000Z"),
"pingMs" : 0,
"syncingTo" : "lab7-mongo-9:27020"

但次要数据库路径大小为 109G,而主要数据库路径大小为 205G。据我所知,它应该仍在同步,但事实并非如此。在过去两个小时内,辅助节点上的 dbpath 大小没有增加。请告知如何完成同步。

实际上,这是预期的行为。

写入数据时,文档可能会移动到新的数据文件。虽然保证文档不会碎片化,但单个文档可能会分散在数据文件中,尤其是当数据高度不稳定时。

删除文档后,其 space 可用于新文档,但前提是这些文档适合该位置。否则,可能会分配新的数据文件。所以理论上很可能只使用数据文件中 space 的一小部分,但仍然会分配新的数据文件,因为新文档不适合 "slot".

但是,在同步期间,文档会连续写入新分配的数据文件中,可能(而且很可能)减少其数据文件所需的大小 MongoDB。

从 "STARTUP2" 到 "SECONDARY" 的变化转化为

I have copied over all documents present when the sync started and applied all oplog entries from the beginning of the sync to its finish. I am guaranteeing consistency.

因此,您基本上已经对数据文件进行了碎片整理,从而减少了要分配的数据文件。