对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。

从嵌入式配置服务器过渡到专用配置服务器

要从嵌入式配置服务器过渡到专用配置服务器,必须确保配置分片的数据已迁移到集群中的其余分片。此过程描述如何安全迁移数据并完成过渡。

  • 执行此过程时创建、分片或移动集合可能会导致中断并导致意外结果。

  • 请勿使用此过程将整个集群迁移到新硬件。 要迁移,请参阅将自管理分片集群迁移到不同硬件。

  • 当您从集群中删除数据段分布不均匀的分片时,负载均衡器首先从要清空的分片中删除数据段,然后均衡剩余的不均匀数据段分布。

  • 删除分分片可能会导致打开的变更流游标关闭,并且关闭的变更流游标可能无法完全恢复。

  • 您可以在过渡进程中安全地重新启动集群。如果在正在进行的排干进程中重新启动集群,则在集群组件重新启动后,排干会自动继续。MongoDB将转换状态记录在config.shards集合中。

  1. 此过程使用 sh.moveCollection() 方法将集合移出配置分片。在开始此过程之前,查看moveCollection 注意事项 和 要求,以了解命令行为。

  2. 要过渡到专用配置服务器,请先使用 连接到集群的mongos mongosh实例之一。

1

要从配置分分片迁移数据,必须启用负载均衡器进程。要检查负载负载均衡器状态,请使用 sh.getBalancerState() 方法:

sh.getBalancerState()

如果操作返回true ,则负载均衡器已启用。

如果操作返回false ,请参阅启用负载均衡器。

2

运行 listShards 以确认配置分片出现在分片列表中:

db.adminCommand( { listShards: 1 } )

在输出中,shards._id字段包含分片名称。配置分片的_id 通常为 "config":

{ shards: [ { _id: 'config', ... }, ... ], ok: 1 ...}
3

从 admin数据库运行transitionToDedicatedConfigServer 命令:

use admindb.adminCommand( { transitionToDedicatedConfigServer: 1 } )

配置分片进入排干状态,负载均衡器开始将数据块从配置分片迁移到集群中的其余分片。根据网络容量和数据量,此操作可能需要几分钟到几天才能完成。

4

使用 $listClusterCatalog 聚合阶段识别仍驻留在配置分片上的未分片集合:

use admindb.aggregate([ { $listClusterCatalog: { shards: true } }, { $match: { sharded: false, shards: "config", type: { $nin: ["timeseries", "view"] }, ns: { $not: { $regex: "^enxcol_\\..*(\\.esc|\\.ecc|\\.ecoc|\\.ecoc\\.compact)$" } }, $or: [ { ns: { $not: { $regex: "\\.system\\." } } }, { ns: { $regex: "\\.system\\.buckets\\." } } ], db: { $nin: ["config", "admin"] } } }, { $project: { _id: 0, ns: 1 } }])

对于输出中的每个命名空间,使用 sh.moveCollection() 将未分片集合从配置分片移动到接收分片:

sh.moveCollection( "<database>.<collection>", "<ID of recipient shard>")

重复此步骤,直到配置分分片上没有未分片的集合。

5

从 admin数据库运行db.printShardingStatus():

use admindb.printShardingStatus()

在输出的 databases 部分,检查每个数据库的 primary字段。对于主节点 (primary node in the replica set)为配置分片的任何应用程序数据库(config 和 admin 以外的数据库),请将主分片更改为其他分片。

要更改数据库的主分片,运行movePrimary:

db.adminCommand({ movePrimary: "<dbName>", to: "<recipientShard>"})

在上一步中未移动的任何集合在 movePrimary 运行时都不可用。

6

要检查转换进度,请从admin数据库重新运行transitionToDedicatedConfigServer:

use admindb.adminCommand( { transitionToDedicatedConfigServer: 1 } )

继续检查状态,直到转换成功完成,输出类似于以下示例:

{ state: 'completed', msg: 'removeshard completed successfully', shard: 'config', ok: 1}
7

在配置分片报告 state 为 'completed' 后,提交从嵌入式配置服务器到专用配置服务器的转换:

use admindb.adminCommand( { commitTransitionToDedicatedConfigServer: 1 } )

成功提交会返回以下输出:

{ ok: 1, '$clusterTime': { ... }, operationTime: ...}

成功后, MongoDB将从集群元数据中删除 config分片,并完成向专用配置服务器的过渡。如果配置分分片未完全耗尽,则该命令将失败,您必须在重试之前继续检查 { state: 'completed' } 的转换状态。

提交转换后,listShards 不再将配置分片包含在分片列表中。集群现在使用专用的配置服务器,并且配置服务器不再将应用程序数据存储为分片。