重要
以下步骤适用于 7.0 配置服务器。对于早期版本的 MongoDB,请参阅相应版本的 MongoDB 手册。
Overview
如果配置服务器副本集变为只读,即没有主节点,则分片集群无法支持更改集群元数据的操作,例如数据块分割和迁移。虽然无法分割或迁移任何数据块,但应用程序能够将数据写入分片集群。
如果其中一个配置服务器不可用或无法运行,请尽快修复或更换。 以下过程将配置服务器副本集的节点替换为新成员。
本教程仅适用于 MongoDB 7.0。有关 MongoDB 的早期版本,请参阅相应版本的 MongoDB 手册。
Considerations
在用于配置服务器时,副本集的配置有以下限制:
不能有仲裁节点。
不得包含延迟节点。
必须构建索引(即 任何成员都不应将
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 配置或 DNS 条目。
使用副本集配置服务器时,mongos 实例在 --configdb 或 sharding.configDB 设置中指定配置服务器副本集名称和至少一个副本集节点。
因此,如果 mongos 实例未在 --configdb 或 sharding.configDB 设置中指定已删除的副本集成员,则无需执行进一步操作。
但是,如果 mongos 实例在 --configdb 或 configDB 设置中指定了已删除节点,则:
下次重新启动
mongos时更新设置,或者修改指向提供旧配置服务器的系统的 DNS 条目,使相同主机名指向新的配置服务器。