将自托管 MongoDB 分片集群迁移到新硬件
本教程专门适用于 MongoDB 8.0。使用更早版本时,请参阅对应版本的 MongoDB 手册。
分片集群的配置服务器部署为副本集,并且必须运行 WiredTiger 存储引擎。
本流程用于在无需为整体搬迁停止读写服务的情况下,将分片集群的组件迁移到新硬件。主节点选举期间仍可能出现短暂的读写不可用,详见后文的主节点迁移步骤。
开始之前
从 MongoDB 8.0 开始,可以使用 directShardOperations 角色,执行需要直接向分片发送命令的维护操作。
禁用均衡器
禁用均衡器以停止数据块迁移。在整个迁移流程结束之前,不要执行任何元数据写入。如果已有数据块迁移正在进行,均衡器会等待该次迁移完成后再停止。
连接集群中的一个 mongos 实例,并调用下列方法禁用均衡器:[1]
sh.stopBalancer()
调用 sh.getBalancerState() 检查均衡器状态。更多说明参见禁用均衡器。
逐台迁移配置服务器
分片集群的配置服务器可以部署为副本集(CSRS)。MongoDB 可以使用标准的副本集读写协议处理配置数据,因此这种部署方式能提高各配置服务器之间的一致性。副本集最多可以有50个成员,也使分片集群能够拥有超过3台配置服务器。
作为副本集部署的配置服务器必须运行 WiredTiger 存储引擎。配置服务器副本集还必须满足以下限制:
- 不能包含仲裁节点。
- 不能包含延迟成员。
- 必须建立索引,即不能把任何成员的
members[n].buildIndexes设为false。
对配置服务器副本集中的每个成员,依次执行以下操作。
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. 更新新配置服务器的投票与优先级
-
确认新成员已进入
SECONDARY状态。运行rs.status()检查成员状态:rs.status() -
重新配置副本集,更新新成员的投票和优先级:
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。
迁移分片
一次迁移一个分片,并为每个分片执行本节对应的流程。
迁移副本集分片
逐个迁移副本集成员,先迁移非主节点成员,最后迁移主节点。
如果副本集只有两个投票成员,应添加一个仲裁节点,确保迁移期间多数票仍然可用。迁移完成后可以移除该仲裁节点。
迁移副本集分片中的单个成员
- 关闭
mongod进程。使用shutdown命令,确保正常关闭。 - 将数据目录,也就是
dbPath,移动到新机器。 - 在新位置重新启动
mongod进程。 - 连接副本集当前主节点。
-
如果成员的主机名改变,使用
rs.reconfig()更新副本集配置文档中的主机名。例如,以下命令更新members数组中下标为2的实例:cfg = rs.conf() cfg.members[2].host = "pocatello.example.net:27018" rs.reconfig(cfg)修改配置文档的更多说明参见 rs.reconfig() 示例。
- 调用
rs.conf()确认新配置。 - 等待成员恢复,使用
rs.status()检查状态。
迁移副本集分片中的主节点
迁移主节点时,副本集必须选出新主节点。选举期间,故障转移会使副本集暂时无法读取或接受写入;选举通常很快完成。条件允许时,应安排在维护窗口迁移。
-
先让主节点降级,以触发正常的故障转移。连接主节点后,执行
replSetStepDown命令或rs.stepDown()方法。以下示例使用后者:rs.stepDown() -
原主节点降级、另一个成员进入
PRIMARY状态后,按照迁移副本集分片中的单个成员的流程,迁移已降级的原主节点。可以检查rs.status()的输出来确认状态变化。
重新启用均衡器
迁移完成后,重新启用均衡器,恢复数据块迁移。
连接一个 mongos 实例,调用 sh.startBalancer():[2]
sh.startBalancer()
调用 sh.getBalancerState() 检查均衡器状态。更多说明参见启用均衡器。











暂无评论内容