MongoDB三大系統庫詳解

一、概述

  MongoDB默認會創建admin、config、local、test數據庫。test庫是一個默認的數據庫,除了test庫外admin、config、local庫爲系統庫。admin庫主要存儲MongoDB的用戶、角色等信息,config庫主要存儲分片集羣基礎信息,local庫主要存儲副本集的元數據。

二、admin庫

  當MongoDB啓用auth選項時,用戶需要創建數據庫帳號,訪問時根據帳號信息來鑑權,而數據庫帳號信息就存儲在admin數據庫下。

single:PRIMARY> use admin
switched to db admin
single:PRIMARY> db.auth("root","abc123")
1
single:PRIMARY> show collections;
system.keys
system.roles
system.users
system.version

system.version存儲authSchema的版本信息

single:PRIMARY> db.system.version.find()
{ "_id" : "featureCompatibilityVersion", "version" : "4.2" }
{ "_id" : "authSchema", "currentVersion" : 5 }

system.users存儲數據庫帳號信息

single:PRIMARY> db.system.users.find()
{ "_id" : "admin.root", "userId" : UUID("642d00b9-5daa-4ff9-881d-248d12f1cea5"), "user" : "root", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "RYFapYvcnsBTzpBSoOJEtQ==", "storedKey" : "9DDghKxRMNJIGtnJSDMiU5eW3FI=", "serverKey" : "ofDQbqiaHv7TtfgKUsy45+rLygg=" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "XuswE9YVGb5kvKAjRgk6C7yYibXueYfV3Z2ftg==", "storedKey" : "V8ujyqxe0LsxFhfeqDedKzrlVyrpEc9gNJJXd+iHtdU=", "serverKey" : "o/eSr/2JERG53rD3syabUtcBPL83733tnslJZCXNrJ4=" } }, "roles" : [ { "role" : "root", "db" : "admin" } ] }
{ "_id" : "admin.backup", "userId" : UUID("c365c48f-5bb7-446c-8219-e50ab99866ac"), "user" : "backup", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "4s75h29oYQhmrx4SV4Kdjw==", "storedKey" : "wWRXZeXadmQB1B4pgLV+YV6Rjbw=", "serverKey" : "Iu69IR6Y5bnGXHQ0+PyQTZN48i8=" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "zZFw7oMOgYRVc8bHfJX+m077pZQ93wbyLGOU0Q==", "storedKey" : "O6DAfbOKyMNUIYsHYNNcFiclZ/iMODmZdZmbJw22c5Y=", "serverKey" : "v/3H594Wo5fcclh9YP8GGe+5SLGfOKIBRBO13OrOggY=" } }, "roles" : [ { "role" : "backup", "db" : "admin" }, { "role" : "restore", "db" : "admin" } ] }

system.roles存儲自定義的角色

single:PRIMARY> db.system.roles.find()
{ "_id" : "admin.MyreadWrite", "role" : "MyreadWrite", "db" : "admin", "privileges" : [ { "resource" : { "db" : "bayern", "collection" : "" }, "actions" : [ "insert", "remove", "update" ] } ], "roles" : [ { "role" : "read", "db" : "bayern" } ] }
{ "_id" : "admin.manageOpRole", "role" : "manageOpRole", "db" : "admin", "privileges" : [ { "resource" : { "cluster" : true }, "actions" : [ "inprog", "killop" ] }, { "resource" : { "db" : "", "collection" : "" }, "actions" : [ "killCursors" ] } ], "roles" : [ ] }

  用戶可以在admin數據庫下建立任意集合,存儲任何數據,但強烈建議不要使用admin數據庫存儲應用業務數據,最好創建新的數據庫。
  admin數據庫裏的system.users、system.roles2個集合的數據MongoDB會cache在內存裏,這樣不用每次鑑權都從磁盤加載用戶角色信息。目前cache的維護代碼,只有在保證system.users、system.roles的寫入都串行化的情況下才能正確工作。
  MongoDB admin數據庫的寫入操作的鎖級別只能到DB級別,不支持多個collection併發寫入,在寫入時也不支持併發讀取。如果用戶在admin數據庫裏存儲業務數據,則可能遭遇性能問題。

三、config庫

  config庫在使用MongoDB分片功能時起到作用,主要存儲分片集羣基礎信息。

