Docs 菜单
Docs 主页
/
MongoDB Manual
/ /

配置数据库

在此页面上

  • 限制
  • 支持分片集群操作的集合
  • 支持会话的集合

config 数据库中的集合支持:

  • 分片集群操作

  • 独立、副本集和分片集群的因果一致性会话以及副本集和分片集群的可重试写入。

注意

分片集群可能会在config数据库中显示不同的collection,具体取决于您连接到mongos还是mongod

  • mongos 上,config 数据库显示位于配置服务器上的集合,例如 collectionschunks

  • mongod 上,config 数据库显示指定分区的特定集合,如 migrationCoordinatorsrangeDeletions

当配置服务器和服务器托管在同一节点上时,mongos config可能有权访问数据库中的某些collection。

从 MongoDB 5.0 开始,不允许对 config.transactions 集合进行非事务读取,读取关注点和选项如下:

重要

config 数据库的模式为模式,可能会在 MongoDB 不同版本之间发生变动。config 数据库并非可靠的 API,用户不应在正常操作或维护过程中向 config 数据库写入数据。

注意

无法在多文档中对 config 数据库的集合执行读/写操作。

要访问 config 数据库并查看支持分片操作的集合列表,请将 mongosh 连接到分片集群中的 mongos 实例并发出以下命令:

use config
show collections

注意

如果使用访问控制运行,请确保您有特权允许对数据库执行 listCollections 动作。

配置数据库主要供内部使用,在正常操作期间,请勿在其中手动插入或存储数据。但是,如果您需要验证分片集群配置服务器的写入可用性,您可以将文档插入测试集合中(在确保不存在该名称的集合之后):

警告

在正常运行的系统上修改 config 数据库可能会导致数据集不稳定或不一致。如果必须修改 config 数据库,请使用 mongodump 创建 config 数据库的完整备份。

db.testConfigServerWriteAvail.insertOne( { a : 1 } )

操作成功后,配置服务器就可以用于进程写入。

服务器的未来版本可能会在配置数据库中包含不同的集合,因此在为测试集合选择名称时要小心。

MongoDB 在 config 数据库中使用以下集合来支持分片:

config.changelog

提示

内部 MongoDB 元数据

配置数据库属于内部数据库:应用程序和管理员在正常操作过程中不应修改或依赖其内容。

changelog 集合会为分片集合中元数据的每次更改存储一个文档。

例子

以下示例显示了从changelog集合中分割的数据段的单个记录:

{
"_id" : "<hostname>-<timestamp>-<increment>",
"server" : "<hostname><:port>",
"clientAddr" : "127.0.0.1:63381",
"time" : ISODate("2012-12-11T14:09:21.039Z"),
"what" : "split",
"ns" : "<database>.<collection>",
"details" : {
"before" : {
"min" : {
"<database>" : { $minKey : 1 }
},
"max" : {
"<database>" : { $maxKey : 1 }
},
"lastmod" : Timestamp(1000, 0),
"lastmodEpoch" : ObjectId("000000000000000000000000")
},
"left" : {
"min" : {
"<database>" : { $minKey : 1 }
},
"max" : {
"<database>" : "<value>"
},
"lastmod" : Timestamp(1000, 1),
"lastmodEpoch" : ObjectId(<...>)
},
"right" : {
"min" : {
"<database>" : "<value>"
},
"max" : {
"<database>" : { $maxKey : 1 }
},
"lastmod" : Timestamp(1000, 2),
"lastmodEpoch" : ObjectId("<...>")
},
"owningShard" : "<value>"
}
}

changelog集合中的每个文档都包含以下字段:

config.changelog._id

changelog._id的值为: <hostname>-<timestamp>-<increment>

config.changelog.server

保存此数据的服务器的主机名。

config.changelog.clientAddr

一个保存客户端地址的字符串,一个启动此更改的 mongos 实例。

config.changelog.time

反映更改发生时间的 ISODate 时间戳。

config.changelog.what

记录的变更类型。可能的值包括:

  • dropCollection

  • dropCollection.start

  • dropDatabase

  • dropDatabase.start

  • moveChunk.start

  • moveChunk.commit

  • split

  • multi-split

config.changelog.ns

发生变更的命名空间。

config.changelog.details

包含变更的其他详细信息的文档details文档的结构取决于变更的类型。

config.chunks

提示

内部 MongoDB 元数据

配置数据库属于内部数据库:应用程序和管理员在正常操作过程中不应修改或依赖其内容。

config.chunks 集合会为集群中的每个数据块存储一个文档。以下示例显示了一个文档:

