移动主分片
movePrimary
在分片集群,
movePrimary
重新分配包含数据库中所有未分片集合的主分片。首先更改集群元数据中的主分片,然后将所有未分片集合迁移到指定的分片。使用以下格式的命令db.adminCommand( { movePrimary: <databaseName>, to: <newPrimaryShard> } ) 例如,以下命令将主分片从
test
移动到shard0001
db.adminCommand( { movePrimary : "test", to : "shard0001" } ) 当命令返回时,数据库的主分片位置已切换到指定的分片。要完全停用分片,请使用
removeShard
命令。movePrimary
是仅适用于mongos
实例的管理命令。注意
启动
movePrimary
命令后,请勿在该数据库中对任何非分片集合执行任何读或写操作,直到命令完成。在迁移过程中对这些集合执行的读或写操作可能导致意外行为,包括迁移操作失败或数据丢失。
兼容性
此命令在以下环境中部署的部署中可用
MongoDB Atlas:云中 MongoDB 部署的全托管服务
重要
此命令不支持在无服务器实例上。有关更多信息,请参阅 不支持命令。
MongoDB Enterprise:基于订阅的自托管 MongoDB 版本
MongoDB Community:源可用的免费使用和自托管 MongoDB 版本
注意事项
mongos
对 movePrimary
使用 "majority"
写关注。
在维护窗口期间出现 movePrimary
问题
movePrimary
完成可能需要很长时间,具体取决于数据库的大小以及网络健康或机器资源等因素。在迁移期间对数据库执行读写操作可能会导致意外行为,包括迁移操作失败或数据丢失。
考虑在应用程序停止对集群进行所有读写操作期间安排维护窗口。在计划停机期间执行 movePrimary
可以减轻由于对数据库中未分片的集合进行交错读写而导致遇到未定义行为的风险。
命名空间冲突阻止迁移
movePrimary
在目标分片包含冲突的集合命名空间时失败。例如
管理员发出
movePrimary
以更改hr
数据库的主分片。当
movePrimary
正在移动该集合时,用户或应用程序对hr
中的未分片集合发出写操作。写操作在原始主分片创建了该集合。管理员随后发出
movePrimary
以恢复hr
数据库的原始主分片。movePrimary
因交错写操作留下的冲突命名空间而失败。
目标分片必须重建索引
作为movePrimary
操作的一部分,目标分片必须在成为主分片后重建迁移集合的索引。这可能需要根据每个集合的索引数量和要索引的数据量而显著的时间。
有关索引构建过程的更多信息,请参阅已填充集合上的索引构建。
移动具有Change Streams的集合
从MongoDB 8.0开始,movePrimary
不会使具有change streams的集合无效。更改流可以在集合移动到新分片后继续从集合中读取事件。
在早期版本的MongoDB中,movePrimary
会使集合更改流无效,更改流无法从集合中读取事件。
在所有MongoDB版本中,movePrimary
会更新已移动的非分片集合的UUID。
更多信息
请参阅从分片集群中移除分片以获取完整步骤。