将自管理分片集群迁移到不同硬件
本教程针对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)。
对于配置服务器副本集的每个成员
重要
在更换主成员之前先更换副成员。
将新配置服务器添加到副本集中。
连接使用 mongosh
连接到配置服务器副本集的主节点,并使用 rs.add()
添加新成员。
警告
在 MongoDB 5.0 之前,即使新添加的从节点既不能提供读取服务也不能成为主节点,直到其数据一致,它仍然被视为投票成员。如果您正在运行低于 5.0 版本的 MongoDB 并添加了一个具有其 votes
和 priority
设置大于零的从节点,这可能会导致大多数投票成员在线,但无法选举出主节点。为了避免这种情况,请考虑最初将新从节点添加为具有 priority :0
和 votes :0
。然后,运行 rs.status()
确保成员已进入 SECONDARY
状态。最后,使用 rs.reconfig()
更新其优先级和投票。
rs.add( { host: "<hostnameNew>:<portNew>", priority: 0, votes: 0 } )
初始同步过程在不重启的情况下,将配置服务器副本集成员的所有数据复制到新成员。
mongos
实例会自动识别配置服务器副本集成员的变化,而无需重启。
更新新添加的配置服务器的投票和优先级设置。
确保新成员已达到
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
数组中新成员的数组索引。
警告
rs.reconfig()
命令行方法可以强制当前主节点下台,这会导致 选举。当主节点下台时,mongod
关闭所有客户端连接。虽然这通常需要 10-20 秒,但请尽量在计划维护期间进行这些更改。避免重新配置包含不同MongoDB版本成员的副本集,因为验证规则可能在MongoDB版本之间有所不同。
从配置服务器副本集中删除待替换的成员。
在完成替换配置服务器的初始同步后,从连接到主成员的 mongosh
会话中,使用 rs.remove()
删除旧成员。
rs.remove("<hostnameOld>:<portOld>")
mongos
实例会自动识别配置服务器副本集成员的变化,而无需重启。
重启 mongos
实例。
在副本集配置服务器中,mongos
实例在 --configdb
或 sharding.configDB
设置中指定配置服务器副本集名称和至少一个副本集成员。分片集群的 mongos
实例必须指定相同的配置服务器副本集名称,但可以指定副本集的不同成员。
如果 mongos
实例在 --configdb
或 sharding.configDB
设置中指定了迁移的副本集成员,在下次重启 mongos
实例时,请更新配置服务器设置。
有关更多信息,请参阅 启动分片集群的 mongos
。
迁移分片
一次迁移一个分片。对于每个分片,请遵循本节中的适当程序。
迁移副本集分片
要迁移分片集群,请分别迁移每个成员。首先迁移非主成员,然后最后迁移 主 成员。
如果副本集有两个投票成员,请向副本集添加一个 仲裁者,以确保在迁移过程中副本集保持多数投票可用。迁移完成后,您可以移除仲裁者。
将副本集分片成员迁移
将数据目录(即,
dbPath
)移动到新机器。在新位置重新启动
mongod
进程。连接到副本集当前的主节点。
如果成员的主机名已更改,使用
rs.reconfig()
更新replica set configuration document
以包含新的主机名。例如,以下命令序列更新了
members
数组中位置2
的实例的主机名cfg = rs.conf() cfg.members[2].host = "pocatello.example.net:27018" rs.reconfig(cfg) 有关更新配置文档的更多信息,请参阅 示例。
为了确认新的配置,请发出
rs.conf()
。等待成员恢复。要检查成员的状态,请发出
rs.status()
。
将副本集分片的主节点迁移
在迁移副本集的主节点时,必须选举一个新的主节点。这个过程在选举期间使副本集无法执行读取或接受写入,但通常很快完成。如果可能,请计划在维护窗口期间进行迁移。
降低主节点的优先级以允许正常的故障转移过程。要降低主节点的优先级,连接到主节点并执行
replSetStepDown
命令或rs.stepDown()
方法。以下示例展示了rs.stepDown()
方法。rs.stepDown() 一旦主节点降低优先级,另一个成员成为
PRIMARY
状态。要迁移降低优先级的主节点,请按照迁移副本集分片成员程序进行。您可以通过检查
rs.status()
的输出以确认状态变化。
重新启用均衡器
要完成迁移,请重新启用均衡器以恢复数据分片迁移。
连接到集群的mongos
实例,并将true
传递给sh.startBalancer()
方法:[2]
sh.startBalancer()
要检查均衡器状态,执行 sh.getBalancerState()
方法。
有关更多信息,请参阅启用均衡器。
[2] | 从 MongoDB 6.0.3 版本开始,不再执行自动分片分割。这是由于均衡策略的改进。自动分割命令仍然存在,但不执行任何操作。在MongoDB 6.0.3之前的版本中,sh.startBalancer() 还启用了分片集群的自动分割。 |