Backup

解析 rs.status() 輸出以顯示 mongodump 目標的一個輔助節點

  • September 17, 2019

我希望將 mongodump 執行到輔助(不是主)。所以我需要作為輸出主機名和一個輔助埠。

# ./mongo  -udbadm admin --port 27100 -p --quiet --eval "printjson(rs.status().members.map(function(m) { return {'name':m.name, 'stateStr':m.stateStr} }))"
Enter password: 
[
       {
               "name" : "example-1.domain:27200",
               "stateStr" : "SECONDARY"
       },
       {
               "name" : "example-2.domain:27200",
               "stateStr" : "PRIMARY"
       },
       {
               "name" : "example-3.domain:27200",
               "stateStr" : "SECONDARY"
       }
]

使用 shell 腳本工具對我來說提取一個帶有主機名和埠的輔助文件是沒有問題的。我的問題是如何以 MongoDB 的方式完成這項工作?你推薦我什麼工具?我聽說這jq對 JSON 數據更好。但不知道如何只提取一台輔助主機。

值得注意的是,如果您將副本集字元串傳遞給mongodump它,則預設從集合中的輔助節點讀取(注意:在 3.0.5+ 中,如果您連接到分片mongos集群中的 a 則不是這種情況)。如果您的副本集名稱是 repl1,它將類似於:

./mongodump --host repl1/example-1.domain:27200,example-2.domain:27200 

作為參考,在較新的版本中(因為工具是在 中重新編寫的Go),這是通過在未連接到 a 時設置Monotonic模式mongos來完成的(來源來自 3.0.6 here)。

要回答您的具體問題,解析 rs.status() 的一種非常簡單的方法是使用過濾器,它將適合一行:

rs.status().members.filter(function(rsStatus) { return rsStatus.state === 2;})[0].name 

這將返回在返回的成員數組中找到的第一個(因此[0])輔助( )的名稱欄位state === 2``rs.status()

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