repset成员同步期间的问题

时间:2015-11-20 11:01:12

标签: mongodb replicaset

昨天我发现repset中的辅助成员与primary不同步。差异太大,无法适应oplog,因此我必须手动同步。根据手册我停止了mongod,完全删除了dbpath的内容并启动了mongod againg。它以状态“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"

但是辅助数据库上的dbpath大小为109G,而主数据库则为205G。我理解它应该仍然同步,但事实并非如此。在最近两个小时内,secodary上的dbpath大小没有增加。请告知如何完成同步。

1 个答案:

答案 0 :(得分:1)

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

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

删除文档时,其空间可用于新文档,但前提是这些文档适合该位置。如果不是,则可以分配新的数据文件。所以从理论上讲,很可能只会使用数据文件中的一小部分空间,但仍会分配新的数据文件,因为新文档不适合"插槽"。

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

来自" STARTUP2"的变化到" SECONDARY"转换为

  

我已经复制了同步开始时出现的所有文档,并应用了从同步开始到结束的所有oplog条目。我保证一致性。

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