single:PRIMARY> use config
switched to db config
single:PRIMARY> show collections;
actionlog
changelog
chunks
collections
databases
lockpings
locks
migrations
mongos
settings
shards
system.sessions
tags
transactions
version
configReplSet:SECONDARY> db.actionlog.find()
{ "_id" : "cdh01:28020-2020-06-12T20:49:11.591+0800-5ee379c79fb30586e5b40eb0", "server" : "cdh01:28020", "shard" : "config", "clientAddr" : "", "time" : ISODate("2020-06-12T12:49:11.591Z"), "what" : "balancer.round", "ns" : "", "details" : { "executionTimeMillis" : 35548, "errorOccured" : true, "errmsg" : "Could not find host matching read preference { mode: \"primary\" } for set shard2" } }
configReplSet:SECONDARY> db.changelog.find()
{ "_id" : "cdh02:28020-2020-06-12T20:27:56.938+0800-5ee374cc5011858194682148", "server" : "cdh02:28020", "shard" : "config", "clientAddr" : "172.16.101.231:39310", "time" : ISODate("2020-06-12T12:27:56.938Z"), "what" : "addShard", "ns" : "", "details" : { "name" : "shard1", "host" : "shard1/172.16.101.231:28021,172.16.101.204:28021,172.16.101.204:28021" } }
{ "_id" : "cdh02:28020-2020-06-12T20:28:05.127+0800-5ee374d55011858194682197", "server" : "cdh02:28020", "shard" : "config", "clientAddr" : "172.16.101.231:39310", "time" : ISODate("2020-06-12T12:28:05.127Z"), "what" : "addShard", "ns" : "", "details" : { "name" : "shard2", "host" : "shard2/172.16.101.231:28022,172.16.101.204:28022,172.16.101.204:28022" } }
...
configReplSet:SECONDARY> db.chunks.find()
{ "_id" : "test.t2-id_4611686018427387902", "ns" : "test.t2", "min" : { "id" : NumberLong("4611686018427387902") }, "max" : { "id" : { "$maxKey" : 1 } }, "shard" : "shard2", "lastmod" : Timestamp(1, 3), "lastmodEpoch" : ObjectId("5ee3756d9ceec30eccbd4269"), "history" : [ { "validAfter" : Timestamp(1591965038, 1), "shard" : "shard2" } ] }
...
configReplSet:SECONDARY> db.collections.find()
{ "_id" : "test.t1", "lastmodEpoch" : ObjectId("000000000000000000000000"), "lastmod" : ISODate("2020-06-12T12:34:20.482Z"), "dropped" : true }
{ "_id" : "test.t2", "lastmodEpoch" : ObjectId("5ee3756d9ceec30eccbd4269"), "lastmod" : ISODate("1970-02-19T17:02:47.299Z"), "dropped" : false, "key" : { "id" : "hashed" }, "unique" : false, "uuid" : UUID("b759dd58-5f1e-4741-8ce1-6fed53b41aef") }
{ "_id" : "config.system.sessions", "lastmodEpoch" : ObjectId("5ee375f79ceec30eccbd4de1"), "lastmod" : ISODate("1970-02-19T17:02:47.296Z"), "dropped" : false, "key" : { "_id" : 1 }, "unique" : false, "uuid" : UUID("a37c61f1-b752-4013-a1f8-699c86a6f3a5") }
configReplSet:SECONDARY> db.databases.find()
{ "_id" : "test", "primary" : "shard1", "partitioned" : true, "version" : { "uuid" : UUID("0e14834d-fd5c-401b-b6ee-3006ef5c16a2"), "lastMod" : 1 } }
configReplSet:SECONDARY> db.lockpings.find()
{ "_id" : "ConfigServer", "ping" : ISODate("2020-07-05T12:53:48.868Z") }
{ "_id" : "cdh01:28018:1591964813:-5318065364096372981", "ping" : ISODate("2020-06-12T12:41:56.406Z") }
configReplSet:SECONDARY> db.locks.find()
{ "_id" : "test", "state" : 0, "process" : "ConfigServer", "ts" : ObjectId("5ee376565011858194682dda"), "when" : ISODate("2020-06-12T12:34:30.791Z"), "who" : "ConfigServer:conn29", "why" : "createCollection" }
configReplSet:SECONDARY> db.mongos.find()
{ "_id" : "cdh01:28018", "advisoryHostFQDNs" : [ ], "mongoVersion" : "4.2.3", "ping" : ISODate("2020-07-05T12:54:54.089Z"), "up" : NumberLong(1987387), "waiting" : true }
configReplSet:PRIMARY> db.settings.find()
{ "_id" : "balancer", "mode" : "off", "stopped" : true }
{ "_id" : "autosplit", "enabled" : false }
{ "_id" : "chunksize", "value" : 8 }
configReplSet:PRIMARY> db.shards.find()
{ "_id" : "shard1", "host" : "shard1/172.16.101.142:28021,172.16.101.204:28021,172.16.101.231:28021", "state" : 1 }
{ "_id" : "shard2", "host" : "shard2/172.16.101.142:28022,172.16.101.204:28022,172.16.101.231:28022", "state" : 1 }

