MongoDB系統庫

本文基於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裏的數據就會丟失

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章