Overview
本教程介绍如何向现有 副本集添加额外节点。有关复制部署模式的背景,请参阅副本集部署架构文档。
最大有投票权成员数
一个副本集最多可以有七个投票成员。要将某个成员添加到已经有七个投票成员的副本集中,您必须将该成员添加为无投票权的成员,或者从  existing member 中移除一个投票。
初始化脚本
在生产部署中,您可以配置一个初始化脚本来管理成员进程。
Existing Members(现有成员)
可以使用这些程序向现有副本集添加新成员。
警告
每个副本集节点必须属于且只属于一个副本集。副本集节点不能属于多个副本集。
Restore Former Members(恢复以前的成员)
您可以使用这些步骤重新添加已删除的节点。
如果被删除节点上的数据相对较新,该节点就会恢复并赶上副本集的其他节点。
重要
当已删除的节点处于独立运行模式时,请勿在该节点上创建新的复制集合。如果该独立节点会重新加入副本集,则针对新集合的后续操作会出错。
数据文件
如果您有现有成员的备份或快照,则可将数据文件(例如 dbPath 目录)移至新系统,并使用它们来快速启动新成员。这些文件必须为:
- 来自同一副本集节点的数据文件的有效副本。如需了解更多信息,请参阅使用文件系统快照备份和恢复自管理部署文档。 - 重要- 始终使用文件系统快照为现有副本集的节点创建副本。请勿使用 - mongodump和- mongorestore作为新副本集节点的种子。
IP 绑定
警告
将实例绑定到可公开访问的 IP 地址之前,必须保护集群免遭未经授权的访问。有关安全建议的完整列表,请参阅自管理部署的安全清单。至少应考虑启用身份验证和强化网络基础设施。
MongoDB 二进制文件 mongod 和 mongos 默认绑定到本地主机。如果为此二进制文件设置了 net.ipv6 配置文件设置或 --ipv6 命令行选项,则该二进制文件还会绑定到本地主机 IPv6 地址。
默认情况下,绑定到本地主机的 mongod 和 mongos 只接受来自同一计算机上运行的客户端的连接。这种绑定行为包括 mongosh 和副本集或分片集群的其他节点。远程客户端无法连接到仅绑定到本地主机的二进制文件。
要覆盖默认绑定并绑定到其他 IP 地址,请使用 net.bindIp 配置文件设置或 --bind_ip 命令行选项来指定主机名或 IP 地址的列表。
警告
从 MongDB5.0 开始,仅配置了IP解决的水平分割DNS 节点无法通过初创企业验证并报告错误。请参阅disableSplitHorizonIPCheck。
例如,以下 mongod 实例会绑定到本地主机和主机名 My-Example-Associated-Hostname,而该主机名与 IP 地址 198.51.100.1 相关联:
mongod --bind_ip localhost,My-Example-Associated-Hostname 
为了连接到此实例,远程客户端必须指定主机名或其关联的 IP 地址 198.51.100.1:
mongosh --host My-Example-Associated-Hostname mongosh --host 198.51.100.1 
重要
要避免因 IP 地址变更而更新配置,请使用 DNS 主机名而非 IP 地址。在配置副本集成员或分片集群成员时,使用 DNS 主机名而非 IP 地址尤为重要。
在水平分割网络配置下,请使用主机名而非 IP 地址来配置集群。从 MongoDB 5.0 开始,仅配置了 IP 地址的节点将无法通过启动验证,因而不会启动。
要求
- 活动副本集。 
- 一个新的 MongoDB 系统,它可支持您的数据集,并可由活动副本集通过网络进行访问。 
步骤
准备数据目录
在向现有副本集添加新成员之前,请使用以下策略之一来准备新成员的数据目录:
- 确保新成员的数据目录不包含数据。新成员将复制现有成员的数据。 - 如果新成员处于正在恢复状态,则它必须退出并成为辅助成员,然后 MongoDB 才能在复制过程中复制所有数据。此过程需要一些时间,但无需管理员干预。 
- 从现有成员手动复制数据目录。 新成员成为从节点成员,并将赶上副本集的当前状态。 复制数据可能会缩短新成员成为当前成员的时间。 - 确保您可以将数据目录复制到新成员,并在 oplog 允许的窗口内开始复制。否则,新实例必须执行初始同步,这会完全重新同步数据,如重新同步自管理副本集成员中所述。 - 使用 - rs.printReplicationInfo()检查副本集成员针对 oplog 的当前状态。
有关复制部署模式的背景,请参阅副本集部署架构文档。
向现有副本集添加成员
重要
要避免因 IP 地址变更而更新配置,请使用 DNS 主机名而非 IP 地址。在配置副本集成员或分片集群成员时,使用 DNS 主机名而非 IP 地址尤为重要。
在水平分割网络配置下,请使用主机名而非 IP 地址来配置集群。从 MongoDB 5.0 开始,仅配置了 IP 地址的节点将无法通过启动验证,因而不会启动。
- 启动新的 - mongod实例。指定数据目录和副本集名称。以下示例指定- /srv/mongodb/db0数据目录和- rs0副本集:- mongod --dbpath /srv/mongodb/db0 --replSet rs0 --bind_ip localhost,<hostname(s)|ip address(es)> - 警告- 将实例绑定到可公开访问的 IP 地址之前,必须保护集群免遭未经授权的访问。有关安全建议的完整列表,请参阅自管理部署的安全清单。至少应考虑启用身份验证和强化网络基础设施。 - 有关配置选项的更多信息,请参阅 - mongod手册页面。
- 连接到副本集的主节点。 - 您只能在连接到主节点时添加成员。如果不知道哪个成员是主节点成员,请登录副本集的任何成员并发出 - db.hello()命令。
- 使用 - rs.add()将新成员添加到副本集。将- member configuration document传递给此方法。例如,要在主机- mongodb3.example.net上添加成员,请发出以下命令:- rs.add( { host: "mongodb3.example.net:27017" } ) - 警告- 在 MongoDB 5.0 之前,新增的节点仍然算作投票成员,尽管在数据保持一致之前,它们既不能服务于读取,也不能成为主节点。如果您运行的是 5.0 之前的 MongoDB 版本,并添加了 - votes和- priority设置大于零的从节点,则可能会导致有大多数投票成员在线却无法选举主节点的情况。为避免出现这种情况,可考虑先添加- priority :0和- votes :0的新从节点。然后运行- rs.status(),确保成员已过渡到- SECONDARY状态。最后,使用- rs.reconfig()更新其优先级和投票。