四、local庫

  local庫它只會在本地存儲數據,local數據庫裏的內容不會同步到副本集裏其他節點上去;local數據庫主要存儲副本集的配置信息、oplog信息。
  另外,對於重要的數據不能存儲在local數據庫,還要注意MongoDB默認的WriteConcern是{w: 1},即數據寫到Primary上(不保證journal已經寫成功)就向客戶端確認,這時同樣存在丟數據的風險。對於重要的數據,可以設置更高級別的如{w: “majority”}來保證數據寫到大多數節點後再向客戶端確認,當然這對寫入的性能會造成一定的影響。
注意

在使用MongoDB時,重要的數據千萬不要存儲在local數據庫中,否則當一個節點故障時,存儲在local裏的數據就會丟失。
single:PRIMARY> use local
switched to db local
single:PRIMARY> show collections;
oplog.rs
replset.election
replset.minvalid
replset.oplogTruncateAfterPoint
startup_log
system.profile
system.replset
system.rollback.id

oplog.rs保存oplog的capped集合,從4.0開始,oplog允許超過固定大小。

db.oplog.rs.find().sort({"ts":-1}).limit(10)
{ "ts" : Timestamp(1593956234, 1), "t" : NumberLong(11), "h" : NumberLong(0), "v" : 2, "op" : "i", "ns" : "test.t1", "ui" : UUID("d53288a9-5e94-4bc7-9558-cac3994f3683"), "wall" : ISODate("2020-07-05T13:37:14.244Z"), "o" : { "_id" : ObjectId("5f01d78a2285c6f655946fe2"), "id" : 1 } }
single:PRIMARY> db.replset.election.find()
{ "_id" : ObjectId("5ec3d8a474a5042ff2b102e5"), "term" : NumberLong(11), "candidateIndex" : NumberLong(0) }

replset.minvalid包含一個由副本集內部用來跟蹤複製狀態的對象

single:PRIMARY> db.replset.minvalid.find()
{ "_id" : ObjectId("5ec3d8a474a5042ff2b102e4"), "t" : NumberLong(-1), "ts" : Timestamp(0, 0) }
db.replset.oplogTruncateAfterPoint.find()
{ "_id" : "oplogTruncateAfterPoint", "oplogTruncateAfterPoint" : Timestamp(0, 0) }

  啓動時,每個mongod實例都會將文檔插入 startup_log其中,其中包含有關mongod實例本身和主機信息的診斷 信息。此信息主要用於診斷目的。

single:PRIMARY> db.startup_log.find().pretty().limit(1)
{
#包括系統主機名和時間戳
        "_id" : "zijie-1589893284149",
#系統主機名
        "hostname" : "zijie",
#一個UTC ISODate值,反映了服務器啓動的時間
        "startTime" : ISODate("2020-05-19T13:01:24Z"),
#一個字符串,報告startTime 系統本地時區
        "startTimeLocal" : "Tue May 19 21:01:24.149",
#嵌入式文檔,報告mongod運行時選項及其值
        "cmdLine" : {
                "config" : "/etc/mongodb.conf",
                "net" : {
                        "bindIp" : "0.0.0.0",
                        "port" : 27017
                },
                "operationProfiling" : {
                        "mode" : "slowOp",
                        "slowOpThresholdMs" : 100
                },
                "processManagement" : {
                        "fork" : true
                },
                "replication" : {
                        "replSet" : "single"
                },
                "security" : {
                        "authorization" : "enabled"
                },
                "storage" : {
                        "dbPath" : "/data/mongodb27017/data",
                        "journal" : {
                                "enabled" : true
                        }
                },
                "systemLog" : {
                        "destination" : "file",
                        "logAppend" : true,
                        "path" : "/data/mongodb27017/logs",
                        "quiet" : false,
                        "verbosity" : 1
                }
        },
#此進程的標識符
        "pid" : NumberLong(13727),
#一個嵌入式文檔,報告有關構建環境和用於編譯該環境的設置的信息
        "buildinfo" : {
                "version" : "4.2.3",
                "gitVersion" : "6874650b362138df74be53d366bbefc321ea32d4",
                "modules" : [ ],
                "allocator" : "tcmalloc",
                "javascriptEngine" : "mozjs",
                "sysInfo" : "deprecated",
                "versionArray" : [
                        4,
                        2,
                        3,
                        0
                ],
                "openssl" : {
                        "running" : "OpenSSL 1.0.1e-fips 11 Feb 2013",
                        "compiled" : "OpenSSL 1.0.1e-fips 11 Feb 2013"
                },
                "buildEnvironment" : {
                        "distmod" : "rhel70",
                        "distarch" : "x86_64",
                        "cc" : "/opt/mongodbtoolchain/v3/bin/gcc: gcc (GCC) 8.2.0",
                        "ccflags" : "-fno-omit-frame-pointer -fno-strict-aliasing -ggdb -pthread -Wall -Wsign-compare -Wno-unknown-pragmas -Winvalid-pch -Werror -O2 -Wno-unused-local-typedefs -Wno-unused-function -Wno-deprecated-declarations -Wno-unused-const-variable -Wno-unused-but-set-variable -Wno-missing-braces -fstack-protector-strong -fno-builtin-memcmp",
                        "cxx" : "/opt/mongodbtoolchain/v3/bin/g++: g++ (GCC) 8.2.0",
                        "cxxflags" : "-Woverloaded-virtual -Wno-maybe-uninitialized -fsized-deallocation -std=c++17",
                        "linkflags" : "-pthread -Wl,-z,now -rdynamic -Wl,--fatal-warnings -fstack-protector-strong -fuse-ld=gold -Wl,--build-id -Wl,--hash-style=gnu -Wl,-z,noexecstack -Wl,--warn-execstack -Wl,-z,relro",
                        "target_arch" : "x86_64",
                        "target_os" : "linux"
                },
                "bits" : 64,
                "debug" : false,
                "maxBsonObjectSize" : 16777216,
                "storageEngines" : [
                        "biggie",
                        "devnull",
                        "ephemeralForTest",
                        "wiredTiger"
                ]
        }
}

