本文基於MongoDB社區版 3.4.21、3.6.12、4.0.11,WT引擎。
一、單節點
單節點啓動後會有admin、config、local三個庫(3.4沒有config庫)
1、admin庫
當Mongod啓用auth選項時,用戶需要創建數據庫帳號,訪問時根據帳號信息來鑑權,而數據庫帳號信息就存儲在admin數據庫下。
三個版本單節點都是默認只有 system.version 集合。
另外還會有下面兩個集合:
db.getCollectionNames()
[ "system.users", "system.version" ]
- system.version:authSchema的版本信息
- system.users:數據庫帳號信息
- system.roles:用戶創建的自定義的角色
2、config庫
單節點只有system.sessions集合(3.6和4.0)
db.getCollectionNames()
[ "system.sessions" ]
> db.system.sessions.find().pretty()
{
"_id" : {
"id" : UUID("d491010e-3998-4256-b17e-86e2ced4c12f"),
"uid" : BinData(0,"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=")
},
"lastUse" : ISODate("2019-07-31T07:56:33.202Z")
}
3、local庫
單節點只有startup_log集合
{
"_id" : "<string>",
"hostname" : "<string>",
"startTime" : ISODate("<date>"),
"startTimeLocal" : "<string>",
"cmdLine" : {
"dbpath" : "<path>",
"<option>" : <value>
},
"pid" : <number>,
"buildinfo" : {
"version" : "<string>",
"gitVersion" : "<string>",
"sysInfo" : "<string>",
"loaderFlags" : "<string>",
"compilerFlags" : "<string>",
"allocator" : "<string>",
"versionArray" : [ <num>, <num>, <...> ],
"javascriptEngine" : "<string>",
"bits" : <number>,
"debug" : <boolean>,
"maxBsonObjectSize" : <number>
}
}
集合裏每個字段含義:
_id:包含主機名和毫秒記錄的啓動開始時間
hostname:主機名
startTime:啓動時間,ISODate(零時區)
startTimeLocal:啓動時間,當前時區
cmdLine:mongod運行時的參數和值
pid:進程id
buildinfo:有關構建環境和編譯mongod的信息
二、副本集
副本集配置啓動後會有admin、config、local三個庫(3.4沒有config庫)
1、admin庫
和單節點一樣,也是有三個集合
- system.version:authSchema的版本信息
- system.users:數據庫帳號信息
- system.roles:用戶創建的自定義的角色
- system.profile:記錄慢查詢
沒有新建任意user前,3.4、3.6執行命令show dbs會報錯,4.0不顯示數據
3.6、4.0還有另外一個集合:
- system.keys
system.profile集合:
固定大小,可開啓和關閉,有三個級別:
0:分析器關閉,不收集數據,默認級別
1:記錄超過slowms值的操作,默認100ms
2:記錄所有操作
3.6和4.0可以在每個數據庫上開啓profile,在哪個庫開啓就會在哪個庫裏生成system.profile文件
db.getProfilingStatus() 查看profile狀態
db.setProfilingLevel(2) 設置級別
db.setProfilingLevel(1,200) 設置級別和時間
> db.system.profile.find().sort({$natrual: -1}).pretty()
{
"op" : "insert", #操作類型
"ns" : "admin.system.keys", #操作集合
"command" : { #如果操作是一個command,則command語句記錄在此
"insert" : "system.keys",
"bypassDocumentValidation" : false,
"ordered" : true,
"documents" : [ #操作的文檔內容
{
"_id" : NumberLong("6720157387556126721"),
"purpose" : "HMAC",
"key" : BinData(0,"+b1y3EEiAotQVRbepLmbm1rmJd4="),
"expiresAt" : Timestamp(1572434570, 0)
}
],
"writeConcern" : { #寫關注
"w" : "majority",
"wtimeout" : 60000
},
"$db" : "admin"
},
"ninserted" : 1, #此次操作插入的文檔數
"keysInserted" : 1,
"numYield" : 0,
"locks" : { #操作過程中產生的鎖
"Global" : { #全局鎖
"acquireCount" : { #請求鎖的次數
"r" : NumberLong(5),
"w" : NumberLong(5)
}
},
"Database" : {
"acquireCount" : {
"w" : NumberLong(2),
"W" : NumberLong(3)
}
},
"Collection" : {
"acquireCount" : {
"w" : NumberLong(2)
}
},
"oplog" : {
"acquireCount" : {
"w" : NumberLong(2)
}
}
},
"responseLength" : 214, #結果返回的大小,單位是Bytes
"protocol" : "op_msg",
"millis" : 1086,
"ts" : ISODate("2019-08-01T11:22:51.902Z"),
"client" : "",
"allUsers" : [ ],
"user" : ""
}
system.keys集合:需要__system角色打開
> db.system.keys.find()
{ "_id" : NumberLong("6720157387556126721"), "purpose" : "HMAC", "key" : BinData(0,"+b1y3EEiAotQVRbepLmbm1rmJd4="), "expiresAt" : Timestamp(1572434570, 0) }
{ "_id" : NumberLong("6720157387556126722"), "purpose" : "HMAC", "key" : BinData(0,"OABX4QZU3C6sdOI3EKj2LlQtkyE="), "expiresAt" : Timestamp(1580210570, 0) }
2、config庫
3.4沒有這個庫;
3.6和4.0有這兩個集合:
- system.sessions
- transactions
system.sessions集合:需要__system角色打開
> db.system.sessions.find()
{ "_id" : { "id" : UUID("312b809d-f803-4337-9b20-69c4e2210111"), "uid" : BinData(0,"Y5mrDaxi8gv8RmdTsQ+1j7fmkr7JUsabhNmXAheU0fg=") }, "lastUse" : ISODate("2019-08-01T12:46:58.830Z"), "user" : { "name" : "root@admin" } }
{ "_id" : { "id" : UUID("e506aabc-2e42-4c5c-bf27-ff422acbe821"), "uid" : BinData(0,"+4UbpPFz9hCPjjdCpxi6Q3h1xgS8xiPKP9i/uOd1Z6w=") }, "lastUse" : ISODate("2019-08-01T12:57:21.953Z"), "user" : { "name" : "root1@admin" } }
3、local庫
local數據庫裏的內容不會同步到副本集裏其他節點上去;主要存儲副本集的配置信息、oplog信息。
3.4和3.6都有集合:
- me
- oplog.rs
- replset.election
- replset.minvalid
- startup_log
- system.profile
- system.replset
3.6還有集合:
- system.rollback.id
4.0的全部集合:
- oplog.rs
- replset.election
- replset.minvalid
- replset.oplogTruncateAfterPoint
- startup_log
- system.profile
- system.replset
- system.rollback.id
以下對各個集合進行說明.
me集合:
> db.me.find()
{ "_id" : ObjectId("5d42cb567bcca6fdecc4712a"), "host" : "vm1" }
oplog.rs:存儲oplog的固定大小集合
replset.election集合:
> db.replset.election.find()
{ "_id" : ObjectId("5d42cb897bcca6fdecc471bd"), "term" : NumberLong(1), "candidateIndex" : NumberLong(0) }
replset.minvalid集合:內部使用,跟蹤複製狀態
> db.replset.minvalid.find()
{ "_id" : ObjectId("5d42a86c34683d5c080e38af"), "ts" : Timestamp(0, 0), "t" : NumberLong(-1) }
startup_log集合:和單節點一樣
system.replset集合:副本集的配置信息,和使用rs.conf()命令看到的一樣
{
_id: <string>,
version: <int>,
protocolVersion: <number>,
writeConcernMajorityJournalDefault: <boolean>,
configsvr: <boolean>,
members: [
{
_id: <int>,
host: <string>,
arbiterOnly: <boolean>,
buildIndexes: <boolean>,
hidden: <boolean>,
priority: <number>,
tags: <document>,
slaveDelay: <int>,
votes: <number>
},
...
],
settings: {
chainingAllowed : <boolean>,
heartbeatIntervalMillis : <int>,
heartbeatTimeoutSecs: <int>,
electionTimeoutMillis : <int>,
catchUpTimeoutMillis : <int>,
getLastErrorModes : <document>,
getLastErrorDefaults : <document>,
replicaSetId: <ObjectId>
}
}
各個字段的含義:
_id:副本集的名字,無法修改
version:修改迭代次數
configsvr:指示覆制集是否用於分片集羣的配置server
protocolVersion:副本集協議版本,默認爲1,3.2及以前爲0
writeConcernMajorityJournalDefault:true if protocolVersion is 1 and false if protocolVersion is 0;跟寫關注有關
members:副本集成員信息,存儲形式是沒有索引的數組。
members[n].arbiterOnly:是否是仲裁節點
members[n].buildIndexes:只能在添加節點時設置此值。有查詢就要設置爲true。一般只有滿足1.只執行mongodump備份2.沒有查詢3.索引的創建和維護使主機負載過重纔會設置爲false,設置爲false,必須設置members[n].priorityto爲0否則添加節點報錯。
members[n].hidden:是否是隱藏節點
members[n].priority:優先級,0~1000,數字越大優先級越高。仲裁節點爲0。
members[n].slaveDelay:應該滯後的秒數,用於延遲節點
members[n].votes:0或1,仲裁節點總是爲1
settings:副本集的配置選項
chainingAllowed:爲true,副本集允許secondary節點從其他的副本集節點複製;爲false,只能從主複製
getLastErrorDefaults:寫關注默認寫入設置參數,如cfg.settings.getLastErrorDefaults = { w: "majority", wtimeout: 5000 }
heartbeatTimeoutSecs:副本集成員等待彼此成功心跳的秒數,超過此時間則標記爲無法訪問,僅在protocolVersion爲0時使用
electionTimeoutMillis:和heartbeatTimeoutSecs類似,單位毫秒,僅在protocolVersion爲1時使用
catchUpTimeoutMillis:默認-1
catchUpTakeoverDelayMillis:默認30000毫秒
heartbeatIntervalMillis:心跳頻率,單位毫秒
replicaSetId:初始化副本集時自動創建,無法修改
system.rollback.id集合:需要__system角色纔可以打開
> db.system.rollback.id.find()
{ "_id" : "rollbackId", "rollbackId" : 1 }
replset.oplogTruncateAfterPoint集合:When we kill a secondary, we check some invariants in the minValid document. We should extend these to the oplogTruncateAfterPoint.
注意:
重要的數據千萬不要存儲在local數據庫中,否則當一個節點故障時,存儲在local裏的數據就會丟失