MongoDB系统库

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介: 本文基于MongoDB社区版 3.4.21、3.6.12、4.0.11,WT引擎,主要是对单节点、副本集、分片的系统库的介绍。

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

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
4月前
|
SQL 分布式计算 NoSQL
快速实践: 通过 Flink CDC 一键整库同步 MongoDB 到 Paimon
Apache Paimon (incubating) 是一项流式数据湖存储技术,可以为用户提供高吞吐、低延迟的数据摄入、流式订阅以及实时查询能力。
76549 4
快速实践: 通过 Flink CDC 一键整库同步 MongoDB 到 Paimon
|
4月前
|
NoSQL MongoDB 数据库
DMS(数据传输服务)支持对MongoDB数据库的整库导出
DMS(数据传输服务)支持对MongoDB数据库的整库导出
97 1
|
5月前
|
NoSQL Linux MongoDB
C++库封装mongodb(跨平台开发)
我的初衷是在Linux平台下只提供动态库和头文件,windows平台下提供静态库和头文件给开发者,这个库mongo-proxy对外提供了一些对mongodb的连接,增删改查,创建索引,聚合等操作的封装,开发者只需要关心接口如何调用,而不需要关心接口是如何实现的,也不需要关心mongo-c-driver的相关依赖,这里我抽象出mongo_proxy类,
|
9月前
|
NoSQL MongoDB 数据库
MongoDB 删除数据库
MongoDB 删除数据库
455 0
|
11月前
|
NoSQL MongoDB 数据库
开心档-软件开发入门之MongoDB 删除数据库
【摘要】 本章将会讲解删除当前数据库,默认为 test,你可以使用 db 命令查看当前数据库名。
|
存储 JSON NoSQL
Python 操作mongodb库
MongoDB 是一个基于分布式文件存储的数据库。
207 0
Python 操作mongodb库
|
JSON 运维 NoSQL
服务器又一次被恶意攻击,MongoDB被删库
前几天在自己个人的一台腾讯云服务器上安装了MongoDB,当时着急用,就用的默认配置,端口是默认端口,也没设置密码,还把bind_ip 设置成 0.0.0.0(允许所有ip远程连接)😅,后来就把这事抛到脑后了,也因为经常用无线网卡上网,ip经常是动态的,云服务器的安全组就放开了所有的ip。
服务器又一次被恶意攻击,MongoDB被删库
|
JSON NoSQL Shell
如何将 winston log 库记录的日志写入 mongo DB 数据库
Winston 非常适合配置不同的日志目的地。 在我们的小应用程序中,让我们创建另一个传输。 这次我想把日志保存到一个数据库中,MongoDB 简洁一些。 在 logger.js 文件上,复制以下代码块。 确保安装 Winston MongoDB,即 npm install winston-mongodb。
如何将 winston log 库记录的日志写入 mongo DB 数据库
|
NoSQL MongoDB 存储
MongoDB: 通过ReadConcern 来处理备库一致读的问题
问题描述 MongoDB的写请求写入Primary, secondary从Primary自动获取并且应用oplog来保持和主库的同步, MongoDB 允许用户从Primary 或者 secondary 读取数据(由客户端ReadPreference 决定)。
2671 0