Replication
MongoDB 副本集中的不同數據庫統計資訊
我有一個
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
,不復製到其他節點的東西。如何正確執行(在所有副本集節點上執行這些操作):
- 停止對 MongoDB 的所有寫入流量,您可以通過關閉所有客戶端或給出(在主節點)命令來做到這一點
db.fsyncLock()
- 選擇正確的數據庫(使用 xyz)並給出命令
db.setSlaveOk(true)
- 不要使用
db.collection.find().count()
ordb.collection.count()
,使用命令db.collection.find({_id:{ $gt: MinKey, $lt:MaxKey} }, {_id:1}).itcount()
來統計有多少個文件- 在您對多個集合執行這些 itcount() 命令並且您很高興(或不)得到結果之後……不要忘記(在主要)命令
db.fsyncUnlock()
我們有維修中斷,我在維修期間做了這個計數程序,並得到了(這次)正確的結果。每個 RS 節點都有相同數量的文件。;-)