{
_id: ObjectId('65a954c0de11596e08e7c1dc'),
uuid: UUID('a4479215-a38d-478f-a82b-e5e95d455e55'),
min: { a: Long('121204345') },
max: { a: Long('993849349') },
shard: 'shard01',
lastmod: Timestamp({ t: 1, i: 0 }),
history: [
{
validAfter: Timestamp({ t: 1705596095, i: 14 }),
shard: 'shard01'
}
]
}

在文档中:

  • _id 是数据段标识符。

  • minmax 是数据段的分片键的值范围。

  • shard 是将数据段存储在集群中的分片的名称。

提示

如要查找一个集合中的数据块,请从 config.collections 集合中检索集合的 uuid 标识符。然后,使用 uuidconfig.chunks 集合中检索 uuid 相同的匹配文档。

config.collections

提示

内部 MongoDB 元数据

配置数据库属于内部数据库:应用程序和管理员在正常操作过程中不应修改或依赖其内容。

collections 集合为集群中的每个分片集合存储一个文档。以 records 数据库中名为 pets 的集合为例,collections 集合中的文档将类似于以下内容:

{
"_id" : "records.pets",
"lastmod" : ISODate("2021-07-21T15:48:15.193Z"),
"timestamp": Timestamp(1626882495, 1),
"key" : {
"a" : 1
},
"unique" : false,
"lastmodEpoch" : ObjectId("5078407bd58b175c5c225fdc"),
"uuid" : UUID("f8669e52-5c1b-4ea2-bbdc-a00189b341da")
}
config.csrs.indexes

7.0 版本中的新增功能

提示

内部 MongoDB 元数据

配置数据库属于内部数据库:应用程序和管理员在正常操作过程中不应修改或依赖其内容。

indexes集合为分片上可用的每个全局索引存储一个文档。

该集合中的每个文档都包含以下字段:

字段
数据类型
说明
name
字符串
全局索引的名称。
keyPattern
文档
索引密钥规范。
options
文档
提供有关指定索引选项的信息,包括该索引是否为全局索引。
lastmod
时间戳
时间戳,提供有关上次修改索引的时间和索引版本的信息。
collectionUUID
UUID
分片集合的UUID
indexCollectionUUID
UUID
用于跟踪全局索引的从节点集合的 UUID
config.databases

提示

内部 MongoDB 元数据

配置数据库属于内部数据库:应用程序和管理员在正常操作过程中不应修改或依赖其内容。

databases集合为集群中的每个数据库存储一个文档。

对于每个数据库,相应的文档显示名称、数据库的分片 和版本。

{ "_id" : "test", "primary" : "shardA", "version" : { "uuid" : UUID("516a5f79-5eb9-4844-8ee9-b8e9de91b760"), "timestamp" : Timestamp(1626894204, 1), "lastMod" : 1 } }
{ "_id" : "hr", "primary" : "shardA", "version" : { "uuid" : UUID("8e39d61d-6259-4c33-a5ed-bcd2ae317b6f"), "timestamp" : Timestamp(1626895015, 1), "lastMod" : 1 } }
{ "_id" : "reporting", "primary" : "shardB", "version" : { "uuid" : UUID("07c63242-51b3-460c-865f-a67b3372d792"), "timestamp" : Timestamp(1626895826, 1), "lastMod" : 1 } }

sh.status() 方法会在数据库部分返回此信息。

config.migrationCoordinators

migrationCoordinators 集合存在于每个分片上,并为从此分片到另一个分片的每个正在进行的数据块迁移存储一个文档。如果无法将文档写入分片副本集的大多数节点,则数据块迁移将失败。

迁移完成后,将从集合中删除描述迁移的文档。

config.mongos

提示

内部 MongoDB 元数据

配置数据库属于内部数据库:应用程序和管理员在正常操作过程中不应修改或依赖其内容。

mongos 集合可为隶属于集群的每个 mongos 实例存储一个文档。集群会维护此集合以便用于报告。

mongos集合中的每个文档都包含这些字段:

字段
数据类型
说明
_id
字符串
运行 mongos 的主机名和端口。_id 的格式为 <hostname>:<port>
advisoryHostFQDNs
字符串数组
mongos 的完全限定域名(FQDN)的数组。
created
Date

mongos 启动时。

5.2 版本中的新增功能

mongoVersion
字符串
正在运行 mongos 的 MongoDB 版本。
ping
Date
mongos 实例每 30 秒向配置服务器发送 ping。该字段表示最后一次 ping 时间。
up
NumberLong
截至上次 ping 时 mongos 已启动的秒数。
waiting
布尔
此字段始终为true ,包含此字段只是为了向后兼容。

