Config Database
在此页面上
config
数据库中的集合支持:
注意
分片集群可能会在config
数据库中显示不同的collection,具体取决于您连接到mongos
还是mongod
:
在
mongos
上,config
数据库显示位于配置服务器上的集合,例如collections
或chunks
。在
mongod
上,config
数据库显示指定分区的特定集合,如migrationCoordinators
或rangeDeletions
。
当配置服务器和服务器托管在同一节点上时,mongos
config
可能有权访问数据库中的某些collection。
限制
从 MongoDB 5.0 开始,不允许对 config.transactions
集合进行非事务读取,读取关注点和选项如下:
"majority"
,且设置了 afterClusterTime 选项在一个因果一致的会话中使用 MongoDB 驱动程序和
"majority"
时
重要
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
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.clientAddr
一个保存客户端地址的字符串,一个启动此更改的
mongos
实例。
config.changelog.time
反映更改发生时间的 ISODate 时间戳。
config.chunks
chunks
集合为数据块集群的每个数据段存储一个文档。 考虑以下数据块mydb.foo-a_\"cat\"
的数据段的文档示例:{ "_id" : "mydb.foo-a_\"cat\"", "lastmod" : Timestamp(2, 1), "uuid": "c025d039-e626-435e-b2d2-c1d436038041", "min" : { "animal" : "cat" }, "max" : { "animal" : "dog" }, "shard" : "shard0004", "history" : [ { "validAfter" : Timestamp(1569368571, 27), "shard" : "shard0004" } ] } 这些文档存储描述
min
和max
字段中数据段的分片键值的范围。此外,shard
字段标识集群中“拥有”该数据段的分片。
config.collections
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.databases
databases
集合为集群中的每个数据库存储一个文档。对于每个数据库,相应的文档会显示该数据库的名称、主分片、分片启用状态以及版本。
{ "_id" : "test", "primary" : "shardA", "partitioned" : true, "version" : { "uuid" : UUID("516a5f79-5eb9-4844-8ee9-b8e9de91b760"), "timestamp" : Timestamp(1626894204, 1), "lastMod" : 1 } } { "_id" : "hr", "primary" : "shardA", "partitioned" : false, "version" : { "uuid" : UUID("8e39d61d-6259-4c33-a5ed-bcd2ae317b6f"), "timestamp" : Timestamp(1626895015, 1), "lastMod" : 1 } } { "_id" : "reporting", "primary" : "shardB", "partitioned" : false, "version" : { "uuid" : UUID("07c63242-51b3-460c-865f-a67b3372d792"), "timestamp" : Timestamp(1626895826, 1), "lastMod" : 1 } } sh.status()
方法会在数据库部分返回此信息。
config.lockpings
lockpings
集合追踪分分片集群中的活动组件。 给定一个在example.com:30000
运行有mongos
的集群,lockpings
集合中的文档将类似于以下内容:{ "_id" : "example.com:30000:1350047994:16807", "ping" : ISODate("2012-10-12T18:32:54.892Z") }
config.locks
locks
集合存储分布式锁。 配置服务器副本集的主节点通过将文档插入locks
集合来获取锁。{ "_id" : "test.myShardedCollection", "state" : 2, "process" : "ConfigServer", "ts" : ObjectId("5be0b9ede46e4f441a60d891"), "when" : ISODate("2018-11-05T21:52:00.846Z"), "who" : "ConfigServer:Balancer", "why" : "Migrating chunk(s) in collection test.myShardedCollection" } 从版本3.4开始,
state
字段的值将始终为2
,以防止任何旧版mongos
实例执行均衡操作。when
字段指定配置服务器成员成为主节点的时间。在版本3.4中,当负载均衡器处于活动状态时,负载均衡器会获取锁,如下3.4 示例:
{ "_id" : "balancer", "state" : 2, "ts" : ObjectId("5be0bc6cb20effa83b15baa8"), "who" : "ConfigServer:Balancer", "process" : "ConfigServer", "when" : ISODate("2018-11-05T21:56:13.096Z"), "why" : "CSRS Balancer" } 从版本3.6开始,负载负载均衡器不再采用“锁”。 如果您已从3.4升级到3.6 ,则可以选择删除任何残留的
"_id" : "balancer"
文档。
config.migrationCoordinators
migrationCoordinators
集合存在于每个分片上,并为从此分片到另一个分片的每个正在进行的数据块迁移存储一个文档。如果无法将文档写入分片副本集的大多数节点,则数据块迁移将失败。迁移完成后,将从集合中删除描述迁移的文档。
config.mongos
mongos
集合为每个与集群关联的mongos
实例存储一个文档。mongos
实例每30秒向集群的所有节点发送 ping,以便集群可以验证mongos
是否处于活动状态。ping
字段显示上次 ping 的时间,而up
字段报告截至上次 ping 的mongos
的正常运行时间。 集群维护此集合以用于报告目的。以下文档显示了
example.com:27017
上运行的mongos
的状态。{ "_id" : "example.com:27017", "advisoryHostFQDNs" : [ "example.com" ], "mongoVersion" : "4.2.0", "ping" : ISODate("2019-09-25T19:26:52.360Z"), "up" : NumberLong(50), "waiting" : true }
config.rangeDeletions
rangeDeletions
集合存在于每个分片上,并为每个包含孤立文档的数据块范围存储一个文档。如果无法将文档写入分片副本集的大多数节点,则数据块迁移将失败。清除孤立的数据段范围时,将从集合中删除范围描述文档。
config.settings
settings
集合包含以下分片配置设置:数据段大小。 要更改数据段大小,请参阅修改分片集群中的数据段大小。 指定的
chunksize
值以 MB 为单位。负载均衡器设置。要更改负载均衡器设置(包括负载均衡器状态),请参阅管理分片集群负载均衡器。
从 MongoDB 4.2 开始:
balancerStart
还会为分片集群启用自动分割。balancerStop
还会为分片集群禁用自动分割。
自动分割。 要启用或禁用自动分割标志,请使用相应的
sh.enableAutoSplit()
方法或sh.disableAutoSplit()
方法。从 MongoDB 4.2 开始:
balancerStart
还会为分片集群启用自动分割。balancerStop
还会为分片集群禁用自动分割。
以下是
settings
集合中的一些示例文档:{ "_id" : "chunksize", "value" : 64 } { "_id" : "balancer", "mode" : "full", "stopped" : false } { "_id" : "autosplit", "enabled" : true }
config.shards
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
tags
集合包含集群中每个区域范围的文档。tags
集合中的文档类似于以下内容:{ "_id" : { "ns" : "records.users", "min" : { "zipcode" : "10001" } }, "ns" : "records.users", "min" : { "zipcode" : "10001" }, "max" : { "zipcode" : "10281" }, "tag" : "NYC" }
config.version
version
集合包含当前元数据版本号。此集合仅包含一个文档。例如:{ "_id" : 1, "minCompatibleVersion" : 5, "currentVersion" : 6, "clusterId" : ObjectId("5d8bc01a690d8abbd2014ddd") } 要访问
version
集合,必须使用db.getCollection()
方法。例如,要检索集合的文档:db.getCollection("version").find()
支持会话的集合
版本 3.6 中的新增功能。
从 MongoDB 3.6 开始,config
数据库包含内部集合,以支持独立集群、副本集和分片群集的因果一致会话以及副本集和分片集群的可重试写入和事务。
警告
请勿手动修改或删除这些集合。
要访问 mongod
或 mongos
实例的这些集合,请将 mongosh
与实例连接。
config.system.sessions
system.sessions
集合存储了可供部署的所有成员使用的会话记录。当用户在
mongod
或mongos
实例上创建会话时,会话记录最初仅存在于该实例的内存中。实例会定期将其缓存的会话同步到system.sessions
集合;同步后,部署的所有节点都可以看到这些会话。若要查看
system.sessions
集合中的记录,请使用$listSessions
。警告
请勿手动修改或删除
system.sessions
集合。在分片集群中,
system.sessions
集合已分片。向分片集群添加分片时,如果要添加的分片已经包含自己的
system.sessions
集合,MongoDB 将在添加进程中删除新分片的system.sessions
集合。从版本 4.4(和 4.2.7)开始,MongoDB 会自动将
system.sessions
集合分割为至少 1024 个数据块,并将这些数据块均匀地分布在集群中的分片中。