更换配置服务器

在本页面

Important

以下过程适用于 3.6 配置服务器。对于 MongoDB 的早期版本,请参考《 MongoDB 手册》的相应版本。

Overview

如果配置服务器副本集变为只读,即没有主服务器,则分片群集将无法支持更改群集元数据的操作,例如块拆分和迁移。尽管无法拆分或迁移任何块,但应用程序将能够将数据写入分片群集。

如果其中一台配置服务器不可用或无法运行,请尽快修复或更换它。以下过程将配置服务器副本集的成员替换为新成员。

本教程特定于 MongoDB 3.6. 对于 MongoDB 的早期版本,请参考《 MongoDB 手册》的相应版本。

Considerations

当用于配置服务器时,以下限制适用于副本集配置:

  • 必须为零arbiters

  • 不得包含delayed members

  • 必须构建索引(即,没有成员应将buildIndexes设置设为 false)。

Procedure

启动替换配置服务器。

启动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

当新添加的辅助节点的votespriority设置大于零时,在其初始同步期间,即使辅助节点不能提供读取或成为主节点,因为其数据仍不一致,所以该辅助节点仍会计为有表决权的成员。

这可能导致大多数投票成员在线但无法选举主要成员的情况。为避免这种情况,请考虑首先使用priority :0votes :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)

其中nmembers数组中新成员的数组索引。

Warning

  • rs.reconfig() shell 方法可以强制当前主节点降级,从而导致election。当主服务器降级时,mongod关闭所有 Client 端连接。尽管这通常需要 10 到 20 秒,但请尝试在计划的维护期间进行这些更改。

  • 避免重新配置包含不同 MongoDB 版本成员的副本集,因为验证规则在 MongoDB 版本之间可能有所不同。

关闭该成员以进行替换。

如果要更换主要部件,请先关闭主要部件,然后再关闭。

从配置服务器副本集中删除要替换的成员。

替换配置服务器的初始同步完成后,从连接到主服务器的mongo shell 中使用rs.remove()删除旧成员。

rs.remove("<hostnameOld>:<portOld>")

mongos实例无需重新启动即可自动识别配置服务器副本集成员中的更改。

如有必要,请更新 mongos 配置或 DNS 条目。

对于副本集配置服务器,mongos实例在--configdbsharding.configDB中指定设置配置服务器副本集名称和至少一个副本集成员。

这样,如果mongos实例未在--configdbsharding.configDB设置中指定已删除的副本集成员,则无需采取进一步的措施。

但是,如果mongos实例在--configdbconfigDB设置中指定了已删除的成员,则可以:

  • 下次重新启动mongos时更新设置,或者

  • 修改 DNS 条目,该条目指向提供旧配置服务器的系统,以便* same *主机名指向新的配置服务器。