2013-10-30 10 views
18

3人のメンバー(プライマリ、セカンダリ、セカンダリ)を持つレプリカがあります。 1日のセカンダリのうち1つがダウンした後、セカンダリに戻ってレプリカに戻ると、どのように見つけることができますか?はまだ同期されていますか?セカンダリが現在同期されているかどうかを確認する方法

私はこれをテスト環境で行いましたが、有用なデータはrs.status()db.printReplicationInfo()から見つかりませんでした。

db.printReplicationInfo()に「ログの長さの開始があります」があります。セカンダリがダウンしているときは、デフォルトでは大きな時間を費やしています。

答えて

25

注:は、arcseldonで提供されていることを確認してください。

出力はrs.status()です。セカンダリが同期され、slaveDelayオプションで作成されなかった場合、セカンダリのoptimeoptimeDateは、プライマリのセカンダリと等しいか、または(現在の操作がある場合)閉じる必要があります。その場合、stateStrSECONDARYと等しくなければなりません。二次はあなたがこのような出力が表示されるはず同期された場合(1人のメンバーは出力から明確にするため削除されました):

{ 
    "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 
} 

をここでは、セカンダリの1が同期されていない場合、設定された同じレプリカの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 
} 

二は、その後slaveDelayoptimeoptimeDateで作成されている場合は異なる場合がありますが、いくつかの遅れがある場合stateStrlastHeartbeatMessageが示されます。

+0

ありがとうございました。「到達できない/健全な」は「二次」になるはずです – irmorteza

+0

あなたは正しいです:) – zero323

+0

「optime」と「optimeDate」フィールドを明確にしてくれてありがとう。 2.4から2.6へのアップグレード時には、 'syncingTo'メッセージは消えませんでしたので、問題が正しく同期しているかどうかはわかりませんでした。 –

1

私はmongoDBシェル用の小さなスクリプトを書いています。それはoptimeとoptimeDateの違いを示しています。レプリカセットメンバーを手動で比較するのではなく、それを使用できます。

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'); 
} 
8

アップデート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 

を、レプリカセット内のノード間の同期が健康であるかどうかの感覚を得ることは容易です。

関連する問題