MongoDB 3.6版本如何取消error集合的分片?
取消MongoDB error集合分片的实操步骤
前置准备
- 确认分片集群所有节点(mongos、配置服务器、分片节点)运行稳定
- 提前备份error集合数据,避免操作失误:
mongodump --host <mongos_host> --port <mongos_port> --db <你的数据库名> --collection error
操作步骤
连接mongos节点
使用Mongo Shell连接到集群的mongos节点:mongosh --host <mongos_host> --port <mongos_port>替换占位符为实际的mongos地址和端口。
停止均衡器
迁移期间避免均衡器自动移动chunk干扰操作,先停止均衡器:sh.stopBalancer()执行以下命令确认均衡器已停止:
sh.getBalancerState()返回
false表示停止成功。确定主分片
找到error集合所在数据库的主分片(所有数据最终将迁移至此):db.getSiblingDB("<你的数据库名>").getPrimaryShard()记录返回的分片名称(例如
shard0000)。查看chunk分布
确认当前error集合的chunk在各分片的分布情况:db.getSiblingDB("<你的数据库名>").error.getShardDistribution()留意所有不在主分片上的chunk信息。
迁移所有chunk到主分片
对每个非主分片上的chunk,执行迁移命令:sh.moveChunk("<你的数据库名>.error", {<分片键字段>: <chunk起始值>}, "<主分片名称>")<分片键字段>:error集合当前使用的分片键(比如log_id)<chunk起始值>:从sh.status()的输出中获取对应chunk的起始值<主分片名称>:步骤3中记录的主分片名称
若chunk数量较多,可通过循环批量迁移:
var targetShard = "<主分片名称>" var chunks = db.getSiblingDB("config").chunks.find({ns: "<你的数据库名>.error", shard: {$ne: targetShard}}) chunks.forEach(function(chunk) { sh.moveChunk(chunk.ns, chunk.min, targetShard) })验证chunk迁移完成
再次查询chunk分布,确认所有chunk均已迁移到主分片:db.getSiblingDB("<你的数据库名>").error.getShardDistribution()输出应仅显示主分片的信息。
取消集合分片配置
执行命令将error集合从分片状态转为单分片集合:sh.disableSharding("<你的数据库名>.error")重启均衡器
操作完成后恢复均衡器运行:sh.startBalancer()确认均衡器已启动:
sh.getBalancerState()返回
true表示启动成功。恢复写入操作(若之前暂停)
如果操作前暂停了对error集合的写入,现在恢复相关应用的写入权限。验证取消分片成功
确认error集合已不再是分片集合:db.getSiblingDB("<你的数据库名>").error.stats().sharded返回
false表示操作成功。
内容的提问来源于stack exchange,提问作者Jithin M V
相关产品推荐
相关产品推荐

