Docs 菜单

Docs 主页开发应用程序MongoDB Manual

movePrimary

在此页面上

  • 考虑因素
  • 更多信息
movePrimary

分片集群中, movePrimary会重新分配用于保存数据库中所有未分片集合的分片。 movePrimary首先更改集群元数据中的主分片,然后将所有未分片集合迁移到指定的分。使用以下形式的命令:

db.adminCommand( { movePrimary: <databaseName>, to: <newPrimaryShard> } )

例如,以下命令将主分片从test移动到shard0001

db.adminCommand( { movePrimary : "test", to : "shard0001" } )

当命令返回时,数据库的主分片位置已切换到指定的分片。 要完全停用分片,请使用removeShard命令。

movePrimary是管理命令,仅适用于mongos实例。

警告

启动movePrimary后,在该命令完成之前,请勿对该数据库中的任何分片集合执行任何读取或写入操作。迁移期间对这些集合发出的读取或写入操作可能会导致意外行为,包括迁移操作可能失败或数据丢失。

mongos对 使用"majority" movePrimary写关注。

movePrimary 可能需要很长时间才能完成,具体取决于数据库的大小以及网络运行状况或计算机资源等因素。 迁移期间对数据库发出的读取或写入操作可能会导致意外行为,包括迁移操作可能失败或数据丢失。

请考虑安排一个维护窗口,在此期间应用程序会停止对集群的所有读取和写入。在计划内停机期间发出movePrimary可以降低由于交叉读取或写入数据库中的未分片集合而导致出现未定义行为的风险。

对于 MongoDB4 。2 和之前的版本中,如果在包含未 分片 集合的数据库上使用movePrimary 命令,则必须执行以下额外步骤。

注意

在移动包含未分片集合的数据库时,MongoDB 4.4 不需要执行这些额外步骤。

  • 对于 MongoDB 4.2,必须:

    • 重启所有 mongos 实例所有 mongod 分片节点(包括从节点);

    • 在向移动后的任何未分片集合读取或写入任何数据之前,对所有 mongos 实例和所有 mongod 分片节点(包括从节点)使用 flushRouterConfig 命令。

  • 对于 MongoDB 4.0 及更早版本,必须:

    • 重启所有 mongos 实例;

    • 在向任何已移动的未分片集合读取或写入任何数据之前,请对所有 mongos 实例使用 flushRouterConfig 命令。

这些步骤确保所有集群节点刷新其元数据缓存,其中包括主分片的位置。否则,您可能会在读取时丢失数据,并且可能无法将数据写入正确的分片。要恢复,您必须手动干预。

movePrimary 如果目标分片包含有冲突的collection命名空间,则会失败。例如:

  1. 管理员发出movePrimary来更改hr数据库的主分片。

  2. movePrimary移动hr中的未分片集合时,用户或应用程序对该集合发出写操作。 写入操作会在原始主分片中创建collection。

  3. 管理员稍后发出movePrimary来恢复hr数据库的原始主分片。

  4. movePrimary 由于交错写入操作留下的命名空间冲突而失败。

作为movePrimary操作的一部分,目标分片必须在成为主分片后对迁移的collection重建索引。这可能需要大量时间,具体取决于每个collection的索引数量和要索引的数据量。

有关索引构建过程的更多信息,请参阅在已填充collection上构建索引。

有关完整过程,请参阅从现有分片集群中删除分片。

← moveChunk