配置服务器
配置服务器存储一个分片集群。元数据反映了分片集群中所有数据和组件的状态和组织。元数据包括每个分片上数据块的列表以及定义数据块的范围。
mongos
实例缓存此数据,并使用它将读写操作路由到正确的分片。当集群的元数据发生变化时(例如,添加分片),mongos
会更新缓存。分片也从配置服务器读取数据块元数据。
配置服务器还存储集群的认证配置信息,例如 自管理部署的认证、基于角色的访问控制 或 内部认证 设置。
MongoDB 还使用配置服务器来管理分布式锁。
每个分片集群都必须有自己的配置服务器。不要为不同的分片集群使用相同的配置服务器。
警告
在配置服务器上进行的管理操作可能会对分片集群的性能和可用性产生重大影响。根据受影响的配置服务器数量,集群可能会在一段时间内处于只读状态或离线状态。
从 MongoDB 8.0 版本开始,您可以配置配置服务器以存储除常规分片集群元数据之外的应用程序数据。此时,配置服务器被称为 配置分片。您将在本页稍后关于配置分片 部分了解更多信息。
副本集配置服务器
当用于配置服务器时,以下限制适用于副本集配置
必须没有零 仲裁者。
必须没有延迟成员。
必须构建索引(即,不应将任何成员的
members[n].buildIndexes
设置设置为false)。
对配置服务器的读写操作
admin数据库和config数据库存在于配置服务器上。
对配置服务器的写入操作
admin数据库包含与身份验证和授权相关的集合以及其他system.*集合,供内部使用。
config数据库包含包含分片集群元数据的集合。MongoDB在元数据更改时将数据写入config数据库,例如在数据块迁移或数据块拆分后。
用户应避免在正常操作或维护过程中直接向config数据库写入。
向配置服务器写入时,MongoDB使用写入关注点为"majority"。
从配置服务器读取
MongoDB 从 admin
数据库读取身份验证和授权数据以及其他内部使用。
当 mongos
启动或元数据发生更改(例如块迁移后),MongoDB 从 config
数据库读取。分片还从配置服务器读取块元数据。
从副本集配置服务器读取时,MongoDB 使用 “majority”
级别的 Read Concern。
元数据视图必须是最新的
要使操作成功,特定分片成员上的元数据视图必须是最新的。分片和发出请求的路由器必须具有相同的块元数据版本。
如果元数据不是最新的,操作会因 StaleConfig
错误而失败,并触发元数据刷新过程。刷新元数据可能会引入额外的操作延迟。
在从属节点上,如果复制延迟很大,元数据刷新可能需要很长时间。对于从属节点读取,将 maxStalenessSeconds
设置为最小化复制延迟的影响。
配置服务器可用性
如果配置服务器副本集丢失了主节点且无法选出主节点,集群元数据变为只读。您仍然可以读写分片中的数据,但副本集选出主节点之前不会发生数据块迁移或数据块拆分。
在分片集群中,mongod
和mongos
实例会监控分片集群中的副本集(例如分片副本集、配置服务器副本集)。
如果所有配置服务器都不可用,集群可能会变得不可操作。为了确保配置服务器始终可用且完整,配置服务器的备份至关重要。配置服务器上的数据量相对于集群存储的数据量较小,且配置服务器的活动负载相对较低。
有关更多信息,请参阅配置服务器副本集成员不可用。
分片集群元数据
配置服务器在config
数据库中存储元数据。
重要
在进行配置服务器任何维护之前,请始终备份config
数据库。
要访问config
数据库,请在mongosh
中执行以下命令:
use config
通常,您不应直接编辑config
数据库的内容。config
数据库包含以下集合:
有关这些集合及其在分片集群中的角色,更多信息请参阅配置数据库。有关配置服务器上的读取和更新操作,请参阅配置服务器上的读取和写入操作。
分片集群安全
使用自管理内部/成员身份验证来强制执行集群内部安全并防止未经授权的集群组件访问集群。您必须使用适当的设置启动集群中的每个mongod
以强制执行内部身份验证。
从MongoDB 5.3版本开始,SCRAM-SHA-1不能用于集群内部身份验证。仅支持SCRAM-SHA-256。
在以前的MongoDB版本中,即使SCRAM没有明确启用,也可以使用SCRAM-SHA-1和SCRAM-SHA-256进行集群内部身份验证。
有关部署安全分片集群的教程,请参阅使用密钥文件身份验证部署自管理分片集群。
配置分片
新增功能8.0.
从MongoDB 8.0版本开始,您可以为
配置配置服务器以存储您的应用程序数据以及通常的分片集群元数据。存储应用程序数据的配置服务器称为配置分片。
在配置分片和专用配置服务器之间转换配置服务器。
集群需要一个配置服务器,但它可以是配置分片而不是专用配置服务器。使用配置分片可以减少所需的节点数量并简化您的部署。
如果您的应用程序具有高可用性和弹性要求,请考虑部署专用配置服务器。专用配置服务器提供隔离、专用资源和关键集群操作的持续性能。
您不能为多个分片集群使用同一个配置分片。
命令
要将专用的配置服务器配置为配置分片,请运行 transitionFromDedicatedConfigServer
命令。
要将配置分片配置为专用配置服务器,请运行 transitionToDedicatedConfigServer
命令。
用户
在配置分片上创建的用户与在专用配置服务器上创建的用户行为相同。
确认使用配置分片
为了确认分片集群使用配置分片,请在连接到 mongos
的同时,针对 admin
数据库运行 listShards
命令,并检查输出中 _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" } )