将自托管 MongoDB 分片集群迁移到新硬件

将自托管 MongoDB 分片集群迁移到新硬件

本教程专门适用于 MongoDB 8.0。使用更早版本时,请参阅对应版本的 MongoDB 手册。

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

本流程用于在无需为整体搬迁停止读写服务的情况下,将分片集群的组件迁移到新硬件。主节点选举期间仍可能出现短暂的读写不可用,详见后文的主节点迁移步骤。

开始之前

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

禁用均衡器

禁用均衡器以停止数据块迁移。在整个迁移流程结束之前,不要执行任何元数据写入。如果已有数据块迁移正在进行,均衡器会等待该次迁移完成后再停止。

连接集群中的一个 mongos 实例,并调用下列方法禁用均衡器:[1]

sh.stopBalancer()

调用 sh.getBalancerState() 检查均衡器状态。更多说明参见禁用均衡器。

逐台迁移配置服务器

分片集群的配置服务器可以部署为副本集(CSRS)。MongoDB 可以使用标准的副本集读写协议处理配置数据,因此这种部署方式能提高各配置服务器之间的一致性。副本集最多可以有50个成员,也使分片集群能够拥有超过3台配置服务器。

作为副本集部署的配置服务器必须运行 WiredTiger 存储引擎。配置服务器副本集还必须满足以下限制:

对配置服务器副本集中的每个成员,依次执行以下操作。

1. 启动新的配置服务器

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

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

2. 将新的配置服务器加入副本集

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

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)
    

    其中,n 是新成员在 members 数组中的下标。

4. 关闭要替换的成员

如果要替换的是主节点,应先使其降级,再关闭该节点。

5. 从配置服务器副本集中移除旧成员

新配置服务器完成初始同步后,在连接到主节点的 mongosh 会话中,通过 rs.remove() 移除旧成员。

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

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

重启 mongos 实例

使用配置服务器副本集时,mongos 实例通过 --configdb 或 sharding.configDB,指定配置服务器副本集名称及至少一个成员。集群中的所有 mongos 必须使用相同的配置服务器副本集名称,但可以指定不同成员。

如果某个 mongos 的 --configdb 或 sharding.configDB 指向已经迁移的副本集成员,应更新该设置,使其在下次重启时使用正确的配置服务器信息。

更多说明参见为分片集群启动 mongos。

迁移分片

一次迁移一个分片,并为每个分片执行本节对应的流程。

迁移副本集分片

逐个迁移副本集成员,先迁移非主节点成员,最后迁移主节点。

如果副本集只有两个投票成员,应添加一个仲裁节点,确保迁移期间多数票仍然可用。迁移完成后可以移除该仲裁节点。

迁移副本集分片中的单个成员

  1. 关闭 mongod 进程。使用 shutdown 命令,确保正常关闭。
  2. 将数据目录,也就是 dbPath,移动到新机器。
  3. 在新位置重新启动 mongod 进程。
  4. 连接副本集当前主节点。
  5. 如果成员的主机名改变,使用 rs.reconfig() 更新副本集配置文档中的主机名。例如,以下命令更新 members 数组中下标为2的实例:

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

    修改配置文档的更多说明参见 rs.reconfig() 示例。

  6. 调用 rs.conf() 确认新配置。
  7. 等待成员恢复,使用 rs.status() 检查状态。

迁移副本集分片中的主节点

迁移主节点时,副本集必须选出新主节点。选举期间,故障转移会使副本集暂时无法读取或接受写入;选举通常很快完成。条件允许时,应安排在维护窗口迁移。

  1. 先让主节点降级,以触发正常的故障转移。连接主节点后,执行 replSetStepDown 命令或 rs.stepDown() 方法。以下示例使用后者:

    rs.stepDown()
    
  2. 原主节点降级、另一个成员进入 PRIMARY 状态后,按照迁移副本集分片中的单个成员的流程,迁移已降级的原主节点。可以检查 rs.status() 的输出来确认状态变化。

重新启用均衡器

迁移完成后,重新启用均衡器,恢复数据块迁移。

连接一个 mongos 实例,调用 sh.startBalancer():[2]

sh.startBalancer()

调用 sh.getBalancerState() 检查均衡器状态。更多说明参见启用均衡器。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容