将分片群集迁移到其他硬件
在本页面
本教程特定于 MongoDB 3.6. 对于 MongoDB 的早期版本,请参考《 MongoDB 手册》的相应版本。
从 MongoDB 3.2 开始,可将分片群集的配置服务器部署为replica set。副本集配置服务器必须运行WiredTiger 存储引擎。 MongoDB 3.2 不赞成将三个镜像mongod实例用于配置服务器。
此过程将sharded cluster的组件移动到新的硬件系统,而不会造成读写中断。
Important
在迁移过程中,请勿尝试更改为分片群集元数据。不要使用任何以任何方式修改集群元数据的操作。例如,请勿创建或删除数据库,创建或删除集合或使用任何分片命令。
禁用平衡器
禁用平衡器以停止chunk migration并且在该过程完成之前不要执行任何元数据写入操作。如果正在进行迁移,那么平衡器将在停止之前完成正在进行的迁移。
要禁用平衡器,请连接到群集的mongos实例之一,然后发出以下方法:
sh.stopBalancer()
要检查平衡器状态,请发出sh.getBalancerState()方法。
有关更多信息,请参见禁用平衡器。
分别迁移每个配置服务器
在版本 3.4 中更改。
从 MongoDB 3.2 开始,分片群集的配置服务器可以部署为replica set(CSRS),而不是三个镜像配置服务器(SCCC)。对配置服务器使用副本集可提高配置服务器之间的一致性,因为 MongoDB 可以利用配置文件的标准副本集读写协议。此外,将副本集用于配置服务器允许分片群集具有 3 个以上的配置服务器,因为副本集最多可具有 50 个成员。要将配置服务器部署为副本集,配置服务器必须运行WiredTiger 存储引擎。
在 3.4 版中,MongoDB 删除对 SCCC 配置服务器的支持。
当用于配置服务器时,以下限制适用于副本集配置:
-
必须为零arbiters。
-
不得包含delayed members。
-
必须构建索引(即,没有成员应将
buildIndexes
设置设为 false)。
对于配置服务器副本集的每个成员:
Important
在更换主要部件之前,请更换次要部件。
启动替换配置服务器。
启动mongod实例,并指定--configsvr
,--replSet
,--bind_ip
选项和其他适用于您的部署的选项。
Warning
绑定到非 localhost(例如可公开访问)的 IP 地址之前,请确保已保护群集免受未经授权的访问。有关安全建议的完整列表,请参见Security Checklist。至少考虑enabling authentication和加强网络基础设施。
mongod --configsvr --replSet <replicaSetName> --bind_ip localhost,<ip address of the mongod host>
将新的配置服务器添加到副本集。
将mongo shell 连接到配置服务器副本集的主数据库,然后使用rs.add()添加新成员。
Tip
当新添加的辅助节点的votes和priority设置大于零时,在其初始同步期间,即使辅助节点不能提供读取或成为主节点,因为其数据仍不一致,所以该辅助节点仍会计为有表决权的成员。
这可能导致大多数投票成员在线但无法选举主要成员的情况。为避免这种情况,请考虑首先使用priority :0和votes :0添加新的辅助服务器。然后,一旦成员已转换为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数组中新成员的数组索引。
Warning
-
rs.reconfig() shell 方法可以强制当前主节点降级,从而导致election。当主服务器降级时,mongod关闭所有 Client 端连接。尽管这通常需要 10 到 20 秒,但请尝试在计划的维护期间进行这些更改。
-
避免重新配置包含不同 MongoDB 版本成员的副本集,因为验证规则在 MongoDB 版本之间可能有所不同。
关闭该成员以进行替换。
如果要更换主要部件,请先关闭主要部件,然后再关闭。
从配置服务器副本集中删除要替换的成员。
替换配置服务器的初始同步完成后,从连接到主服务器的mongo shell 中使用rs.remove()删除旧成员。
rs.remove("<hostnameOld>:<portOld>")
mongos实例无需重新启动即可自动识别配置服务器副本集成员中的更改。
重新启动 mongos 实例
在版本 3.2 中进行了更改:对于副本集配置服务器,mongos实例在--configdb或sharding.configDB中指定设置配置服务器副本集名称和至少一个副本集成员。分片群集的mongos实例必须指定相同的配置服务器副本集名称,但可以指定副本集的不同成员。
如果mongos实例在--configdb或sharding.configDB设置中指定了迁移的副本集成员,请在下次重新启动mongos实例时更新配置服务器设置。
有关更多信息,请参见为分片集群启动 mongos。
迁移碎片
一次迁移一个碎片。对于每个分片,请遵循本节中的适当步骤。
迁移副本集碎片
要迁移分片群集,请分别迁移每个成员。首先迁移非主要成员,然后最后迁移primary。
如果副本集具有两个投票成员,请向副本集添加arbiter,以确保该副本集在迁移过程中保持其多数票数可用。您可以在完成迁移后删除仲裁程序。
迁移副本集碎片的成员
-
将数据目录(即dbPath)移到新计算机上。
-
在新位置重新启动mongod进程。
-
连接到副本集的当前主副本。
-
如果成员的主机名已更改,请使用rs.reconfig()使用新的主机名更新副本集配置文档。
例如,以下命令序列更新members
数组中位置2
处的实例的主机名:
cfg = rs.conf()
cfg.members[2].host = "pocatello.example.net:27018"
rs.reconfig(cfg)
有关更新配置文档的更多信息,请参见Examples。
-
要确认新配置,请发出rs.conf()。
-
await 成员恢复。要检查成员的状态,请发出rs.status()。
迁移副本集分片中的主数据库
在迁移副本集的主要数据库时,该集合必须选择一个新的主要数据库。此故障转移过程使副本集在选举期间无法正常执行读取或接受写入操作,该过程通常很快完成。如果可能,请在维护时段内计划迁移。
- 降级主要数据库以允许正常的failover处理。要降级主要对象,请连接到主要对象并发出replSetStepDown命令或rs.stepDown()方法。下面的示例显示rs.stepDown()方法:
rs.stepDown()
- 一旦主要成员卸任,另一个成员成为PRIMARY状态。要迁移已降级的主数据库,请遵循迁移副本集碎片的成员步骤
您可以检查rs.status()的输出以确认状态更改。
重新启用平衡器
要完成迁移,请重新启用平衡器以恢复chunk migrations。
连接到群集的mongos实例之一,并将true
传递给sh.setBalancerState()方法:
sh.setBalancerState(true)
要检查平衡器状态,请发出sh.getBalancerState()方法。
有关更多信息,请参见启用平衡器。
©MongoDB,Inc 2008 年至今。 MongoDB,Mongo 和 Leaf 标志是 MongoDB,Inc.的注册商标。