将成员添加到副本集中
在本页面
Overview
本教程说明了如何向现有的replica set添加其他成员。有关复制部署模式的背景,请参阅副本集部署体系结构文档。
投票人数上限
一个副本集最多可以有七个voting members。要将成员添加到已经具有七个投票成员的副本集中,您必须将该成员添加为non-voting member或从existing member
中删除投票。
Init Scripts
在生产部署中,您可以配置init script来 Management 成员流程。
Existing Members
您可以使用以下过程将新成员添加到现有集中。您也可以使用相同的过程“重新添加”已删除的成员。如果被删除的成员的数据仍是相对较新的,则可以轻松恢复和追赶。
Data Files
如果您有现有成员的备份或快照,则可以将数据文件(例如dbPath目录)移动到新系统,并使用它们快速启动新成员。这些文件必须是:
- 来自同一副本集成员的数据文件的有效副本。有关更多信息,请参见使用文件系统快照备份和还原文档。
Important
始终使用文件系统快照来创建现有副本集的成员的副本。 请勿 使用mongodump和mongorestore播种新的副本集成员。
IP Binding
从 MongoDB 3.6 开始,默认情况下,MongoDB 二进制文件mongod和mongos绑定到 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( { host: "mongodb3.example.net:27017", priority: 0, votes: 0 } )
Tip
当新添加的辅助节点的votes和priority设置大于零时,在其初始同步期间,即使辅助节点不能提供读取或成为主节点,因为其数据仍不一致,所以该辅助节点仍会计为有表决权的成员。
这可能导致大多数投票成员在线但无法选举主要成员的情况。为避免这种情况,请考虑首先使用priority :0和votes :0添加新的辅助服务器。然后,一旦成员已转换为SECONDARY状态,请使用rs.reconfig()更新其优先级和投票。
- 确保新成员已达到SECONDARY状态。要检查副本集成员的状态,请运行rs.status():
rs.status()
- 一旦新添加的成员转换为SECONDARY状态,请根据需要使用rs.reconfig()更新新添加的成员的priority和votes。
例如,如果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 版本之间可能有所不同。