向分片添加节点
您可以向分片集群分片的现有分片添加成员。 您可能想要向分片添加成员,其原因与向任何副本集添加成员的分片相同。 示例,增加节点数量可在事件故障转移时提供更多候选节点来替换主节点 (primary node in the replica set)节点。 其他成员还可以提高数据冗余和副本集可用性。
有关详细信息,请参阅副本集部署架构。
关于此任务
在 MongoDB 5.0 之前,新添加的从节点仍算作有投票权成员,尽管在数据一致之前它既不能提供读取服务也不能成为主节点。 如果您运行的是早于 5.0 的 MongoDB 版本,并添加了 votes
和priority
设置大于零的从节点,则可能会导致大多数有投票权成员在线但没有主节点可以当选。 为避免出现此类情况,请考虑最初使用priority :0
和votes :0
添加新的从节点。 然后,运行rs.status()
以确保成员已转换为SECONDARY
状态。 最后,使用rs.reconfig()
更新其优先级和投票。
开始之前
要将成员添加到分分片副本集,您需要:
活动的分片集群副本集。
新节点的新主机服务器。新主机服务器必须能够支持分片数据集,并可由活动副本集通过网络进行访问。
步骤
准备数据目录
使用以下策略之一准备新成员的数据目录:
让新节点自动同步现有节点的数据。此过程需要一些时间,但无需管理员干预。
确保新成员的数据目录不包含数据。新成员将复制现有成员的数据。
从现有成员手动复制数据目录。 新成员成为从从节点(secondary node from replica set)成员,并将赶上副本集的当前状态。 复制数据可能会缩短新成员与其他副本集成员同步所需的时间。
确保您可以将数据目录复制到新成员,并在 oplog 允许的窗口内开始复制。否则,新实例必须执行初始同步,这会完全重新同步数据,如重新同步自管理副本集成员中所述。
要检查副本集成员与oplog相关的当前状态,请使用
rs.printReplicationInfo()
。
有关复制部署模式的背景,请参阅副本集部署架构文档。
启动新的mongod
实例
指定数据目录和副本集名称。 以下示例指定了/srv/mongodb/db0
数据目录和rs0
副本集:
mongod --dbpath /srv/mongodb/db0 --replSet rs0 --bind_ip localhost,<ip address of the mongod host>
警告
将实例绑定到可公开访问的 IP 地址之前,必须保护集群免遭未经授权的访问。有关安全建议的完整列表,请参阅自管理部署的安全清单。至少应考虑启用身份验证和强化网络基础设施。
有关配置选项的更多信息,请参阅 mongod
手册页面。
连接到副本集的主节点。
您只能在连接到主节点时添加成员。要连接到主节点,请使用 mongosh
。将 host
和 port
值替换为部署的相关值:
mongosh --host mongodb0.example.com --port 28015
如果不知道哪个成员是主节点成员,请连接到副本集的任何成员并发出 db.hello()
命令。
使用rs.add()
将新成员添加到副本集
将member configuration document
传递给该方法。 示例,要在托管mongodb3.example.net
上添加成员,请发出以下命令:
rs.add( { host: "mongodb3.example.net:27017", priority: 0, votes: 0 } )
确保新成员已达到SECONDARY
状态
要检查副本集的状态,请运行rs.status()
:
rs.status()
后续步骤
新加入的节点转变为 SECONDARY
状态后,根据需要使用 rs.reconfig()
更新新加入节点的 priority
和 votes
。
警告
rs.reconfig()
shell 方法可以强制当前的主节点下台,从而导致选举。当主服务器向下运行时,mongod
会关闭所有客户端连接。 虽然这通常需要 10-20 秒,但请尝试在计划维护期间进行这些更改。避免重新配置包含不同 MongoDB 版本节点的副本集,因为验证规则可能因 MongoDB 版本而异。
例子
如果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)