向自管理副本集添加成员
概述
本教程解释了如何向现有的副本集添加额外成员。有关复制部署模式的背景信息,请参阅副本集部署架构文档。
最大投票成员数
副本集可以最多包含七个投票成员。若要向已有七个投票成员的副本集添加成员,您必须将该成员添加为非投票成员,或从现有成员
中移除投票。
初始化脚本
在生产部署中,您可以为管理成员进程配置一个初始化脚本。
现有成员
您可以使用这些程序将新成员添加到现有副本集中。
警告
每个副本集节点必须属于一个副本集,并且只能属于一个副本集。副本集节点不能属于多个副本集。
恢复前成员
您可以使用这些程序重新添加已移除的节点。
如果已移除节点上的数据相对较新,节点将恢复并追赶上其他副本集。
重要
在已移除节点处于独立模式时,请避免在该节点上创建新的复制集合。如果独立节点重新加入副本集,则对新集合的后续操作将产生错误。
数据文件
如果您有现有成员的备份或快照,可以将数据文件(例如,dbPath
目录)移动到新系统,并快速启动新成员。文件必须是
同一副本集成员的数据文件的有效副本。有关更多信息,请参阅使用文件系统快照备份和恢复自管理部署文档。
重要
始终使用文件系统快照创建现有副本集成员的副本。不要使用
mongodump
和mongorestore
来初始化新的副本集成员。
IP 绑定
MongoDB的二进制文件,包括mongod
和mongos
,默认绑定到本地主机。如果设置了配置文件中的net.ipv6
设置或二进制的--ipv6
命令行选项,则二进制文件将额外绑定到本地主机的IPv6地址。
默认情况下,仅绑定到本地主机的mongod
和mongos
只接受运行在同一台计算机上的客户端的连接。这种绑定行为包括mongosh
和您的副本集或分片集群的其他成员。远程客户端无法连接到仅绑定到本地主机的二进制文件。
要覆盖默认绑定并绑定到其他IP地址,请使用配置文件中的net.bindIp
设置或使用--bind_ip
命令行选项指定主机名或IP地址列表。
警告
从MongoDB 5.0开始,仅配置了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才能在复制过程中作为数据复制的一部分复制所有数据。这个过程需要时间,但不需要管理员干预。
从现有成员手动复制数据目录。新成员将成为辅助成员,并会追赶副本集的当前状态。复制数据可能会缩短新成员成为当前状态所需的时间。
请确保您可以将数据目录复制到新成员,并在操作日志允许的窗口内开始复制。否则,新实例将不得不进行初始同步,如在自管理副本集成员中重新同步中所述。
使用
rs.printReplicationInfo()
来检查副本集成员关于操作日志的当前状态。
有关复制部署模式的背景信息,请参阅副本集部署架构文档。
将成员添加到现有副本集
重要
为了避免由于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)> 有关配置选项的更多信息,请参阅
mongod
手册页面。连接到副本集的主节点。
您只能在连接到主节点时添加成员。如果您不知道哪个成员是主节点,请登录到任何副本集成员,并执行
db.hello()
命令。使用
rs.add()
将新成员添加到副本集。将成员配置文档
传递给该方法。例如,要添加位于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()
更新其优先级和投票。