文档菜单
文档首页
/
MongoDB 手册
/ / /

将自管理分片集群迁移到不同硬件

本页内容

  • 开始之前
  • 禁用均衡器
  • 分别迁移每个配置服务器
  • 重启mongos 实例
  • 迁移分片
  • 重新启用均衡器

本教程针对MongoDB 8.0。对于MongoDB的早期版本,请参阅MongoDB手册的相应版本。

分片集群的配置服务器作为副本集部署。副本集配置服务器必须运行WiredTiger 存储引擎

此过程在不影响读写的情况下,将分片集群的组件迁移到新的硬件系统。

重要

迁移正在进行时,不要尝试更改到分片集群元数据。不要使用任何以任何方式修改集群元数据的操作。例如,不要创建或删除数据库,创建或删除集合,或使用任何分片命令。

从MongoDB 8.0开始,您可以使用directShardOperations角色执行需要直接对分片执行命令的维护操作。

警告

使用directShardOperations角色运行命令可能导致您的集群无法正确工作,并可能导致数据损坏。仅将directShardOperations角色用于维护目的或MongoDB支持的指导下。完成维护操作后,请停止使用directShardOperations角色。

禁用均衡器以停止 数据分片迁移,并在过程完成之前不执行任何元数据写操作。如果正在迁移,均衡器将在停止之前完成正在进行的迁移。

要禁用均衡器,连接到集群中的一个 mongos 实例,并执行以下方法:[1]

sh.stopBalancer()

要检查均衡器状态,执行 sh.getBalancerState() 方法。

有关更多信息,请参阅 禁用均衡器。

[1] 从 MongoDB 6.0.3 版本开始,不再执行自动分片分割。这是由于均衡策略的改进。自动分割命令仍然存在,但不执行任何操作。在 MongoDB 6.0.3 以前的版本中,sh.stopBalancer() 也会禁用分片集群的自动分割。

分片集群的配置服务器可以部署为 副本集 (CSRS)。使用副本集作为配置服务器可以提高配置服务器之间的一致性,因为 MongoDB 可以利用标准的副本集读写协议来处理配置数据。此外,使用副本集作为配置服务器允许分片集群拥有超过 3 个配置服务器,因为副本集可以有最多 50 个成员。要将配置服务器作为副本集部署,配置服务器必须运行 WiredTiger 存储引擎

以下限制适用于用作配置服务器的副本集配置

  • 必须有零个 仲裁者

  • 必须没有 延迟成员

  • 必须建立索引(即,不应将成员的 members[n].buildIndexes 设置设置为 false)。

对于配置服务器副本集的每个成员

重要

在更换主成员之前先更换副成员。

1

启动一个 mongod 实例,指定 --configsvr--replSet--bind_ip 选项以及其他适合您部署的选项。

警告

在将实例绑定到公开可访问的 IP 地址之前,您必须确保您的集群免受未经授权的访问。有关安全建议的完整列表,请参阅 自管理部署安全清单。至少,请考虑 启用身份验证加强网络基础设施

mongod --configsvr --replSet <replicaSetName> --bind_ip localhost,<hostname(s)|ip address(es)>
2

连接使用 mongosh 连接到配置服务器副本集的主节点,并使用 rs.add() 添加新成员。

警告

在 MongoDB 5.0 之前,即使新添加的从节点既不能提供读取服务也不能成为主节点,直到其数据一致,它仍然被视为投票成员。如果您正在运行低于 5.0 版本的 MongoDB 并添加了一个具有其 votespriority 设置大于零的从节点,这可能会导致大多数投票成员在线,但无法选举出主节点。为了避免这种情况,请考虑最初将新从节点添加为具有 priority :0votes :0。然后,运行 rs.status() 确保成员已进入 SECONDARY 状态。最后,使用 rs.reconfig() 更新其优先级和投票。

rs.add( { host: "<hostnameNew>:<portNew>", priority: 0, votes: 0 } )

初始同步过程在不重启的情况下,将配置服务器副本集成员的所有数据复制到新成员。

mongos 实例会自动识别配置服务器副本集成员的变化,而无需重启。

