Replication

MongoDB 副本集中的不同數據庫統計資訊

  • February 8, 2018

我有一個3.2.6帶有兩個節點和一個仲裁器的 MongoDB () 副本集。輔助節點退出了很長時間,最近恢復了初始同步。所以目前 rs.status() 如下:

rs.status()

{
   "set" : "anonymizedReplicaSet",
   "date" : ISODate("2017-05-24T07:33:08.629Z"),
   "myState" : 2,
   "term" : NumberLong(-1),
   "syncingTo" : "anonymized01:27017",
   "heartbeatIntervalMillis" : NumberLong(2000),
   "members" : [ 
       {
           "_id" : 1,
           "name" : "anonymized01:27017",
           "health" : 1.0,
           "state" : 1,
           "stateStr" : "PRIMARY",
           "uptime" : 157061,
           "optime" : Timestamp(6423603132856545, 12785),
           "optimeDate" : ISODate("2017-05-24T07:40:52.000Z"),
           "lastHeartbeat" : ISODate("2017-05-24T07:33:06.790Z"),
           "lastHeartbeatRecv" : ISODate("2017-05-24T07:33:06.790Z"),
           "pingMs" : NumberLong(0),
           "electionTime" : Timestamp(6415474245823889, 1),
           "electionDate" : ISODate("2017-05-02T09:56:38.000Z"),
           "configVersion" : 10
       }, 
       {
           "_id" : 2,
           "name" : "anonymized02:27017",
           "health" : 1.0,
           "state" : 2,
           "stateStr" : "SECONDARY",
           "uptime" : 157062,
           "optime" : Timestamp(6423603141446477, 10075),
           "optimeDate" : ISODate("2017-05-24T07:40:54.000Z"),
           "syncingTo" : "anonymized01:27017",
           "configVersion" : 10,
           "self" : true
       }, 
       {
           "_id" : 3,
           "name" : "anonymizedas:27017",
           "health" : 1.0,
           "state" : 7,
           "stateStr" : "ARBITER",
           "uptime" : 157061,
           "lastHeartbeat" : ISODate("2017-05-24T07:33:06.790Z"),
           "lastHeartbeatRecv" : ISODate("2017-05-24T07:33:07.248Z"),
           "pingMs" : NumberLong(0),
           "configVersion" : 10
       }
   ],
   "ok" : 1.0
}

但是,我注意到這兩個節點的統計數據不一致,例如,當我同時向我得到的兩台伺服器發出 db.stats() 時:

主節點 db.stats()

{
   "db" : "mydb",
   "collections" : 8,
   "objects" : 43933967,
   "avgObjSize" : 575.327071124718,
   "dataSize" : 25276400557.0,
   "storageSize" : 11909304320.0,
   "numExtents" : 0,
   "indexes" : 12,
   "indexSize" : 997511168.0,
   "ok" : 1.0
}

輔助節點 db.stats()

{
   "db" : "mydb",
   "collections" : 8,
   "objects" : 44016455,
   "avgObjSize" : 576.927973845236,
   "dataSize" : 25394324199.0,
   "storageSize" : 9882480640.0,
   "numExtents" : 0,
   "indexes" : 12,
   "indexSize" : 901128192.0,
   "ok" : 1.0
}

兩個節點上的對像數量不應該一致嗎?此外,我在發出mydb.mycollection.count()命令時收到不同的結果。這是正常行為嗎?還是兩個節點的同步有問題?

邏輯上的答案是肯定的。

當我在我們的多 TB 數據庫上進行測試時,我發現了副本集成員之間的差異,但是這是測量錯誤,過程錯誤。前任 db.stats()不是好的命令,因為 RS 節點可以有db.system.profile -collection,不復製到其他節點的東西。

如何正確執行(在所有副本集節點上執行這些操作):

  1. 停止對 MongoDB 的所有寫入流量,您可以通過關閉所有客戶端或給出(在主節點)命令來做到這一點db.fsyncLock()
  2. 選擇正確的數據庫(使用 xyz)並給出命令db.setSlaveOk(true)
  3. 不要使用db.collection.find().count()or db.collection.count(),使用命令db.collection.find({_id:{ $gt: MinKey, $lt:MaxKey} }, {_id:1}).itcount()來統計有多少個文件
  4. 在您對多個集合執行這些 itcount() 命令並且您很高興(或不)得到結果之後……不要忘記(在主要)命令db.fsyncUnlock()

我們有維修中斷,我在維修期間做了這個計數程序,並得到了(這次)正確的結果。每個 RS 節點都有相同數量的文件。;-)

引用自:https://dba.stackexchange.com/questions/174403