there is the replica with three member (primary,secondary,secondary). Suppose one of secondaries down for a day, after return secondary back to replica how can i find, is it synced yet or not?
I did that in testing environment, But couldn't find useful data from rs.status()
and db.printReplicationInfo()
.
there is "log length start to end" in db.printReplicationInfo()
. but it's big time by default and grows when secondary is down.
Note: Be sure to check the answer provided by arcseldon for an user friendly equivalent.
You can use output of rs.status()
. If secondary is synced and wasn't created with slaveDelay
option then optime
and optimeDate
of secondary should be equal or close (if there are current operations) to those of primary. In that case stateStr
should be equal to SECONDARY
. So if secondary is synced you should see output similar to this (one member has been removed from output for clarity):
{
"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
}
Here you have output of rs.status()
for the same replica set if one of secondaries is not synced. First of all you'll see that optime
and optimeDate
for hostname:27003
differs from primary, stateStr is set to RECOVERING
and there is appropriate 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
}
If secondary has been created with slaveDelay
then optime
and optimeDate
can be different but stateStr
and lastHeartbeatMessage
will indicate if there is some lag.