3
  1. 确保新成员已达到 SECONDARY 状态。要检查副本集成员的状态,请运行 rs.status():

    rs.status()
  2. 重新配置副本集以更新新成员的投票和优先级。

    var cfg = rs.conf();
    cfg.members[n].priority = 1; // Substitute the correct array index for the new member
    cfg.members[n].votes = 1; // Substitute the correct array index for the new member
    rs.reconfig(cfg)

    其中 nmembers 数组中新成员的数组索引。

警告

  • rs.reconfig() 命令行方法可以强制当前主节点下台,这会导致 选举。当主节点下台时,mongod 关闭所有客户端连接。虽然这通常需要 10-20 秒,但请尽量在计划维护期间进行这些更改。

  • 避免重新配置包含不同MongoDB版本成员的副本集,因为验证规则可能在MongoDB版本之间有所不同。

4

如果正在替换主成员,请先降级主成员,然后再关闭。

5

在完成替换配置服务器的初始同步后,从连接到主成员的 mongosh 会话中,使用 rs.remove() 删除旧成员。

rs.remove("<hostnameOld>:<portOld>")

mongos 实例会自动识别配置服务器副本集成员的变化,而无需重启。

在副本集配置服务器中,mongos 实例在 --configdbsharding.configDB 设置中指定配置服务器副本集名称和至少一个副本集成员。分片集群的 mongos 实例必须指定相同的配置服务器副本集名称,但可以指定副本集的不同成员。

如果 mongos 实例在 --configdbsharding.configDB 设置中指定了迁移的副本集成员,在下次重启 mongos 实例时,请更新配置服务器设置。

有关更多信息,请参阅 启动分片集群的 mongos

一次迁移一个分片。对于每个分片,请遵循本节中的适当程序。

要迁移分片集群,请分别迁移每个成员。首先迁移非主成员,然后最后迁移 成员。

如果副本集有两个投票成员,请向副本集添加一个 仲裁者,以确保在迁移过程中副本集保持多数投票可用。迁移完成后,您可以移除仲裁者。

  1. 关闭 mongod 进程。为了确保干净关闭,使用 shutdown 命令。

  2. 将数据目录(即,dbPath)移动到新机器。

  3. 在新位置重新启动 mongod 进程。

  4. 连接到副本集当前的主节点。

  5. 如果成员的主机名已更改,使用 rs.reconfig() 更新 replica set configuration document 以包含新的主机名。

    例如,以下命令序列更新了 members 数组中位置 2 的实例的主机名

    cfg = rs.conf()
    cfg.members[2].host = "pocatello.example.net:27018"
    rs.reconfig(cfg)

    有关更新配置文档的更多信息,请参阅 示例。

  6. 为了确认新的配置,请发出 rs.conf()

  7. 等待成员恢复。要检查成员的状态,请发出 rs.status()

在迁移副本集的主节点时,必须选举一个新的主节点。这个过程在选举期间使副本集无法执行读取或接受写入,但通常很快完成。如果可能,请计划在维护窗口期间进行迁移。

  1. 降低主节点的优先级以允许正常的故障转移过程。要降低主节点的优先级,连接到主节点并执行replSetStepDown命令或rs.stepDown()方法。以下示例展示了rs.stepDown()方法。

    rs.stepDown()
  2. 一旦主节点降低优先级,另一个成员成为PRIMARY状态。要迁移降低优先级的主节点,请按照迁移副本集分片成员程序进行。

    您可以通过检查rs.status()的输出以确认状态变化。

要完成迁移,请重新启用均衡器以恢复数据分片迁移

连接到集群的mongos实例,并将true传递给sh.startBalancer()方法:[2]

sh.startBalancer()

要检查均衡器状态,执行 sh.getBalancerState() 方法。

有关更多信息,请参阅启用均衡器

[2] 从 MongoDB 6.0.3 版本开始,不再执行自动分片分割。这是由于均衡策略的改进。自动分割命令仍然存在,但不执行任何操作。在MongoDB 6.0.3之前的版本中,sh.startBalancer()还启用了分片集群的自动分割。

返回

重启