1. 程式人生 > >MongoDB4.2 副本集掃盲說明

MongoDB4.2 副本集掃盲說明

說明:

  在掃盲MongoDB相關的一些知識的時候,順手做下筆記。本文將說明副本集相關的內容。在比較早之前已經對這些有過說明,可以看MongoDB 副本集的原理、搭建、應用。MongoDB中的副本集是一組維護相同資料集的mongod程序,副本集提供冗餘和高可用性,可提供一定程度的容錯能力,以防止丟失單個數據庫伺服器,是生產部署的基礎。

  在某些情況下,複製可以提供更大的讀取容量,因為客戶端可以將讀取操作傳送到不同的伺服器。 在不同資料中心中維護資料副本可以提高資料本地性和分散式應用程式的可用性,還可以維護其他副本以用於專用目的,例如災難恢復,報告或備份。

知識點:

  一個副本集最多有50個成員,並且最多7個成員有投票權。如果副本集已具有7個投票成員,則其他成員必須是非投票成員,確保副本集的投票成員數為奇數。

  副本集的所有成員都可以接受讀取操作。 但預設情況下,應用程式將其讀取操作定向到主要成員。 有關更改預設讀取行為(讀取首選項)請見:Read Preference。如果當前的主要節點不可用,則副本集會進行選擇以選擇哪個輔助節點成為新的主要節點。

  副本整合員每2秒鐘彼此傳送一次心跳(ping)。 如果心跳未在10秒(settings.electionTimeoutMillis)內響應,則其他成員將無法訪問的成員標記為無法訪問,如果是主節點,則會開始選舉。叢集選擇新的主資料庫之前的中值時間通常不應超過12秒。這包括將主要節點標記為不可用並完成選舉所需的時間。優先順序屬性高的從更有可能成為主節點,優先順序為0的,則不會參與選舉。

  非投票成員的優先順序必須為0,優先順序大於0的成員必須有投票權。以下狀態的成員才有資格具有投票權:

  • PRIMARY
  • SECONDARY
  • STARTUP2
  • RECOVERING
  • ARBITER
  • ROLLBACK

  即具有投票的節點,狀態需要在上面列表中。如一個非投票成員的屬性如:

{
   "_id" : <num>,
   "host" : <hostname:port>,
   "arbiterOnly" : false,
   "buildIndexes" : true,
   "hidden" : false,
   "priority" : 0,
   "tags" : {

   },
   "slaveDelay" : NumberLong(0),
   "votes" : 0
} 

1)Oplog

Oplog(操作日誌)是一個特殊的capped集合,保持所有修改儲存在資料庫中的資料的操作的記錄,類似於MySQL的Binlog,儲存在local.oplog.rs集合中。

主節點的oplog非同步同步到從節點,副本集可以在一個或多個成員失敗的情況下繼續執行。 從資料庫成員將這些操作複製並應用本身。所有副本整合員都將心跳(ping)傳送給所有其他成員,任何從成員都可以從任何其他成員應用操作日誌。需要注意的時候,如果副本集只剩一個節點,該節點會變成從節點(不能寫)。

操作日誌中的每個操作都是冪等的,也就是說oplog操作會產生相同的結果,無論是一次還是多次應用於目標資料集。

OpLog大小通過引數oplogSizeMB設定,不設定的話 WiredTiger 儲存引擎預設為空閒磁碟空間5%的大小,上限50G。可以在執行時,手動執行replSetResizeOplog來改變Oplog的大小。通過rs.printReplicationInfo()和db.getReplicationInfo()來檢視OpLog的狀態:大小、可使用時間等。

從MongoDB 4.2開始,可以限制主資料庫應用Oplog的寫入速率,可以將從延遲保持在flowControlTargetLagSeconds < db.adminCommand({ setFeatureCompatibilityVersion: "4.2" }) > 以下。

2)同步過程

初始化同步:複製除local資料庫外的所有資料庫,mongod掃描每個源資料庫中的每個集合,並將所有資料插入這些集合的自己的資料庫中。

在版本3.4中更改:在為每個集合複製文件時,初始同步將構建所有集合索引(先同步索引,再同步資料)。 在早期版本的MongoDB中,在此階段僅構建_id索引(先同步資料,再同步索引)。 

在版本3.4中更改:初始同步在資料複製期間提取新新增的操作日誌記錄。 確保目標成員在local資料庫中具有足夠的磁碟空間,以在此資料複製階段持續時間臨時儲存這些操作日誌記錄。mongod使用源中的操作日誌,將所有更改應用於資料集。初始同步完成後,成員將從STARTUP2轉換為SECONDARY。

初始化時,同步源的選擇取決於mongod啟動引數initialSyncSourceReadPreference的值(4.2.7中的新增功能)。如果無法選擇同步源,將記錄錯誤並等待1秒鐘,然後重新選擇,從mongod最多可以重新初始同步源選擇過程10次,然後錯誤退出。選擇同步源的要求可以看這裡。

3)複製:多執行緒

MongoDB使用多執行緒批量應用寫入操作以提高併發性。 MongoDB按文件ID(WiredTiger)對批次進行分組,並同時使用不同的執行緒來應用每組操作,MongoDB始終以原始寫入順序對給定文件應用寫入操作。

4)成員

①  Primary:處理所有寫操作。

② Secondaries:從主資料庫(oplog)複製操作,並將操作應用於其資料集,以維護相同的資料集,其有各種屬性:優先順序、延遲、隱藏等。

③ Arbiter:仲裁節點,只投票,不儲存資料,節省儲存成本。從MongoDB 3.6開始,仲裁程式的優先順序只能為0。因為不儲存資料,所以不具有用於身份驗證的使用者和角色對映的內部表。在認證的情況下登入的唯一方法是使用localhost。

成員屬性

① 優先順序屬性(Priority):優先順序為0的成員不能成為Primary,並且不能觸發選舉,但能選舉投票和讀取。

② 隱藏屬性(Hidden):優先順序為0,有投票權。適用於具有與副本集中其他成員不同的使用模式的工作負載(備份<db.fsyncLock()>、報表)。mongos不會與隱藏成員互動。

③ 延遲屬性(Delayed):用於恢復,必須是優先順序為0的成員,有隱藏屬性,可以有投票權。對於分片中的平衡作用有限。延遲單位為秒:

cfg = rs.conf()
cfg.members[0].priority = 0
cfg.members[0].hidden = true
cfg.members[0].slaveDelay = 3600
rs.reconfig(cfg)

④ 投票(votes):投票權為0的成員不能確定"majority" write concern。

⑤ 標籤(tags):通過標籤,可以設定readpreference、readConcern和writeConcern。

成員狀態

狀態值     狀態名           狀態說明
0       STARTUP       所有成員都以該狀態啟動,mongod在啟動狀態下解析副本集配置文件。
1       PRIMARY       主節點狀態,唯一支援寫的節點。有投票資格
2       SECONDARY      從節點狀態,複製同步資料。有投票資格
3       RECOVERING     恢復狀態,要麼從完成回滾或重新同步過渡。有投票資格
5       STARTUP2      加入副本集,並正在執行初始同步。有投票資格
6       UNKNOWN       從副本集的另一個成員的角度來看,該成員的狀態尚不清楚。沒有投票資格
7       ARBITER      仲裁節點狀態,不復制資料,僅存在於參加選舉中。 有投票資格
8       DOWN         從副本集的另一個成員的角度來看,該成員不可訪問。沒有投票資格
9       ROLLBACK      回滾節點狀態,無法從該成員讀取資料。有投票資格
10      REMOVED        刪除節點狀態,從副本集中刪除。

部署:

環境:版本(4.2.8)

