How to check secondary is synced now or not

后端 未结 4 624
深忆病人
深忆病人 2021-02-01 04:12

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, i

相关标签:
4条回答
  • 2021-02-01 04:24

    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.

    0 讨论(0)
  • 2021-02-01 04:41

    Update 13th February 2017

    Agree with the accepted answer that rs.status() offers adequate information and is an easy command to remember. However, (personally using Mongo 3 now), do also really like the convenience and readability of rs.printSlaveReplicationInfo().

    It gives an output something like:

    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
    

    As you can see, it is easy to get a sense of whether the synchronization between the nodes in the replica set is healthy or not.

    0 讨论(0)
  • 2021-02-01 04:46

    @arcseldon gave the right answer, however, rs.printSlaveReplicationInfo() will be depricated soon

    rs0:PRIMARY> rs.printSlaveReplicationInfo() WARNING: printSlaveReplicationInfo is deprecated and may be removed in the next major release. Please use printSecondaryReplicationInfo instead.

    So, start using rs.printSecondaryReplicationInfo() instead

    rs0:PRIMARY> rs.printSecondaryReplicationInfo()
    source: mongo-1.mongo.ns.svc.cluster.local:27017
            syncedTo: Sat Sep 26 2020 01:26:32 GMT+0000 (UTC)
            10 secs (0 hrs) behind the primary 
    source: mongo-2.mongo.ns.svc.cluster.local:27017
            syncedTo: Sat Sep 26 2020 01:26:32 GMT+0000 (UTC)
            10 secs (0 hrs) behind the primary 
    
    0 讨论(0)
  • 2021-02-01 04:50

    I wrote a little script for mongoDB shell. It shows a diff between optime and optimeDate. You can use it instead of comparing manually replica set members.

    var isMaster = rs.isMaster();
    var me = isMaster.me;
    
    if(!isMaster.ismaster && isMaster.secondary)
    {
        var status = rs.status();
        var master = isMaster.primary;
    
        var masterOptime = 0;
        var masterOptimeDate = 0;
        var myOptime = 0;
        var myOptimeDate = 0;
    
        for(var i = 0 ; i < status.members.length ; i++)
        {
            var member = status.members[i];
            if(member.name == me)
            {
                if(member.stateStr == "SECONDARY") {
                    myOptime = member.optime.getTime();
                    myOptimeDate = member.optimeDate.getTime();
                }
                else
                {
                    print(me + ' is out of sync ' + member.stateStr);
                    break;
                }
            }
            else if(member.name == master)
            {
                masterOptime = member.optime.getTime();
                masterOptimeDate = member.optimeDate.getTime();
            }
    
        }
    
        if(myOptime && myOptimeDate)
        {
            var optimeDiff = masterOptime - myOptime;
            var optimeDateDiff = masterOptimeDate - myOptimeDate;
    
            print('optime diff: ' + optimeDiff);
            print('optimeDate diff: ' + optimeDateDiff);
        }
    
    }
    else
    {
        print(me + ' is not secondary');
    }
    
    0 讨论(0)
提交回复
热议问题