将成员添加到副本集中

在本页面

Overview

本教程说明了如何向现有的replica set添加其他成员。有关复制部署模式的背景,请参阅副本集部署体系结构文档。

投票人数上限

一个副本集最多可以有七个voting members。要将成员添加到已经具有七个投票成员的副本集中,您必须将该成员添加为non-voting member或从existing member中删除投票。

Init Scripts

在生产部署中,您可以配置init script来 Management 成员流程。

Existing Members

您可以使用以下过程将新成员添加到现有集中。您也可以使用相同的过程“重新添加”已删除的成员。如果被删除的成员的数据仍是相对较新的,则可以轻松恢复和追赶。

Data Files

如果您有现有成员的备份或快照,则可以将数据文件(例如dbPath目录)移动到新系统,并使用它们快速启动新成员。这些文件必须是:

Important

始终使用文件系统快照来创建现有副本集的成员的副本。 请勿 使用mongodumpmongorestore播种新的副本集成员。

  • primary's oplog中最早的操作更新。通过应用主要成员的 oplog 中的操作,新成员必须能够成为当前成员。

IP Binding

从 MongoDB 3.6 开始,默认情况下,MongoDB 二进制文件mongodmongos绑定到 localhost(127.0.0.1)。如果为二进制文件设置了net.ipv6配置文件设置或--ipv6命令行选项,则该二进制文件还会绑定到 IPv6 地址::1

以前,从 MongoDB 2.6 开始,默认情况下,只有正式 MongoDB RPM(Red Hat,CentOS,Fedora Linux 和派生版本)和 DEB(Debian,Ubuntu 和派生版本)程序包中的二进制文件绑定到 localhost。

当仅绑定到 localhost 时,这些 MongoDB 3.6 二进制文件只能接受来自同一台计算机上运行的 Client 端(包括mongo shell,副本集中的其他成员和分片群集)的连接。远程 Client 端无法连接到仅绑定到 localhost 的二进制文件。

要覆盖并绑定到其他 IP 地址,可以使用net.bindIp配置文件设置或--bind_ip命令行选项来指定 IP 地址列表。

Warning

绑定到非 localhost(例如可公开访问)的 IP 地址之前,请确保已保护群集免受未经授权的访问。有关安全建议的完整列表,请参见Security Checklist。至少考虑enabling authentication加强网络基础设施

例如,以下mongod实例同时绑定到 localhost 和示例 IP 地址198.51.100.1

mongod --bind_ip localhost,198.51.100.1

为了连接到该实例,远程 Client 端必须指定 IP 地址198.51.100.1或与该 IP 地址关联的主机名:

mongo --host 198.51.100.1

mongo --host My-Example-Associated-Hostname

Requirements

  • 活动副本集。

  • 新的 MongoDB 系统能够支持您的数据集,活动副本集可以通过网络对其进行访问。

否则,请使用 MongoDB installation tutorial部署副本集教程。

Procedures

准备数据目录

在将新成员添加到现有replica set之前,请使用以下策略之一准备新成员的data directory

  • 确保新成员的数据目录包含数据。新成员将复制现有成员的数据。

如果新成员处于recovering状态,则它必须退出并成为secondary,然后 MongoDB 才能在复制过程中复制所有数据。此过程需要时间,但不需要 Management 员干预。

  • 从现有成员手动复制数据目录。新成员成为辅助成员,并将赶上副本集的当前状态。复制数据可能会缩短新成员成为最新成员的时间。

确保可以将数据目录复制到新成员,然后在oplog 允许的窗口内开始复制。否则,新实例将必须执行初始同步,该同步将完全重新同步数据,如重新同步副本集的成员中所述。

使用rs.printReplicationInfo()检查关于操作日志的副本集成员的当前状态。

有关复制部署模式的背景信息,请参阅副本集部署体系结构文档。

将成员添加到现有副本集中

  • 启动新的mongod实例。指定数据目录和副本集名称。下面的示例指定/srv/mongodb/db0数据目录和rs0副本集:
mongod --dbpath /srv/mongodb/db0 --replSet rs0  --bind_ip localhost,<ip address of the mongod host>

Warning

绑定到非 localhost(例如可公开访问)的 IP 地址之前,请确保已保护群集免受未经授权的访问。有关安全建议的完整列表,请参见Security Checklist。至少考虑enabling authentication加强网络基础设施

有关配置选项的更多信息,请参见mongod手册页。

Optional

您可以在mongod.conf configuration file中指定数据目录,副本集名称和 ip 绑定,并使用以下命令启动mongod

mongod --config /etc/mongod.conf
  • 连接到副本集的主数据库。

您只能在连接到主要成员时添加成员。如果您不知道哪个成员是主要成员,请登录到副本集的任何成员并发出db.isMaster()命令。

  • 使用rs.add()将新成员添加到副本集。将成员配置文件传递给方法。例如,要在主机mongodb3.example.net上添加成员,请发出以下命令:
rs.add( { host: "mongodb3.example.net:27017", priority: 0, votes: 0 } )

Tip

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

这可能导致大多数投票成员在线但无法选举主要成员的情况。为避免这种情况,请考虑首先使用priority :0votes :0添加新的辅助服务器。然后,一旦成员已转换为SECONDARY状态,请使用rs.reconfig()更新其优先级和投票。

  • 确保新成员已达到SECONDARY状态。要检查副本集成员的状态,请运行rs.status()
rs.status()

例如,如果rs.conf()返回mongodb3.example.net:27017的配置文档作为members数组中的第五个元素,以将其优先级更新并投票给1,请使用以下操作序列:

var cfg = rs.conf();
cfg.members[4].priority = 1
cfg.members[4].votes = 1
rs.reconfig(cfg)

Warning

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

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