192.168.163.134:27017
192.168.163.134:27018
192.168.163.134:27019  

配置檔案:其中一個節點的配置

systemLog:
   verbosity: 0
   quiet: false
   traceAllExceptions: false
   path: "/usr/local/mongodb_1/logs/mongodb.log"
   logAppend: true
   logRotate: rename
   destination: file
   timeStampFormat: iso8601-local

processManagement:
   fork: true
   pidFilePath: "/usr/local/mongodb_1/mongodb.pid"

net:
   port: 27017
   bindIp: 0.0.0.0
   maxIncomingConnections: 65536
   wireObjectCheck: true
   unixDomainSocket:
      enabled: true
      pathPrefix: /tmp
      filePermissions: 0700

security:
#   keyFile: "/usr/local/mongodb_1/test-keyfile"
   authorization: disabled

storage:
   dbPath: "/usr/local/mongodb_1/data"
   journal:
      enabled: true
      commitIntervalMs: 500
   directoryPerDB: true
   syncPeriodSecs: 60
   engine: wiredTiger
   wiredTiger:
      engineConfig:
         cacheSizeGB: 1
         journalCompressor: snappy
         directoryForIndexes: false
         maxCacheOverflowFileSizeGB: 0
      collectionConfig:
         blockCompressor: snappy
      indexConfig:
         prefixCompression: true

operationProfiling:
   # 指定應分析哪些操作,預設off:分析器已關閉,並且不收集任何資料;slowOp:收集比slowms的時間長的資料;all:收集所有操作的資料
   mode: slowOp
   # 慢操作時間閾值(以毫秒為單位),版本4.0中進行了更改:slowOpThresholdMs設定可用於mongod和mongos
   slowOpThresholdMs: 100
   # 分析記錄慢速操作
   slowOpSampleRate: 1.0
   # 過濾器,記錄耗時超過2秒的查詢操作
   #filter: '{ op: "query", millis: { $gt: 2000 } }'

replication:
   oplogSizeMB: 100
   replSetName: shard1
   enableMajorityReadConcern: false

sharding:
   clusterRole: shardsvr
   archiveMovedChunks: false
   # mongos配置項,指定配置伺服器
   #configDB: <configReplSetName>/cfg1.example.net:27019, cfg2.example.net:27019,...
View Code

按照配置檔案裡的配置,建立好各個目錄。

啟動節點:3個節點 

/usr/local/mongodb/bin/mongod -f /usr/local/mongodb_1/mongo.conf 

搭建:

①:無認證搭建(authorization: disabled)

> rs.initiate(
    {
    _id : 'shard1',
    members: [
    { _id : 0, host : "192.168.163.134:27017" },
    { _id : 1, host : "192.168.163.134:27018" },
    { _id : 2, host : "192.168.163.134:27019" }
              ]
    } 
   )

說明:副本集為shard1,3個成員(PSS) 

"_id": 副本集的名稱
"members": 副本集的伺服器列表
  "_id": 成員的ID
  "host": 成員的地址和埠
-- 以上是必填的,下面的成員屬性按照需要設定:
  "priority": 是優先順序,預設為1,優先順序0為被動節點,不能成為活躍節點。優先順序不為0則按照有大到小選出活躍節點。
  "arbiterOnly": 仲裁節點,只參與投票,不接收資料,也不能成為活躍節點。
  "hidden": 隱藏節點,優先順序和投票必須為0。
  "votes": 投票資格,0為沒有投票資格;1為有投票資格。
  "slaveDelay": 延遲節點,單位為秒。
  "tags": 標籤屬性。

可以通過日誌看到副本集初始化的一些具體資訊:

