本文基于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里的数据就会丢失