将自管理分片集群迁移到不同硬件
本教程仅适用于 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 开始,不再执行自动数据块分割。这是因为均衡策略的改进。自动分割命令仍然存在,但不执行操作。在 6.0.3 之前的 MongoDB 版本中,sh.stopBalancer() 还会为分片集群禁用自动分割。 |
单独迁移每个配置MongoDB Server
分片集群的配置服务器可以作为副本集 (CSRS) 来部署。对配置服务器使用副本集可以提高配置服务器之间的一致性,因为 MongoDB 可以利用配置数据的标准副本集读写协议。此外,使用配置服务器的副本集允许分片集群拥有 3 个以上的配置服务器,因为副本集最多可以有 50 个成员。要将配置服务器作为副本集来部署,该配置服务器必须运行 WiredTiger 存储引擎。
在用于配置服务器时,副本集的配置有以下限制:
不能有仲裁节点。
不得包含延迟节点。
必须构建索引(即任何成员的
members[n].buildIndexes
设置都应为 false)。
对于配置服务器副本集的每个成员:
重要
在替换主节点之前,先替换从节点。
启动替换配置服务器。
启动 mongod
实例,指定 --configsvr
、--replSet
、--bind_ip
选项,以及适合您部署的其他选项。
警告
将实例绑定到可公开访问的 IP 地址之前,必须保护集群免遭未经授权的访问。有关安全建议的完整列表,请参阅自管理部署的安全清单。至少应考虑启用身份验证和强化网络基础设施。
mongod --configsvr --replSet <replicaSetName> --bind_ip localhost,<hostname(s)|ip address(es)>
将新的配置服务器添加到副本集。
将 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()
shell 方法可以强制当前的主节点下台,从而导致选举。当主服务器向下运行时,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()
用新的主机名更新副本集配置文档。例如,以下命令序列会更新
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 开始,不再执行自动数据块分割。这是因为均衡策略的改进。自动分割命令仍然存在,但不执行操作。在 6.0.3 之前的 MongoDB 版本中,sh.startBalancer() 还支持分片集群的自动分割。 |