system.profile記錄慢日誌

db.system.profile.find()
{ "op" : "command", "ns" : "local.system.rollback.id", "command" : { "replSetInitiate" : undefined, "lsid" : { "id" : UUID("5908de3e-0c3b-461a-8bdc-0154a8892694") }, "$readPreference" : { "mode" : "secondaryPreferred" }, "$db" : "admin" }, "numYield" : 0, "locks" : { "ParallelBatchWriterMode" : { "acquireCount" : { "r" : NumberLong(20) } }, "ReplicationStateTransition" : { "acquireCount" : { "w" : NumberLong(24) } }, "Global" : { "acquireCount" : { "r" : NumberLong(9), "w" : NumberLong(13), "W" : NumberLong(2) }, "acquireWaitCount" : { "W" : NumberLong(1) }, "timeAcquiringMicros" : { "W" : NumberLong(106) } }, "Database" : { "acquireCount" : { "r" : NumberLong(6), "w" : NumberLong(2), "W" : NumberLong(11) } }, "Collection" : { "acquireCount" : { "r" : NumberLong(4), "w" : NumberLong(2) } }, "Mutex" : { "acquireCount" : { "r" : NumberLong(16) } }, "oplog" : { "acquireCount" : { "r" : NumberLong(1), "w" : NumberLong(1) } } }, "flowControl" : { "acquireCount" : NumberLong(4) }, "storage" : {  }, "responseLength" : 139, "protocol" : "op_msg", "millis" : 142, "ts" : ISODate("2020-05-19T13:06:03.558Z"), "client" : "127.0.0.1", "appName" : "MongoDB Shell", "allUsers" : [ ], "user" : "" }

system.replset包含副本集成員上的集合

single:PRIMARY> db.system.replset.find()
{ "_id" : "single", "version" : 1, "protocolVersion" : NumberLong(1), "writeConcernMajorityJournalDefault" : true, "members" : [ { "_id" : 0, "host" : "zijie:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : {  }, "slaveDelay" : NumberLong(0), "votes" : 1 } ], "settings" : { "chainingAllowed" : true, "heartbeatIntervalMillis" : 2000, "heartbeatTimeoutSecs" : 10, "electionTimeoutMillis" : 10000, "catchUpTimeoutMillis" : -1, "catchUpTakeoverDelayMillis" : 30000, "getLastErrorModes" : {  }, "getLastErrorDefaults" : { "w" : 1, "wtimeout" : 0 }, "replicaSetId" : ObjectId("5ec3d9bb74a5042ff2b102f3") } }
single:PRIMARY> db.system.rollback.id.find()
{ "_id" : "rollbackId", "rollbackId" : 1 }

五、總結

  本文基於MongoDB4.2版本介紹了各系統庫的常用集合內容以及相關以及對應的文檔信息,在MongoDB中,可以通過系統庫來獲取一些數據庫的狀態信息。

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