配置服务器
配置服务器存储分片集群的元数据。 元数据反映了分分片集群内所有数据和组件的状态和组织。 元数据包括每个分片上的数据段列表以及定义数据段的范围。
mongos
实例缓存此数据,并使用该数据将写入操作路由到正确的分片。 mongos
当集群的元数据发生变化(例如 分片 分片)时, 会更新缓存。分片还从配置服务器读取数据数据块元数据。
配置服务器还存储“自管理部署上的身份验证”配置信息,例如基于角色的访问控制或集群的内部身份验证设置。
MongoDB 还使用配置服务器来管理分布式锁。
每个分片集群必须拥有自己的配置服务器。请勿对不同的分片集群使用相同的配置服务器。
警告
在配置服务器上执行的管理操作可能会对分片集群的性能和可用性产生巨大影响。根据受影响的配置服务器的数量,集群可能会在一段时间内处于只读或离线状态。
从 MongoDB 8.0 开始,除了常用分片集群元数据以外,还可以配置一个配置服务器,以存储应用程序数据。该配置服务器被称为配置分片。您稍后将在本页的 配置分片部分中了解更多信息。
副本集配置服务器
在用于配置服务器时,副本集的配置有以下限制:
不能有仲裁节点。
不得包含延迟节点。
必须构建索引(即任何成员的
members[n].buildIndexes
设置都应为 false)。
配置服务器上的读取和写入操作
admin
数据库和config
数据库存在于配置服务器上。
写入配置服务器
admin
数据库包含与身份验证和授权相关的集合,以及其他供内部使用的 system.* 集合。
config
数据库包含含有分片集群元数据的集合。MongoDB 会在元数据发生变化时(例如在数据块迁移或数据块分割后)将数据写入config
数据库。
在正常操作或维护过程中,用户应避免直接写入配置数据库。
在写入配置服务器时,MongoDB 使用了 "majority"
的写关注。
从配置服务器读取
MongoDB 从 admin
数据库读取身份验证和授权数据以及其他内部用途。
当 mongos
启动或元数据发生变化之后(例如数据段迁移之后),MongoDB 会从 config
数据库中读取。分片还从配置服务器读取数据段元数据。
从副本集配置服务器读取时,MongoDB 使用读关注级别的 "majority"
。
元数据视图必须是最新的
为了使操作成功,特定分分片成员上的元数据视图必须是最新的。 分分片和发出请求的路由器必须具有相同版本的数据段元数据。
如果元数据不是最新的,则操作将失败并返回StaleConfig
错误,并触发元数据刷新进程。 刷新元数据可能会导致额外的操作延迟。
在从从节点(secondary node from replica set)上,如果存在明显的复制延迟,元数据刷新可能需要很长时间。 对于从从节点(secondary node from replica set)读取,设立maxStalenessSeconds
以最大限度地减少复制延迟的影响。
配置服务器的可用性
如果配置服务器副本集丢失其主节点并且无法选择主节点,则集群的元数据将变为只读。您仍然可以从分片读取和写入数据,但在副本集可以选择主节点之前,不会发生数据段迁移或数据段分割。
在分片集群中,mongod
和 mongos
实例监控分片集群中的副本集(例如分片副本集、配置服务器副本集)。
如果所有配置服务器都变得不可用,那么集群可能会无法正常运行。为了确保配置服务器始终可用,并且功能与数据均完好无损,备份配置服务器非常重要。与集群中存储的数据相比,配置服务器上的数据量较小,并且配置服务器的活动负载也相对较低。
有关详细信息,请参阅配置服务器副本集成员变得不可用。
分片集群元数据
配置服务器将元数据存储在 config
数据库中。
重要
在配置服务器上进行任何维护之前,请务必备份 config
数据库。
要访问 config
数据库,请在 mongosh
中发出以下命令:
use config
一般来说,您绝对不 应该直接编辑 config
数据库的内容。config
数据库包含以下集合:
有关这些集合及其在分片集群中的角色的更多信息,请参阅配置数据库。有关读取和更新元数据的更多信息,请参见配置服务器上的读取和写入操作。
分片集群的安全性
使用自管理的内部/成员身份验证来执行集群内部安全,防止未经授权的集群组件访问集群。您必须使用适当的安全设置启动集群中的每个 mongod
,才能执行内部身份验证。
从 MongoDB 5.3 开始,SCRAM-SHA-1不能用于集群内身份验证。仅支持 SCRAM-SHA-256。
在先前的 MongoDB 版本中,SCRAM-SHA-1 和 SCRAM-SHA-256 均可用于集群内身份验证,即使未显式启用 SCRAM。
有关部署安全分片集群的教程,请参阅使用密钥文件身份验证部署自管理分片集群。
配置分片
8.0版本新增。
从MongoDB 8.0开始,您可以:
配置一个配置服务器,除了存储通常的分片集群元数据之外,还用于存储应用程序数据。存储应用程序数据的配置服务器称为配置分片。
在配置分片和专用配置配置服务器之间转换配置服务器。
集群需要配置服务器,但它可以是配置分片,而不是专用的配置服务器。 使用配置分片可减少所需节点的数量,并可简化部署。
如果您的应用程序对可用性和弹性有很高的要求,请考虑部署专用的配置服务器。 专用配置服务器为关键集群操作提供隔离性、专用资源和一致的性能。
您不能将相同的配置分片用于多个分片集群。
命令
要将专用配置服务器配置为作为配置分片运行,请运行transitionFromDedicatedConfigServer
命令。
要将配置分片配置为作为专用配置服务器分片,请运行transitionToDedicatedConfigServer
命令。
用户(User)
在配置分片上创建的用户与在专用配置服务器上创建的用户具有相同行为。
确认使用配置分片
要确认分片集群使用了配置分分片,请在连接到listShards
admin
时对 数据库运行mongos
命令,并检查输出中是否存在将_id
设立为"config"
的文档。如果listShards
输出不包含将_id
设立为"config"
的文档,则集群不使用配置分分片。
以下示例运行 listShards
命令并尝试查找 _id
设立为 "config"
的文档。
db.adminCommand({ listShards: 1 })["shards"].find(element => element._id === "config")
在此示例中,返回的文档已将 _id
设立为 "config"
,这确认此集群使用配置分片。
{ _id: "config", host: "configRepl/localhost:27018", state: 1, topologyTime: Timestamp({ t: 1732218671, i: 13 }), replSetConfigVersion: Long('-1') }
降级功能兼容版本
如果您的集群具有配置分片,并且您需要将功能兼容版本降级到 8.0 之前的版本,请连接到 mongos
并执行以下步骤:
配置一个配置分片,使其作为专用配置服务器运行。
要开始配置配置分片,使其作为专用配置服务器运行,请运行 transitionToDedicatedConfigServer
:
db.adminCommand( { transitionToDedicatedConfigServer: 1 } )
列出集群中的所有数据库和集合。
要列出集群中的所有数据库,请运行
listDatabases
:db.adminCommand( { listDatabases: 1, nameOnly: true } ) 排除
admin
和config
数据库。对于每个数据库,列出数据库中的所有集合。
要列出数据库中的所有集合,请运行
listCollections
。db.adminCommand( { listCollections: 1, nameOnly: true, filter: { type: { $ne: "view" } } } ) 排除以
system
开头的集合。
对于每个非系统集合,将集合移动到新的分分片。
要将集合移动到新的分片,请运行 moveCollection
:
db.adminCommand( { moveCollection: "<database>.<collection>", toShard: "<new shard>", } )
等待负载均衡器将分片集合数据移出配置服务器。
要验证负载均衡器是否已将分片集合数据从配置服务器中移出,请再次运行 transitionToDedicatedConfigServer
:
db.adminCommand( { transitionToDedicatedConfigServer: 1 } )
数据移动成功后的响应包含 state:
"completed"
。如果响应包含 state: "pendingDataCleanup"
,请稍等片刻,然后继续调用 transitionToDedicatedConfigServer
,直到命令响应包含 state: "completed"
。有关完整响应的详细信息,请参阅 removeShard
。
设置特征兼容性版本。
要设置特征兼容性版本,请运行 setFeatureCompatibilityVersion
:
db.adminCommand( { setFeatureCompatibilityVersion: "7.0" } )