2021-02-24T07:54:29.381+0000 I  REPL     [initandlisten] Did not find local initialized voted for document at startup.
2021-02-24T07:54:29.381+0000 I  REPL     [initandlisten] Did not find local Rollback ID document at startup. Creating one.
2021-02-24T07:54:29.423+0000 I  REPL     [initandlisten] Initialized the rollback ID to 1
2021-02-24T07:54:29.423+0000 I  REPL     [initandlisten] Did not find local replica set configuration document at startup;  NoMatchingDocument: Did not find replica set configuration document in local.system.replset
2021-02-24T07:55:57.511+0000 I  REPL     [conn2] replSetInitiate admin command received from client
2021-02-24T07:55:57.517+0000 I  REPL     [conn2] replSetInitiate config object with 3 members parses ok
2021-02-24T07:55:57.517+0000 I  REPL     [conn2] Scheduling remote command request for initiate quorum check: RemoteCommand 1 -- target:192.168.163.134:27018 db:admin cmd:{ replSetHeartbeat: "shard1", checkEmpty: true, configVersion: 1, hbv: 1, from: "192.168.163.134:27017", fromId: 0, term: 0 }
2021-02-24T07:55:57.517+0000 I  REPL     [conn2] Scheduling remote command request for initiate quorum check: RemoteCommand 2 -- target:192.168.163.134:27019 db:admin cmd:{ replSetHeartbeat: "shard1", checkEmpty: true, configVersion: 1, hbv: 1, from: "192.168.163.134:27017", fromId: 0, term: 0 }
2021-02-24T07:55:57.521+0000 I  REPL     [conn2] ******
2021-02-24T07:55:57.522+0000 I  REPL     [conn2] creating replication oplog of size: 100MB...
2021-02-24T07:55:57.582+0000 I  REPL     [conn2] ******
2021-02-24T07:55:57.674+0000 I  REPL     [conn2] New replica set config in use: { _id: "shard1", version: 1, protocolVersion: 1, writeConcernMajorityJournalDefault: true, members: [ { _id: 0, host: "192.168.163.134:27017", arbiterOnly: false, buildIndexes: true, hidden: false, priority: 1.0, tags: {}, slaveDelay: 0, votes: 1 }, { _id: 1, host: "192.168.163.134:27018", arbiterOnly: false, buildIndexes: true, hidden: false, priority: 1.0, tags: {}, slaveDelay: 0, votes: 1 }, { _id: 2, host: "192.168.163.134:27019", arbiterOnly: false, buildIndexes: true, hidden: false, priority: 1.0, tags: {}, slaveDelay: 0, votes: 1 } ], settings: { chainingAllowed: true, heartbeatIntervalMillis: 2000, heartbeatTimeoutSecs: 10, electionTimeoutMillis: 10000, catchUpTimeoutMillis: -1, catchUpTakeoverDelayMillis: 30000, getLastErrorModes: {}, getLastErrorDefaults: { w: 1, wtimeout: 0 }, replicaSetId: ObjectId('6036068d6eda8e54419e12a1') } }
2021-02-24T07:55:57.675+0000 I  REPL     [conn2] This node is 192.168.163.134:27017 in the config
2021-02-24T07:55:57.675+0000 I  REPL     [conn2] transition to STARTUP2 from STARTUP
2021-02-24T07:55:57.676+0000 I  REPL     [replexec-0] Member 192.168.163.134:27018 is now in state STARTUP
2021-02-24T07:55:57.676+0000 I  REPL     [replexec-0] Member 192.168.163.134:27019 is now in state STARTUP
2021-02-24T07:55:57.676+0000 I  REPL     [conn2] Starting replication storage threads
2021-02-24T07:55:57.678+0000 I  REPL     [conn2] transition to RECOVERING from STARTUP2
2021-02-24T07:55:57.678+0000 I  REPL     [conn2] Starting replication fetcher thread
2021-02-24T07:55:57.678+0000 I  REPL     [conn2] Starting replication applier thread
2021-02-24T07:55:57.678+0000 I  REPL     [conn2] Starting replication reporter thread
2021-02-24T07:55:57.680+0000 I  REPL     [rsSync-0] Starting oplog application
2021-02-24T07:55:57.711+0000 I  REPL     [rsSync-0] transition to SECONDARY from RECOVERING
2021-02-24T07:55:57.711+0000 I  REPL     [rsSync-0] Resetting sync source to empty, which was :27017
2021-02-24T07:55:57.711+0000 I  REPL     [rsBackgroundSync] waiting for 2 pings from other members before syncing
2021-02-24T07:55:58.177+0000 I  REPL     [replexec-1] Member 192.168.163.134:27018 is now in state STARTUP2
2021-02-24T07:55:58.177+0000 I  REPL     [replexec-1] Member 192.168.163.134:27019 is now in state STARTUP2
2021-02-24T07:55:59.681+0000 I  REPL     [replexec-0] Member 192.168.163.134:27018 is now in state SECONDARY
2021-02-24T07:55:59.681+0000 I  REPL     [replexec-0] Member 192.168.163.134:27019 is now in state SECONDARY
2021-02-24T07:56:07.922+0000 I  REPL     [replexec-0] Scheduling remote command request for vote request: RemoteCommand 45 -- target:192.168.163.134:27018 db:admin cmd:{ replSetRequestVotes: 1, setName: "shard1", dryRun: true, term: 0, candidateIndex: 0, configVersion: 1, lastCommittedOp: { ts: Timestamp(1614153357, 1), t: -1 } }
2021-02-24T07:56:07.922+0000 I  REPL     [replexec-0] Scheduling remote command request for vote request: RemoteCommand 46 -- target:192.168.163.134:27019 db:admin cmd:{ replSetRequestVotes: 1, setName: "shard1", dryRun: true, term: 0, candidateIndex: 0, configVersion: 1, lastCommittedOp: { ts: Timestamp(1614153357, 1), t: -1 } }
2021-02-24T07:56:07.926+0000 I  REPL     [replexec-1] Scheduling remote command request for vote request: RemoteCommand 47 -- target:192.168.163.134:27018 db:admin cmd:{ replSetRequestVotes: 1, setName: "shard1", dryRun: false, term: 1, candidateIndex: 0, configVersion: 1, lastCommittedOp: { ts: Timestamp(1614153357, 1), t: -1 } }
2021-02-24T07:56:07.928+0000 I  REPL     [replexec-1] Scheduling remote command request for vote request: RemoteCommand 48 -- target:192.168.163.134:27019 db:admin cmd:{ replSetRequestVotes: 1, setName: "shard1", dryRun: false, term: 1, candidateIndex: 0, configVersion: 1, lastCommittedOp: { ts: Timestamp(1614153357, 1), t: -1 } }
2021-02-24T07:56:07.929+0000 I  REPL     [replexec-0] transition to PRIMARY from SECONDARY
2021-02-24T07:56:07.929+0000 I  REPL     [replexec-0] Resetting sync source to empty, which was :27017
2021-02-24T07:56:07.930+0000 I  REPL     [replexec-0] Entering primary catch-up mode.
2021-02-24T07:56:07.931+0000 I  REPL     [replexec-0] Caught up to the latest optime known via heartbeats after becoming primary. Target optime: { ts: Timestamp(1614153357, 1), t: -1 }. My Last Applied: { ts: Timestamp(1614153357, 1), t: -1 }
2021-02-24T07:56:07.931+0000 I  REPL     [replexec-0] Exited primary catch-up mode.
2021-02-24T07:56:07.931+0000 I  REPL     [replexec-0] Stopping replication producer
2021-02-24T07:56:07.931+0000 I  REPL     [ReplBatcher] Oplog buffer has been drained in term 1
2021-02-24T07:56:07.932+0000 I  REPL     [ReplBatcher] Oplog buffer has been drained in term 1
2021-02-24T07:56:07.932+0000 I  REPL     [RstlKillOpThread] Starting to kill user operations
2021-02-24T07:56:07.932+0000 I  REPL     [RstlKillOpThread] Stopped killing user operations
2021-02-24T07:56:07.932+0000 I  REPL     [RstlKillOpThread] State transition ops metrics: { lastStateTransition: "stepUp", userOpsKilled: 0, userOpsRunning: 0 }
2021-02-24T07:56:07.983+0000 I  REPL     [rsSync-0] transition to primary complete; database writes are now permitted
View Code

大致的流程是:檢查配置、初始化local庫的各個集合、轉換各個成員的狀態(STARTUP -> STARTUP2 -> RECOVERING -> SECONDARY)、10秒後開始選舉(SECONDARY -> PRIMARY)

TIP:

可以把副本集的配置先宣告好,再用replSetInitiate進行初始化(PSA):

> cfg = {
    _id : 'shard1',
    members: [
    { _id : 0, host : "192.168.163.134:27017" },
    { _id : 1, host : "192.168.163.134:27018" },
    { _id : 2, host : "192.168.163.134:27019", arbiterOnly: true }
              ]
    } 

> db.runCommand({ replSetInitiate : cfg })
或則
> rs.initiate(cfg)

②:有認證搭建(authorization: true)

從安全上考慮,需要為例項新增使用者來進行訪問控制。在添加了認證的例項上,副本集各個成員之間的訪問就需要認證,現在來說明通過Keyfile的方式進行成員間的認證。

1. 建立keyfile:使用YAML格式,長度為6~1024字元,並且只能包含base64集中的字元

 使用keyfile進行身份驗證,副本集中的每個mongod例項都將keyfile的內容用作共享密碼來進行身份驗證。生成方法:

openssl rand -base64 756 > xx_keyfile
chmod 400 xx_keyfile  --Linux需要

2. 生成好keyfile之後,副本集中的所有成員都共享該檔案,複製到各個例項的目錄,並修改配置檔案引數:開啟了keyFile引數之後,認證自動啟動(authorization)。

security:
   keyFile: "/usr/local/mongodb_1/xx_keyfile"
   authorization: enabled

3. 開啟例項,並進行部署:

-- 啟動3個節點
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb_1/mongo.conf 

-- 初始化副本集
> rs.initiate(
    {
    _id : 'shard1',
    members: [
    { _id : 0, host : "192.168.163.134:27017" },
    { _id : 1, host : "192.168.163.134:27018" },
    { _id : 2, host : "192.168.163.134:27019" }
              ]
    } 
   )

-- 建立管理使用者
> db.createUser(
{
user:'dba',
pwd:passwordPrompt(),
roles:[{role:'root',db:'admin'}],
customData:{name:'運維賬號'}
}
)

注意:當認證開啟之後,第一次必須建立管理使用者,後續的登入需要認證才能操作。到此,副本集部署已經完成,部署比較簡單,更多的部署資訊可以看官方文件說明。

副本集維護

維護方面的包括很多:擴容、縮容、修改屬性、副本集命令列等等,本節開始對日常工作中遇到的一些操作進行說明,關於副本集的一些命令說明可以看文件。

1. 擴容

新增節點:rs.add(host, arbiterOnly):引數為字串或則文件,arbiterOnly可選,在host為字串的時候使用。

字串的格式為:主機名(IP)和埠:

IP:Port

文件的格式為:

{
   _id: <int>,
   host: <string>,
   arbiterOnly: <boolean>,
   buildIndexes: <boolean>,
   hidden: <boolean>,
   priority: <number>,
   tags: <document>,
   slaveDelay: <int>,
   votes: <number>
}

① 用主機引數新增:該方式新增的成員屬性是預設的。

> rs.add("192.168.163.134:27019")

② 用文件引數新增:該方式新增的成員屬性可以自定義。如新增一個優先順序為0的隱藏節點:

