我最近有一个副本集成员几天不同步。使用“重新同步一个非常陈旧的副本集成员”指令,我mongod
在辅助机器上停止,清除数据目录,重新启动进程,让机器重新同步到主机器。
一切都很完美,至少看起来是这样。记录表明同步进行得很好。rs.status()
最终,它显示为完成,在辅助机器上产生以下输出:
# The secondary machine's status for itself and its primary:
{
"_id" : 0,
"name" : "myprimary:myport",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 497,
"optime" : {
"t" : 1347562257000,
"i" : 1
},
"optimeDate" : ISODate("2012-09-13T18:50:57Z"),
"lastHeartbeat" : ISODate("2012-09-13T19:00:34Z"),
"pingMs" : 3
},
{
"_id" : 2,
"name" : "mysecondary:myport",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"optime" : {
"t" : 1347562257000,
"i" : 1
},
"optimeDate" : ISODate("2012-09-13T18:50:57Z"),
"self" : true
}
正如预期的那样,机器是同步的,并且共享一个 optime 值。但主机是另一回事。它仍然显示不同步的辅助节点,即使主节点的优化时间自重新同步完成后提前。
# The primary machine's status for itself and its secondary:
{
"_id" : 0,
"name" : "myprimary:myport",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 497,
"optime" : {
"t" : 1347562257000,
"i" : 1
},
"optimeDate" : ISODate("2012-09-13T18:50:57Z"),
"self" : true
},
{
"_id" : 2,
"name" : "mysecondary:myport",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"optime" : {
"t" : 1347103757000,
"i" : 1
},
"optimeDate" : ISODate("2012-09-08T11:29:17Z"),
"lastHeartbeat" : ISODate("2012-09-11T17:27:06Z"),
"pingMs" : 3
}
我错过了什么?起初我以为“等一下”,但已经快一个小时了,数据库在那段时间有插入。我可以强制主节点对次节点进行心跳检查,还是需要再次重新同步它们?
我能在初选上找到的唯一真正奇怪的是:
PRIMARY> use local;
PRIMARY> db.slaves.find()
{ "_id" : ObjectId("4f675b909d8e143a90055864"), "host" : "<hostIP>", "ns" : "local.oplog.rs", "syncedTo" : { "t" : 1347395837000, "i" : 1 } }
{ "_id" : ObjectId("50522761212b77e9637ad541"), "host" : "<hostIP>", "ns" : "local.oplog.rs", "syncedTo" : { "t" : 1347562257000, "i" : 1 } }
这些是相同的主机(有问题的辅助机器)。我的理解是这应该显示一个条目,但如果没有更好地了解它跟踪的内容和更新方式,我会犹豫要不要触摸它。