以下文档显示了 example.com:27017 上运行的 mongos 的状态。

[
{
_id: 'example.com:27017',
advisoryHostFQDNs: [ "example.com" ],
created: ISODate("2021-11-22T16:32:13.708Z"),
mongoVersion: "5.2.0",
ping: ISODate("2021-12-15T22:09:23.161Z"),
up: Long("2007429"),
waiting: true
}
]
config.rangeDeletions

rangeDeletions 集合存在于每个分片上,并为每个包含孤立文档的数据块范围存储一个文档。如果无法将文档写入分片副本集的大多数节点,则数据块迁移将失败。

清除孤立的数据段范围时,将从集合中删除范围描述文档。

config.settings

提示

内部 MongoDB 元数据

配置数据库属于内部数据库:应用程序和管理员在正常操作过程中不应修改或依赖其内容。

settings集合包含以下分片配置设置:

  • 范围大小。要更改范围大小,请参阅修改分片集群中的范围大小。指定的 chunksize 值以 MB 为单位。

  • 负载均衡器设置。要更改负载均衡器设置(包括负载均衡器状态),请参阅管理分片集群负载均衡器

  • 自动分割:

    从 MongoDB 6.0.3 开始,不再执行自动数据块分割。这是因为均衡策略的改进。自动分割命令仍然存在,但不执行操作。

    在 MongoDB 6.1 以前的版本中:

settings 集合中的示例文档:

{ "_id" : "chunksize", "value" : 64 }
{ "_id" : "balancer", "mode" : "full", "stopped" : false }
config.shards

提示

内部 MongoDB 元数据

配置数据库属于内部数据库:应用程序和管理员在正常操作过程中不应修改或依赖其内容。

shards 集合在单独的文档中表示集群中的每个分片,如下所示:

{ "_id" : "shard0000", "host" : "localhost:30000", "state" : 1 }

如果分片是副本集,则 host 字段显示副本集的名称,其后是斜杠,以及副本集每个节点的主机名的逗号分隔列表,如以下示例所示:

{ "_id" : "shard0001", "host" : "shard0001/localhost:27018,localhost:27019,localhost:27020", "state" : 1 }

如果为分片分配了区域,则此文档有一个 tags 字段,其中包含分区所分配区域的数组,如以下示例所示:

{ "_id" : "shard0002", "host" : "localhost:30002", "state" : 1, "tags": [ "NYC" ] }
config.tags

提示

内部 MongoDB 元数据

配置数据库属于内部数据库:应用程序和管理员在正常操作过程中不应修改或依赖其内容。

tags 集合包含集群中每个区域范围的文档。tags 集合中的文档类似于以下内容:

{
"_id" : { "ns" : "records.users", "min" : { "zipcode" : "10001" } },
"ns" : "records.users",
"min" : { "zipcode" : "10001" },
"max" : { "zipcode" : "10281" },
"tag" : "NYC"
}
config.version

提示

内部 MongoDB 元数据

配置数据库属于内部数据库:应用程序和管理员在正常操作过程中不应修改或依赖其内容。

version集合保存当前元数据版本号。此集合仅包含一个文档。例如:

{ "_id" : 1, "minCompatibleVersion" : 5, "currentVersion" : 6, "clusterId" : ObjectId("5d8bc01a690d8abbd2014ddd") }

要访问 version 集合,必须使用 db.getCollection() 方法。例如,要检索集合的文档:

db.getCollection("version").find()

config 数据库包含内部集合,用于支持独立集群、副本集和分片分片集群的因果一致性会话,以及副本集和分片群集的可重试写入和事务

警告

请勿手动修改或删除这些集合。

要访问mongodmongos实例的这些集合,请将mongosh连接到该实例。

config.system.sessions

system.sessions 集合存储了可供部署的所有成员使用的会话记录。

当用户在 mongodmongos 实例上创建会话时,会话记录最初仅存在于该实例的内存中。实例会定期将其缓存的会话同步到 system.sessions 集合;同步后,部署的所有节点都可以看到这些会话。

若要查看 system.sessions 集合中的记录,请使用 $listSessions

警告

请勿手动修改或删除 system.sessions 集合。

在分片集群中, system.sessions 集合已分片。

向分片集群添加分片时,如果要添加的分片已经包含自己的system.sessions 集合,MongoDB 将在添加进程中删除新分片的 system.sessions 集合。

config.transactions

transactions 集合存储用于支持副本集和分片集群的可重试写入事务的记录。

警告

请勿手动修改或删除 transactions 集合。

后退

参考

来年

对分片集合进行碎片整理