将成员添加到自管理副本集
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 开始, 水平分割 DNS 仅配置了 IP 地址的节点无法启动验证并报告错误。请参阅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()
更新其优先级和投票。