要从嵌入式配置服务器过渡到专用配置服务器,必须确保配置分片的数据已迁移到集群中的其余分片。此过程描述如何安全迁移数据并完成过渡。
关于此任务
执行此过程时创建、分片或移动集合可能会导致中断并导致意外结果。
请勿使用此过程将整个集群迁移到新硬件。要迁移,请参阅 将自管理分片集群迁移到不同硬件。
当您从集群中删除数据段分布不均匀的分片时,负载均衡器首先从要清空的分片中删除数据段,然后均衡剩余的不均匀数据段分布。
删除分分片可能会导致打开的变更流游标关闭,并且关闭的变更流游标可能无法完全恢复。
您可以在过渡进程中安全地重新启动集群。如果在正在进行的排干进程中重新启动集群,则在集群组件重新启动后,排干会自动继续。 MongoDB将转换状态记录在
config.shards集合中。
开始之前
此过程使用
sh.moveCollection()方法将集合移出配置分片。在开始此过程之前,查看moveCollection注意事项和要求,以了解命令行为。要过渡到专用配置服务器,请先使用
mongos连接到集群的mongosh实例之一。
步骤
确保负载均衡器已启用。
要从配置分分片迁移数据,必须启用负载均衡器进程。要检查负载负载均衡器状态,请使用sh.getBalancerState() 方法:
sh.getBalancerState()
如果操作返回true ,则负载均衡器已启用。
如果操作返回false ,请参阅启用负载均衡器。
验证配置服务器是否充当分片。
运行listShards 以确认配置分片出现在分片列表中:
db.adminCommand( { listShards: 1 } )
在输出中,shards._id字段包含分片名称。配置分片的_id 通常为 "config":
{ shards: [ { _id: 'config', ... }, ... ], ok: 1 ... }
开始从配置分分片迁移分片的数据。
从admin 数据库运行transitionToDedicatedConfigServer 命令:
use admin db.adminCommand( { transitionToDedicatedConfigServer: 1 } )
配置分片进入排干状态,负载均衡器开始将数据段从配置分片迁移到集群中的其余分片。根据网络容量和数据量,此操作可能需要几分钟到几天才能完成。
将未分片的集合从配置分片移出。
使用$listClusterCatalog 聚合阶段识别仍驻留在配置分分片上的未分片集合:
use admin db.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>" )
重复此步骤,直到配置分分片上没有未分片的集合。
更改使用配置分片的数据库的主分片。
从admin 数据库运行db.printShardingStatus() :
use admin db.printShardingStatus()
在输出的 databases 部分,检查每个数据库的 primary字段。对于主节点 (primary node in the replica set)为配置分片的任何应用程序数据库(config 和 admin 以外的数据库),请将主分片更改为其他分片。
要更改数据库的主分片,运行movePrimary :
db.adminCommand({ movePrimary: "<dbName>", to: "<recipientShard>" })
在上一步中未移动的任何集合在movePrimary 运行时都不可用。
检查转换状态。
要检查转换进度,请从 数据库重新运行transitionToDedicatedConfigServer admin:
use admin db.adminCommand( { transitionToDedicatedConfigServer: 1 } )
继续检查状态,直到转换成功完成,输出类似于以下示例:
{ state: 'completed', msg: 'removeshard completed successfully', shard: 'config', ok: 1 }
将过渡提交到专用配置服务器。
在配置分片报告 state 为 'completed' 后,提交从嵌入式配置服务器到专用配置服务器的转换:
use admin db.adminCommand( { commitTransitionToDedicatedConfigServer: 1 } )
成功提交返回以下输出:
{ ok: 1, '$clusterTime': { ... }, operationTime: ... }
成功后, MongoDB将从集群元数据中删除 config分片,并完成向专用配置服务器的过渡。如果配置分分片未完全耗尽,则该命令将失败,您必须在重试之前继续检查 { state: 'completed' } 的转换状态。
提交转换后,listShards 不再将配置分片包含在分片列表中。集群现在使用专用的配置服务器,并且配置服务器不再将应用程序数据存储为分片。