替换自托管配置服务器
重要
以下步骤适用于8.0配置服务器。对于MongoDB的早期版本,请参阅MongoDB手册的相应版本。
概述
如果配置服务器副本集变为只读,即没有主节点,分片集群无法支持更改集群元数据的操作,例如分片拆分和迁移。虽然无法拆分或迁移分片,但应用程序仍然可以向分片集群写入数据。
如果某个配置服务器不可用或无法使用,请尽快修复或替换它。以下步骤用新成员替换配置服务器副本集的一个成员。配置服务器副本集
本教程针对MongoDB 8.0。对于MongoDB的早期版本,请参阅MongoDB手册的相应版本。
注意事项
当用于配置服务器时,副本集配置有以下限制
必须有零个仲裁者。
不能有延迟成员。
必须构建索引(即成员不应有
members[n].buildIndexes
设置设置为 false)。
程序
将新的配置服务器添加到副本集。
连接将 mongosh
连接到配置服务器副本集的主节点,并使用 rs.add()
添加新的成员。
警告
在 MongoDB 5.0 之前,即使新添加的副节点既不能处理读取操作也不能成为主节点直到其数据一致,它仍然被视为一个投票成员。如果您正在运行 MongoDB 5.0 之前的版本,并添加了一个副节点,其 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
数组中的数组索引。
警告
shell 方法
rs.reconfig()
可以强制当前主节点降级,这将触发一个 选举。当主节点降级时,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 条目,以便相同的主机名指向新的配置服务器。