我有一个副本集,我正在尝试将主服务器升级为具有更多内存和升级磁盘空间的副本集。因此,我在新的主服务器上一起突袭了几个磁盘,从辅助服务器 rsync 了数据并将其添加到副本集中。在检查 rs.status() 后,我注意到所有辅助服务器都比主服务器晚大约 12 小时。因此,当我尝试将新服务器强制到主服务器位置时,它不会起作用,因为它不是最新的。
这似乎是一个大问题,因为一旦主服务器发生故障,我们将至少落后 12 个小时,甚至落后近 48 个小时。
所有 oplog 都重叠,oplogsize 相当大。我唯一能想到的就是我在主服务器上执行了大量写入/读取,这可能会使服务器处于锁定状态,从而无法进行适当的追赶。
有没有办法可以强制辅助节点赶上主节点?
目前有 5 台服务器,最后 2 台将替换其他 2 个节点。_id 为 6 的节点将替换主节点。距离主节点最远的节点 optime 落后 48 小时多一点。
{
"set" : "gryffindor",
"date" : ISODate("2011-05-12T19:34:57Z"),
"myState" : 2,
"members" : [
{
"_id" : 1,
"name" : "10******:27018",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 20231,
"optime" : {
"t" : 1305057514000,
"i" : 31
},
"optimeDate" : ISODate("2011-05-10T19:58:34Z"),
"lastHeartbeat" : ISODate("2011-05-12T19:34:56Z")
},
{
"_id" : 2,
"name" : "10******:27018",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 20231,
"optime" : {
"t" : 1305056009000,
"i" : 400
},
"optimeDate" : ISODate("2011-05-10T19:33:29Z"),
"lastHeartbeat" : ISODate("2011-05-12T19:34:56Z")
},
{
"_id" : 3,
"name" : "10******:27018",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 20229,
"optime" : {
"t" : 1305228858000,
"i" : 422
},
"optimeDate" : ISODate("2011-05-12T19:34:18Z"),
"lastHeartbeat" : ISODate("2011-05-12T19:34:56Z")
},
{
"_id" : 5,
"name" : "10*******:27018",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 20231,
"optime" : {
"t" : 1305058009000,
"i" : 226
},
"optimeDate" : ISODate("2011-05-10T20:06:49Z"),
"lastHeartbeat" : ISODate("2011-05-12T19:34:56Z")
},
{
"_id" : 6,
"name" : "10*******:27018",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"optime" : {
"t" : 1305050495000,
"i" : 384
},
"optimeDate" : ISODate("2011-05-10T18:01:35Z"),
"self" : true
}
],
"ok" : 1
}
答案1
查看完所有内容后,我发现了一个错误,这使我回到了在主服务器上运行的 mapreduce,它存在这个问题:https://jira.mongodb.org/browse/SERVER-2861。因此,当尝试复制时,由于 oplog 中的错误/损坏操作而导致同步失败。
答案2
为了回答原始问题(这不会解决 OP 的问题),我相信强制辅助“赶上”的最佳方法是将其从集合中移除并重新添加,但有可能(例如在这种情况下)还有其他问题。检查您的日志。