> rs.add({"_id":3,"host":"192.168.163.134:27019","priority":0,"hidden":true})

此外,還可以新增其他屬性的成員,比如:延遲、投票、標籤、仲裁等等。

除了用rs.add新增之外,還可以用replSetReconfig(rs.reconfig)來修改配置進行新增,其中仲裁節點可以用rs.addArb來進行快速新增。

③ 新增仲裁節點:rs.addArb(host): 

> rs.addArb('192.168.163.134:27019')

2. 縮容

移除節點:rs.remove(hostname):引數為字串

字串的格式為:主機名(IP)和埠:

IP:Port

從叢集中移除剛新增的隱藏節點:

> rs.remove("192.168.163.134:27019")

除了用rs.remove移除之外,還可以用replSetReconfig(rs.reconfig)來修改配置進行移除。需要注意的執行rs.remove之前,最好關閉要刪除的副本整合員。

預設情況下,副本整合員需要等待5分鐘,然後再斷開與已刪除成員的連線,4.2之後可以在其餘其他成員上執行以下命令來關閉連線:

db.adminCommand(
  {
    "dropConnections" : 1,
    "hostAndPort" : [
      "192.168.163.134:27019"
    ]
  }
)

3. 修改成員屬性:rs.reconfig(configuration, force):引數為配置文件,force:強制副本集接受新配置,即使大多數成員不可訪問,允許向非主節點發出重新配置命令:rs.reconfig(cfg,{force:true})  。重新配置現有副本集,覆蓋現有的配置,預設必須連線到副本集的主資料庫。在某些情況下,rs.reconfig可以觸發當前主資料庫降級,通過該方法實現的主庫降級,新選出來的主大概需要花費10~12秒,後面有自動降級的方法可以減少選主時間。

4.2開始,當主資料庫降級時,不再關閉所有客戶端連線,並且正在進行的寫入將被殺死。
4.0和更早版本中,當主資料庫降級時,它將關閉所有客戶端連線。

通指定某一個成員為主,修改其優先順序為所有成員中最大:

① 獲取副本集配置文件

> cfg = rs.conf()

② 修改文件中指定成員的屬性:優先順序

> cfg.members[1].priority = 2

③ 新文件生效

> rs.reconfig(cfg)

大概10~12秒左右,會完成新主的選舉。也可以主動降級來加快新主的選擇,用rs.stepDown。

4. 主節點降級為備份節點:rs.stepDown(stepDownSecs, secondaryCatchUpPeriodSecs)

該方法不會立即降級主庫, 如果沒有可選舉的從節點,則主節點將等待secondaryCatchUpPeriodSecs(預設為10秒),以等待從節點趕上。 一旦可以選擇的從節點可用,就降級主節點。降級後,原始的主節點將成為從節點,並且在stepDownSecs指定的剩餘時間內沒有資格再次成為主節點,預設60秒。

4.2開始,rs.stepDown方法不再關閉所有客戶端連線
4.0和更早版本中,rs.stepDown方法在降級期間關閉所有客戶端連線

和3中的步驟一樣,可以先修改優先順序屬性,再在主節點上執行:

> rs.stepDown(60,10)

注意:rs.stepDown開始的時間段內,所有對主的寫入都會失敗,直到選擇了新的主資料庫,或者如果沒有可選舉的輔助資料庫,則原始主資料庫將恢復正常操作。正在進行的寫入將被殺死,正在進行的事務也會因“ TransientTransactionError”而失敗,並且可以整體重試。寫入失敗的時間最多為20秒:

secondaryCatchUpPeriodSecs(預設為10秒)+選舉超時Millis(預設為10秒)

5. 讓從節點在一定時間內不能成為主節點:rs.freeze(seconds)

始終出於備份節點狀態,強制他們出於從節點狀態。比如在需要對副本集的各個節點進行輪詢的維護,在優先順序高的節點上執行了降級之後,雖然暫時成為了從節點,但在下個選舉週期還是會被選舉成為主節點,如果維護的時間比較長,可以在降級之後再執行,讓他完成維護操作為止。

> rs.freeze(3600)

如果修改完操作之後,需要恢復,則可以直接用0來執行,不阻止升級為主節點:

> rs.freeze(0)

6. 修改同步源:rs.syncFrom(hostname):引數為IP:Port

修改當前成員的默認同步目標。 以[主機名]:[埠]的形式指定要複製的成員的名稱。從版本3.2中開始:具有投票權(>0)的副本整合員不能與沒有投票權(0)的成員同步。

配置好的副本集都是自動的對同步源進行分配,根據pingMS來尋找最新的資料來源,可能某個Secondary是另一個Secondary的同步源。如果當前主節點(PSS)的壓力比較大,可以修改從節點的同步目標,修改到另一個成員,組成一個鏈級的複製(P -> S -> S),減輕主節點的壓力,但可能會出現複製延遲不可控的情況。

① 檢視同步源

shard1:SECONDARY> db.adminCommand({"replSetGetStatus":1}).syncingTo
192.168.163.134:27018
shard1:SECONDARY> rs.status().syncingTo
192.168.163.134:27018

② 修改同步源

shard1:SECONDARY> rs.syncFrom("192.168.163.134:27017")
{
    "syncFromRequested" : "192.168.163.134:27017",
    "prevSyncTarget" : "192.168.163.134:27018",
    "ok" : 1
}


> db.adminCommand({"replSetSyncFrom":"192.168.163.134:27017"})
{
    "syncFromRequested" : "192.168.163.134:27017",
    "prevSyncTarget" : "192.168.163.134:27018",
    "ok" : 1
}

7. 檢視主從節點的延遲和OpLog資訊:rs.printReplicationInfo(),rs.printSlaveReplicationInfo() 

shard1:PRIMARY> rs.printSlaveReplicationInfo()
source: 192.168.163.134:27017   --從節1點的落後時間
    syncedTo: Thu Feb 25 2021 09:27:05 GMT+0000 (UTC)
    0 secs (0 hrs) behind the primary 
source: 192.168.163.134:27019   --從節點2的落後時間
    syncedTo: Thu Feb 25 2021 09:27:05 GMT+0000 (UTC)
    0 secs (0 hrs) behind the primary 

shard1:PRIMARY> rs.printReplicationInfo()
configured oplog size:   100MB        --oplog大小
log length start to end: 25707secs (7.14hrs)  --oplog使用的時間長度
oplog first event time:  Thu Feb 25 2021 02:18:28 GMT+0000 (UTC)   -- 第一次操作時間
oplog last event time:   Thu Feb 25 2021 09:26:55 GMT+0000 (UTC)     -- 最後一次操作時間
now:                     Thu Feb 25 2021 09:26:59 GMT+0000 (UTC)    --當前時間

以上的幾種方法是日常維護副本集會用到的,還有其他的比如:

db.serverStatus() == db.runCommand( { serverStatus: 1 } )

可帶引數:db.serverStatus( { repl: 0,  metrics: 0, locks: 0 } )、db.runCommand( { serverStatus: 1, repl: 0, metrics: 0, locks: 0 } )

