现在如何检查辅助是否同步

irm*_*eza 25 mongodb replicaset

有三个成员(主要,次要,次要)的副本.假设其中一个辅助人员倒了一天,在返回辅助设备后我怎么能找到,是否已经同步?

我在测试环境中做到了这一点,但无法从rs.status()和找到有用的数据db.printReplicationInfo().

在"日志长度开始结束"中db.printReplicationInfo().但是默认情况下这是很重要的时间,并且在次要故障时会增长.

zer*_*323 31

注意:请务必检查arcseldon提供的答案,以获得用户友好的等效项.

你可以使用输出rs.status().如果辅助已同步且未使用slaveDelay选项创建,那么辅助应optimeoptimeDate辅助或辅助(如果有当前操作)相等或关闭.在那种情况下stateStr应该等于SECONDARY.因此,如果辅助被同步,您应该看到类似于此的输出(为清楚起见,已从输出中删除了一个成员):

 {
    "set" : "rs0",
    "date" : ISODate("2013-11-08T14:58:49Z"),
    "myState" : 1,
    "members" : [
        {
            "_id" : 0,
            "name" : "hostname:27001",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 155,
            "optime" : Timestamp(1383915748, 1),
            "optimeDate" : ISODate("2013-11-08T13:02:28Z"),
            "self" : true
        },

        {
            "_id" : 2,
            "name" : "hostname:27003",
            "health" : 0,
            "state" : 8,
            "stateStr" : "SECONDARY",
            "uptime" : 0,
            "optime" : Timestamp(1383915748, 1),
            "optimeDate" : ISODate("2013-11-08T13:02:28Z"),
            "lastHeartbeat" : ISODate("2013-11-08T14:58:48Z"),
            "lastHeartbeatRecv" : ISODate("2013-11-08T14:58:42Z"),
            "pingMs" : 0,
            "syncingTo" : "hostname:27001"
        }
    ],
    "ok" : 1
}
Run Code Online (Sandbox Code Playgroud)

rs.status()如果未同步其中一个辅助副本,则在此处输出相同的副本集.首先你会看到,optimeoptimeDatehostname:27003从小学不同,stateStr设置为RECOVERING有为宜lastHeartbeatMessage.

{
    "set" : "rs0",
    "date" : ISODate("2013-11-08T15:01:34Z"),
    "myState" : 1,
    "members" : [
        {
            "_id" : 0,
            "name" : "hostname:27001",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 320,
            "optime" : Timestamp(1383922858, 767),
            "optimeDate" : ISODate("2013-11-08T15:00:58Z"),
            "self" : true
        },

        {
            "_id" : 2,
            "name" : "hostname:27003",
            "health" : 1,
            "state" : 3,
            "stateStr" : "RECOVERING",
            "uptime" : 14,
            "optime" : Timestamp(1383915748, 1),
            "optimeDate" : ISODate("2013-11-08T13:02:28Z"),
            "lastHeartbeat" : ISODate("2013-11-08T15:01:34Z"),
            "lastHeartbeatRecv" : ISODate("2013-11-08T15:01:34Z"),
            "pingMs" : 0,
            "lastHeartbeatMessage" : "still syncing, not yet to minValid optime 527cfc90:19c4",
            "syncingTo" : "hostname:27001"
        }
    ],
    "ok" : 1
}
Run Code Online (Sandbox Code Playgroud)

如果二次一直与创建slaveDelay那么optimeoptimeDate可以不同,但stateStrlastHeartbeatMessage将表明,如果有一定的滞后性.


arc*_*don 24

2017年2月13日更新

同意接受的答案,rs.status()提供足够的信息,并且很容易记住.但是,(现在个人使用Mongo 3),也非常喜欢它的便利性和可读性rs.printSlaveReplicationInfo().

它给出了类似的输出:

rs.printSlaveReplicationInfo()

source: node-2:27017
    syncedTo: Mon Feb 13 2017 06:15:17 GMT-0500 (EST)
    0 secs (0 hrs) behind the primary
source: node-3:27017
    syncedTo: Mon Feb 13 2017 06:15:16 GMT-0500 (EST)
    1 secs (0 hrs) behind the primary
Run Code Online (Sandbox Code Playgroud)

如您所见,很容易理解副本集中节点之间的同步是否健康.