XYZ:PRIMARY> db.runCommand( { serverStatus: 1 } )
{
    "host" : "lbs-postgresql01",    -- 主機名
    "version" : "4.2.8",            -- 版本
    "process" : "mongod",            -- 程序名,可能的值為:mongos或mongod
    "pid" : NumberLong(27568),        -- pid
    "uptime" : 30149,                -- 服務執行時間(秒)
    "uptimeMillis" : NumberLong(30149594),    -- 服務執行時間(毫秒)
    "uptimeEstimate" : NumberLong(30149),    -- 服務執行時間(秒),根據MongoDB內部處理統計
    "localTime" : ISODate("2020-08-13T09:20:24.614Z"),    -- 根據伺服器,以UTC表示當前時間的ISODate
    "asserts" : {    -- 報告自MongoDB流程啟動以來提出的斷言數量的文件。雖然斷言錯誤通常很少見,但是如果斷言的值不為零,則應檢查日誌檔案以獲取更多資訊。
        "regular" : 0,    -- 自MongoDB流程開始以來提出的常規宣告的數量。檢查日誌檔案以獲取有關這些訊息的更多資訊。
        "warning" : 0,    -- 該欄位返回自MongoDB程序啟動以來引發的警告數,從MongoDB 4.0開始,該欄位返回零0
        "msg" : 0,        -- 自MongoDB程序啟動以來引發的訊息宣告的數量。檢查日誌檔案以獲取有關這些訊息的更多資訊。
        "user" : 2244,    -- 自上次啟動MongoDB程序以來發生的“使用者斷言”數量。 如磁碟空間不足或重複金鑰。
        "rollovers" : 0    -- 自上次MongoDB程序啟動以來,翻轉計數器已翻轉的次數。 230個斷言後,計數器將翻轉為零。
    },
    "connections" : {  -- 報告連線狀態的文件。使用這些值可以評估伺服器的當前負載和容量要求。
        "current" : 11,    -- 當前連線數
        "available" : 52417,    -- 可用連線數
        "totalCreated" : 38,    -- 總建立的連線數
        "active" : 2            -- 活躍連線數
    },
    "electionMetrics" : {     -- 選舉資訊
        "stepUpCmd" : {        -- Primary down時,在選舉交接中呼叫的選舉指標
            "called" : NumberLong(0),
            "successful" : NumberLong(0)
        },
        "priorityTakeover" : {    -- 由mongod例項呼叫的選舉指標,因為其優先順序高於Primary
            "called" : NumberLong(0),
            "successful" : NumberLong(0)
        },
        "catchUpTakeover" : {    -- 由mongod例項呼叫的選舉指標,因為其資料比Primary新
            "called" : NumberLong(0),
            "successful" : NumberLong(0)
        },
        "electionTimeout" : {    -- 由mongod例項呼叫的選舉指標,因為其無法在settings.electionTimeoutMillis內到達Primary
            "called" : NumberLong(1),
            "successful" : NumberLong(1)
        },
        "freezeTimeout" : {        -- mongod例項在凍結期(成員無法申請選舉)之後呼叫的選舉指標
            "called" : NumberLong(0),
            "successful" : NumberLong(0)
        },
        "numStepDownsCausedByHigherTerm" : NumberLong(0),   -- 由於更高的任期(term),該mongod例項down的次數
        "numCatchUps" : NumberLong(0),                        -- 作為新當選的主必須趕上已知的最高oplog條目的選舉次數
        "numCatchUpsSucceeded" : NumberLong(0),                -- 作為新當選的主成功追上已知的最高oplog條目的次數
        "numCatchUpsAlreadyCaughtUp" : NumberLong(1),        -- 作為新當選的主完成追趕的次數,因為當選時已經被追趕
        "numCatchUpsSkipped" : NumberLong(0),                -- 作為新當選的主跳過追趕過程的次數
        "numCatchUpsTimedOut" : NumberLong(0),                -- 由於settings.catchUpTimeoutMillis限制,作為新當選的主完成其追趕過程的次數
        "numCatchUpsFailedWithError" : NumberLong(0),        -- 新當選的主追趕過程因錯誤而失敗的次數
        "numCatchUpsFailedWithNewTerm" : NumberLong(0),        -- 由於另一位成員的任期較高(即其他一位或多位議員參加了其他選舉),新當選的主追趕過程結束的次數
        "numCatchUpsFailedWithReplSetAbortPrimaryCatchUpCmd" : NumberLong(0),    -- 由於收到replSetAbortPrimaryCatchUp命令而導致的新當選的主追趕過程結束的次數
        "averageCatchUpOps" : 0                                -- 新當選的主在趕超過程中平均執行的運算元
    },
    "extra_info" : {                                        -- 提供有關基礎系統的其他資訊的文件
        "note" : "fields vary by platform",                    -- 文字為“欄位因平臺而異”的字串
        "user_time_us" : NumberLong(114316152),                -- 使用者使用的CPU時間
        "system_time_us" : NumberLong(19584160),            -- 核心使用的CPU時間
        "maximum_resident_set_kb" : NumberLong(91260),        -- 執行程式所佔用記憶體的最大值。單位是 KB
        "input_blocks" : NumberLong(0),                        -- 輸入塊
        "output_blocks" : NumberLong(263944),                -- 輸出塊
        "page_reclaims" : NumberLong(97588),                -- 頁回收數量
        "page_faults" : NumberLong(0),                        -- 數量錯誤數量
        "voluntary_context_switches" : NumberLong(1497531),    -- 主動上下文切換數量
        "involuntary_context_switches" : NumberLong(3283)    -- 被動上下文切換數量
    },
    "flowControl" : {            -- 使用流量控制時最大滯後時間。將嘗試將大多數的延遲保持在指定的秒數內(10秒)https://docs.mongodb.com/v4.2/reference/parameters/#param.enableFlowControl
        "enabled" : true,        -- 是否開啟,https://docs.mongodb.com/v4.2/reference/parameters/#param.enableFlowControl
        "targetRateLimit" : 1000000000,                -- 主伺服器上執行時,每秒可以獲取的最大票證數量;輔助伺服器上執行時,返回的數字是佔位符
        "timeAcquiringMicros" : NumberLong(780),    -- 主資料庫上執行時,寫操作等待獲取票證的總時間;輔助伺服器上執行時,返回的數字是佔位符
        "locksPerOp" : 1.167,                        -- 主伺服器上執行時,近似於每個操作獲取的鎖數;輔助伺服器上執行時,返回的數字是佔位符
        "sustainerRate" : 0,                        -- 主伺服器上執行時,輔助伺服器每秒維持提交點的每秒近似運算元;輔助伺服器上執行時,返回的數字是佔位符
        "isLagged" : false,                            -- 主資料庫上執行時,是否已使用流控制。 當大多數承諾滯後時間大於已配置的flowControlTargetLagSeconds的某個百分比時,將啟用流控制
        "isLaggedCount" : 0,                        -- 主伺服器上執行時,自上次重新啟動以來流控制已參與的次數;輔助伺服器上執行時,返回的數字是佔位符
        "isLaggedTimeMicros" : NumberLong(0)        -- 主伺服器上執行時,自上次重新啟動以來已花費了多少時間進行流控制
    },
    "freeMonitoring" : {                            -- 是否開啟雲監控
        "state" : "undecided"
    },
    "globalLock" : {                                -- 報告資料庫鎖定狀態的文件,
        "totalTime" : NumberLong("30149591000"),    -- 自資料庫啟動並建立globalLock以來的時間(以微秒為單位)。這大致相當於伺服器的總正常執行時間。
        "currentQueue" : {                            -- 由於鎖而排隊的運算元的資訊的文件
            "total" : 0,                            -- 排隊等待鎖定的操作總數(即globalLock.currentQueue.readers和globalLock.currentQueue.writers的總和)
            "readers" : 0,                            -- 當前排隊並等待讀鎖定的運算元。始終較小的讀取佇列,尤其是較短的操作,不會引起任何問題。
            "writers" : 0                            -- 當前排隊並等待寫鎖定的運算元。始終較小的寫佇列,尤其是較短操作的寫佇列,無需擔心。
        },
        "activeClients" : {                            -- 提供有關已連線客戶端數量以及這些客戶端執行的讀取和寫入操作的資訊的文件。
            "total" : 0,                            -- 與資料庫的內部客戶端連線總數,包括系統執行緒以及排隊的讀取器和寫入器。
            "readers" : 0,                            -- 執行讀取操作的活動客戶端連線數。
            "writers" : 0                            -- 執行寫操作的活動客戶端連線數。
        }
    },
    "locks" : {                                        -- 針對每個鎖<型別>報告有關鎖<模式>的資料的文件。https://docs.mongodb.com/v4.2/reference/command/serverStatus/#locks
        "ParallelBatchWriterMode" : {                -- 並行批處理寫入器模式的鎖
            "acquireCount" : {                        -- 在指定模式下獲取鎖定的次數
                "r" : NumberLong(32460)                -- 意向讀鎖(IS)
            }
        },
        "ReplicationStateTransition" : {            -- 副本整合員狀態轉換的鎖定
            "acquireCount" : {                        -- 在指定模式下獲取鎖定的次數
                "w" : NumberLong(209603),            -- 意向寫鎖(IX)
                "W" : NumberLong(2)                    -- 排他(X)鎖
            },
            "acquireWaitCount" : {                    -- 由於鎖處於衝突模式而導致的locks.acquireCount鎖獲取遇到的等待次數。
                "w" : NumberLong(2),                -- 意向寫鎖(IX)
                "W" : NumberLong(1)                    -- 排他(X)鎖
            },
            "timeAcquiringMicros" : {                -- 鎖定獲取的累積等待時間(以微秒為單位)
                "w" : NumberLong(175),                -- 意向寫鎖(IX)
                "W" : NumberLong(2)                    -- 排他(X)鎖
            }
        },
        "Global" : {                                -- 全域性鎖
            "acquireCount" : {                        -- 在指定模式下獲取鎖定的次數
                "r" : NumberLong(206263),            -- 意向讀鎖(IS)
                "w" : NumberLong(3335),                -- 意向寫鎖(IX)
                "W" : NumberLong(5)                    -- 排他(X)鎖
            },
            "acquireWaitCount" : {                    -- 由於鎖處於衝突模式而導致的locks.acquireCount鎖獲取遇到的等待次數。
                "w" : NumberLong(1),                -- 意向寫鎖(IX)
                "W" : NumberLong(1)                    -- 排他(X)鎖
            },
            "timeAcquiringMicros" : {                -- 鎖定獲取的累積等待時間(以微秒為單位)
                "w" : NumberLong(11524),            -- 意向寫鎖(IX)
                "W" : NumberLong(36)                -- 排他(X)鎖
            }
        },
        "Database" : {                                -- 資料庫鎖
            "acquireCount" : {                        -- 在指定模式下獲取鎖定的次數
                "r" : NumberLong(145945),            -- 意向讀鎖(IS)
                "w" : NumberLong(496),                -- 意向寫鎖(IX)
                "W" : NumberLong(27)                -- 排他(X)鎖
            },
            "acquireWaitCount" : {                    -- 由於鎖處於衝突模式而導致的locks.acquireCount鎖獲取遇到的等待次數。
                "r" : NumberLong(2)                    -- 意向讀鎖(IS)
            },
            "timeAcquiringMicros" : {                -- 鎖定獲取的累積等待時間(以微秒為單位)
                "r" : NumberLong(10074)                -- 意向讀鎖(IS)
            }
        },
        "Collection" : {                            -- 集合鎖
            "acquireCount" : {                        -- 在指定模式下獲取鎖定的次數
                "r" : NumberLong(34475),            -- 意向讀鎖(IS)
                "w" : NumberLong(494),                -- 意向寫鎖(IX)
                "R" : NumberLong(1),                -- 共享(S)鎖
                "W" : NumberLong(18)                -- 排他(X)鎖
            }
        },
        "Metadata" : {                                -- 元資料鎖
            "acquireCount" : {                        -- 在指定模式下獲取鎖定的次數
                "W" : NumberLong(1)                    -- 排他(X)鎖
            }
        },
        "Mutex" : {                                    -- 互斥鎖
            "acquireCount" : {                        -- 在指定模式下獲取鎖定的次數
                "r" : NumberLong(126997)            -- 意向(IS)
            }
        },
        "oplog" : {                                    -- oplog鎖
            "acquireCount" : {                        -- 在指定模式下獲取鎖定的次數
                "r" : NumberLong(115593),            -- 意向讀鎖(IS)
                "w" : NumberLong(2),                -- 共享(S)鎖
                "W" : NumberLong(1)                    -- 排他(X)鎖
            }
        }
    },
    "logicalSessionRecordCache" : {            -- 提供有關伺服器會話快取的指標
        "activeSessionsCount" : 1,            -- 自上次重新整理週期以來,由mongod或mongos例項快取在記憶體中所有活動的本地會話數。
        "sessionsCollectionJobCount" : 101,    -- 跟蹤重新整理過程在config.system.sessions集合上執行的次數的數字。
        "lastSessionsCollectionJobDurationMillis" : 4,    -- 上次重新整理的時間(以毫秒為單位)
        "lastSessionsCollectionJobTimestamp" : ISODate("2020-08-13T09:17:55.863Z"),        -- 上次刷新發生的時間
        "lastSessionsCollectionJobEntriesRefreshed" : 1,    -- 在上次重新整理期間重新整理的會話數。
        "lastSessionsCollectionJobEntriesEnded" : 0,        -- 在上一次重新整理期間結束的會話數。
        "lastSessionsCollectionJobCursorsClosed" : 0,        -- 在上一次config.system.sessions集合重新整理期間關閉的遊標數。
        "transactionReaperJobCount" : 101,                    -- 跟蹤事務記錄清除過程已在config.transactions集合上執行的次數的數字。
        "lastTransactionReaperJobDurationMillis" : 0,        -- 上次事務記錄清除的長度(以毫秒為單位)
        "lastTransactionReaperJobTimestamp" : ISODate("2020-08-13T09:17:55.863Z"),    -- 上次事務記錄清除的時間
        "lastTransactionReaperJobEntriesCleanedUp" : 0,        -- config.transactions集合中上次事務記錄清除期間刪除的條目數。
        "sessionCatalogSize" : 0                            -- 對於mongod例項,config.transactions條目的記憶體快取大小;對於mongos例項:localLogicalSessionTimeoutMinutes內未過期的可重試寫入或事務
    },
    "network" : {                                    -- MongoDB網路使用情況資料的文件。https://docs.mongodb.com/v4.2/reference/command/serverStatus/#network
        "bytesIn" : NumberLong(25843431),            -- 接收的網路流量的位元組數
        "bytesOut" : NumberLong(32178855),            -- 傳送的網路流量的位元組數
        "physicalBytesIn" : NumberLong(18156427),
        "physicalBytesOut" : NumberLong(22163279),
        "numRequests" : NumberLong(57762),            -- 收到的不同請求的總數
        "compression" : {                            -- 壓縮資訊
            "snappy" : {
                "compressor" : {                    -- compressor資訊
                    "bytesIn" : NumberLong(37694572),
                    "bytesOut" : NumberLong(26683033)
                },
                "decompressor" : {                    -- decompressor資訊
                    "bytesIn" : NumberLong(27727534),
                    "bytesOut" : NumberLong(41769607)
                }
            },
            "zstd" : {
                "compressor" : {
                    "bytesIn" : NumberLong(0),
                    "bytesOut" : NumberLong(0)
                },
                "decompressor" : {
                    "bytesIn" : NumberLong(0),
                    "bytesOut" : NumberLong(0)
                }
            },
            "zlib" : {
                "compressor" : {
                    "bytesIn" : NumberLong(0),
                    "bytesOut" : NumberLong(0)
                },
                "decompressor" : {
                    "bytesIn" : NumberLong(0),
                    "bytesOut" : NumberLong(0)
                }
            }
        },
        "serviceExecutorTaskStats" : {
            "executor" : "passthrough",
            "threadsRunning" : 11
        }
    },
    "opLatencies" : {                            -- 僅適用於mongod例項,包含整個例項的操作延遲
        "reads" : {                                -- 讀取請求的延遲統計資訊
            "latency" : NumberLong(1140144),    
            "ops" : NumberLong(8506)
        },
        "writes" : {                            -- 寫入操作的延遲統計資訊
            "latency" : NumberLong(0),
            "ops" : NumberLong(0)
        },
        "commands" : {                            -- 資料庫命令的延遲統計資訊
            "latency" : NumberLong(3201015),
            "ops" : NumberLong(49254)
        },
        "transactions" : {                        -- 事務的延遲統計資訊
            "latency" : NumberLong(0),
            "ops" : NumberLong(0)
        }
    },
    "opReadConcernCounters" : {                    -- 自上次啟動以來,向mongod例項報告查詢操作指定的讀取關注級別的文件。
        "available" : NumberLong(0),            -- 指定讀取關注級別“可用”的查詢運算元
        "linearizable" : NumberLong(0),            -- 指定讀取關注級別“linearizable”的查詢運算元
        "local" : NumberLong(2),                -- 指定讀取關注級別“本地”的查詢運算元
        "majority" : NumberLong(0),                -- 指定讀取關注級別“多數”的查詢運算元
        "snapshot" : NumberLong(0),                -- 指定讀取關注級別“快照”的查詢運算元
        "none" : NumberLong(111)                -- 未指定讀關注級別,而是使用預設讀關注級別的查詢運算元。
    },
    "opcounters" : {                            -- 自mongod例項上次啟動以來按型別報告資料庫操作的文件
        "insert" : NumberLong(3),                -- 自mongod例項上次啟動以來收到的插入操作總數
        "query" : NumberLong(113),                -- 自mongod例項上次啟動以來收到的查詢總數
        "update" : NumberLong(9),                -- 自mongod例項上次啟動以來收到的更新操作總數
        "delete" : NumberLong(2),                -- 自mongod例項上次啟動以來的刪除操作總數
        "getmore" : NumberLong(8489),            -- 自上次啟動mongod例項以來,“getmore”操作的總數。即使查詢計數很低,此計數器也可能很高。輔助節點在複製過程中傳送getMore操作。
        "command" : NumberLong(49404)            -- 自mongod例項上次啟動以來,釋出到資料庫的命令總數
    },
    "opcountersRepl" : {                        -- 自mongod例項上次啟動以來按型別報告資料庫複製操作的文件,僅噹噹前主機是副本集的成員時,才會顯示這些值
        "insert" : NumberLong(0),                -- 插入總數
        "query" : NumberLong(0),                -- 查詢總數
        "update" : NumberLong(0),                -- 更新總數
        "delete" : NumberLong(0),                -- 刪除總數
        "getmore" : NumberLong(0),                -- getmore總數
        "command" : NumberLong(0)                -- 命令總數
    },
    "oplogTruncation" : {                                -- 當前例項是副本集的成員並使用WiredTiger Storage Engine時,才顯示該欄位。
        "totalTimeProcessingMicros" : NumberLong(33),    -- 掃描或採樣操作日誌以確定操作日誌截斷點所花費的總時間(以微秒為單位)
        "processingMethod" : "scanning",                -- 啟動時用於確定oplog截斷點的方法。 該值可以是“取樣”或“掃描”。
        "totalTimeTruncatingMicros" : NumberLong(0),    -- 執行oplog截斷所花費的累積時間(以微秒為單位)
        "truncateCount" : NumberLong(0)                    -- oplog截斷的累積數量
    },
    "repl" : {                                    -- 報告副本集配置的文件。僅噹噹前主機是副本集時才會出現repl。
        "hosts" : [                                -- 成員主機名
            "11.11.11.11:27017",
            "11.11.11.12:27017",
            "11.11.11.13:27017"
        ],
        "setName" : "XYZ",                        -- 副本集名稱
        "setVersion" : 1,                        -- 版本
        "ismaster" : true,                        -- 當前節點是否為副本集的主節點
        "secondary" : false,                    -- 當前節點是否為副本集的輔助節點
        "primary" : "11.11.11.11:27017",        -- 主節點地址
        "me" : "11.11.11.11:27017",                -- 當前執行的地址
        "electionId" : ObjectId("7fffffff0000000000000001"),
        "lastWrite" : {
            "opTime" : {                        -- 該成員所報告的有關該成員所應用操作日誌中最後一次操作的資訊
                "ts" : Timestamp(1597310423, 1),
                "t" : NumberLong(1)
            },
            "lastWriteDate" : ISODate("2020-08-13T09:20:23Z"),
            "majorityOpTime" : {
                "ts" : Timestamp(1597310423, 1),
                "t" : NumberLong(1)
            },
            "majorityWriteDate" : ISODate("2020-08-13T09:20:23Z")
        },
        "rbid" : 1                                -- 回滾識別符號。用於確定此mongod例項是否發生了回滾
    },
    "storageEngine" : {                            -- 有關當前儲存引擎資料的文件
        "name" : "wiredTiger",                    -- 當前儲存引擎的名稱
        "supportsCommittedReads" : true,        -- 儲存引擎是否支援“多數”讀取關注的布林值
        "oldestRequiredTimestampForCrashRecovery" : Timestamp(1597310403, 1),
        "supportsPendingDrops" : true,
        "dropPendingIdents" : NumberLong(0),
        "supportsSnapshotReadConcern" : true,
        "readOnly" : false,                        -- 是否只讀
        "persistent" : true,                    -- 指示儲存引擎是否將資料持久儲存到磁碟的布林值
        "backupCursorOpen" : false
    },
    "tcmalloc" : {
        "generic" : {
            "current_allocated_bytes" : 137730688,
            "heap_size" : 176914432
        },
        "tcmalloc" : {
            "pageheap_free_bytes" : 2736128,
            "pageheap_unmapped_bytes" : 31244288,
            "max_total_thread_cache_bytes" : 1024458752,
            "current_total_thread_cache_bytes" : 1950976,
            "total_free_bytes" : 5203328,
            "central_cache_free_bytes" : 427840,
            "transfer_cache_free_bytes" : 2824512,
            "thread_cache_free_bytes" : 1950976,
            "aggressive_memory_decommit" : 0,
            "pageheap_committed_bytes" : 145670144,
            "pageheap_scavenge_count" : 575,
            "pageheap_commit_count" : 1376,
            "pageheap_total_commit_bytes" : NumberLong(1139781632),
            "pageheap_decommit_count" : 575,
            "pageheap_total_decommit_bytes" : 994111488,
            "pageheap_reserve_count" : 60,
            "pageheap_total_reserve_bytes" : 176914432,
            "spinlock_total_delay_ns" : 1320,
            "release_rate" : 1,
            "formattedString" : "------------------------------------------------\nMALLOC:      137731264 (  131.4 MiB) Bytes in use by application\nMALLOC: +      2736128 (    2.6 MiB) Bytes in page heap freelist\nMALLOC: +       427840 (    0.4 MiB) Bytes in central cache freelist\nMALLOC: +      2824512 (    2.7 MiB) Bytes in transfer cache freelist\nMALLOC: +      1950400 (    1.9 MiB) Bytes in thread cache freelists\nMALLOC: +      2883584 (    2.8 MiB) Bytes in malloc metadata\nMALLOC:   ------------\nMALLOC: =    148553728 (  141.7 MiB) Actual memory used (physical + swap)\nMALLOC: +     31244288 (   29.8 MiB) Bytes released to OS (aka unmapped)\nMALLOC:   ------------\nMALLOC: =    179798016 (  171.5 MiB) Virtual address space used\nMALLOC:\nMALLOC:           1434              Spans in use\nMALLOC:             71              Thread heaps in use\nMALLOC:           4096              Tcmalloc page size\n------------------------------------------------\nCall ReleaseFreeMemory() to release freelist memory to the OS (via madvise()).\nBytes released to the OS take up virtual address space but no physical memory.\n"
        }
    },
    "trafficRecording" : {                -- 輸出中包括trafficRecording指標
        "running" : false
    },
    "transactions" : {                    -- 包含有關事務資料的文件,在3.6.3+的mongod和4.2+的mongos中可用。https://docs.mongodb.com/v4.2/reference/command/serverStatus/#transactions
        "retriedCommandsCount" : NumberLong(0),            -- 僅在mongod上可用。在已經提交了相應的可重試寫入命令之後,已接收到的重試嘗試總數。
        "retriedStatementsCount" : NumberLong(0),        -- 寫語句總數,與transaction.retriedCommandsCount中重試的命令相關聯
        "transactionsCollectionWriteCount" : NumberLong(0),        -- 僅在mongod上可用,提交新的可重試的寫語句時觸發對config.transactions集合的寫總數
        "currentActive" : NumberLong(0),                -- 當前正在執行的事務總數
        "currentInactive" : NumberLong(0),                -- 當前未執行命令的事務總數
        "currentOpen" : NumberLong(0),                    -- 當前開啟事務的總數
        "totalAborted" : NumberLong(0),                    -- 例項自上次啟動以來中止的事務總數
        "totalCommitted" : NumberLong(0),                -- 例項自上次啟動以來在例項上提交的事務總數
        "totalStarted" : NumberLong(0),                    -- 例項自上次啟動以來在例項上啟動的事務總數
        "totalPrepared" : NumberLong(0),                -- 例項自上次啟動以來在伺服器上處於準備狀態的事務總數
        "totalPreparedThenCommitted" : NumberLong(0),    -- 例項自上次啟動以來在伺服器上準備並提交的事務總數
        "totalPreparedThenAborted" : NumberLong(0),        -- 例項自上次啟動以來在伺服器上準備並中止的事務總數
        "currentPrepared" : NumberLong(0)                -- 伺服器上處於準備狀態的當前事務數
    },
    "transportSecurity" : {                                -- 建立的TLS <version>連線的累積數量。 重新啟動後將重置該值。
        "1.0" : NumberLong(0),
        "1.1" : NumberLong(0),
        "1.2" : NumberLong(0),
        "1.3" : NumberLong(0),
        "unknown" : NumberLong(0)
    },
    "twoPhaseCommitCoordinator" : {                        -- 二階段提交資訊
        "totalCreated" : NumberLong(0),
        "totalStartedTwoPhaseCommit" : NumberLong(0),
        "totalAbortedTwoPhaseCommit" : NumberLong(0),
        "totalCommittedTwoPhaseCommit" : NumberLong(0),
        "currentInSteps" : {
            "writingParticipantList" : NumberLong(0),
            "waitingForVotes" : NumberLong(0),
            "writingDecision" : NumberLong(0),
            "waitingForDecisionAcks" : NumberLong(0),
            "deletingCoordinatorDoc" : NumberLong(0)
        }
    },
    "wiredTiger" : {                    -- 使用WiredTiger儲存引擎時資訊才會出現。一些統計彙總資訊。https://docs.mongodb.com/v4.2/reference/command/serverStatus/#wiredtiger
        "uri" : "statistics:",            -- 一個字串。 供MongoDB內部使用。
        "async" : {                        -- 返回與非同步操作API相關的統計資訊的文件,MongoDB未使用它。
            "current work queue length" : 0,
            "maximum work queue length" : 0,
            "number of allocation state races" : 0,
            "number of flush calls" : 0,
            "number of operation slots viewed for allocation" : 0,
            "number of times operation allocation failed" : 0,
            "number of times worker found no work" : 0,
            "total allocations" : 0,
            "total compact calls" : 0,
            "total insert calls" : 0,
            "total remove calls" : 0,
            "total search calls" : 0,
            "total update calls" : 0
        },
        "block-manager" : {                -- 返回有關塊管理器操作的統計資訊的文件
            "blocks pre-loaded" : 0,
            "blocks read" : 1458,
            "blocks written" : 5954,
            "bytes read" : 5971968,
            "bytes written" : 39948288,
            "bytes written for checkpoint" : 39948288,
            "mapped blocks read" : 0,
            "mapped bytes read" : 0
        },
        "cache" : {                        -- 有關快取的統計資訊和來自快取的頁面逐出的文件
            "application threads page read from disk to cache count" : 0,
            "application threads page read from disk to cache time (usecs)" : 0,
            "application threads page write from cache to disk count" : 2972,
            "application threads page write from cache to disk time (usecs)" : 181330,
            "bytes belonging to page images in the cache" : 43,
            "bytes belonging to the cache overflow table in the cache" : 182,
            "bytes currently in the cache" : 753495,                -- 當前快取中資料的位元組大小,該值不應大於配置的最大位元組數。
            "bytes dirty in the cache cumulative" : 2438469,
            "bytes not belonging to page images in the cache" : 753452,
            "bytes read into cache" : 0,
            "bytes written from cache" : 52711232,
            "cache overflow cursor application thread wait time (usecs)" : 0,
            "cache overflow cursor internal thread wait time (usecs)" : 0,
            "cache overflow score" : 0,
            "cache overflow table entries" : 0,
            "cache overflow table insert calls" : 0,
            "cache overflow table max on-disk size" : 0,
            "cache overflow table on-disk size" : 0,
            "cache overflow table remove calls" : 0,
            "checkpoint blocked page eviction" : 0,
            "eviction calls to get a page" : 1148,
            "eviction calls to get a page found queue empty" : 1129,
            "eviction calls to get a page found queue empty after locking" : 0,
            "eviction currently operating in aggressive mode" : 0,
            "eviction empty score" : 0,
            "eviction passes of a file" : 0,
            "eviction server candidate queue empty when topping up" : 0,
            "eviction server candidate queue not empty when topping up" : 0,
            "eviction server evicting pages" : 0,
            "eviction server slept, because we did not make progress with eviction" : 1056,
            "eviction server unable to reach eviction goal" : 0,
            "eviction server waiting for a leaf page" : 4,
            "eviction state" : 128,
            "eviction walk target pages histogram - 0-9" : 0,
            "eviction walk target pages histogram - 10-31" : 0,
            "eviction walk target pages histogram - 128 and higher" : 0,
            "eviction walk target pages histogram - 32-63" : 0,
            "eviction walk target pages histogram - 64-128" : 0,
            "eviction walk target strategy both clean and dirty pages" : 0,
            "eviction walk target strategy only clean pages" : 0,
            "eviction walk target strategy only dirty pages" : 0,
            "eviction walks abandoned" : 0,
            "eviction walks gave up because they restarted their walk twice" : 0,
            "eviction walks gave up because they saw too many pages and found no candidates" : 0,
            "eviction walks gave up because they saw too many pages and found too few candidates" : 0,
            "eviction walks reached end of tree" : 0,
            "eviction walks started from root of tree" : 0,
            "eviction walks started from saved location in tree" : 0,
            "eviction worker thread active" : 4