向分片添加成员
您可以在分片集群中向现有分片添加成员。分片集群。您可能想向分片添加成员的原因与您想向任何 副本集 添加成员的原因相同。例如,增加成员数量可以提供更多候选者以在发生 故障转移 时替换主节点。额外的成员还可以增加数据冗余和副本集可用性。
有关更多信息,请参阅 副本集部署架构。
关于此任务
在MongoDB 5.0之前,新添加的从节点仍然被视为投票成员,即使它既不能提供读取操作也不能成为主节点,直到其数据一致为止。如果您正在运行低于5.0版本的MongoDB,并且添加了一个具有大于零的 votes
和 priority
设置的从节点,这可能导致大多数投票成员在线,但无法选出主节点。为了避免这种情况,考虑最初将新从节点添加为具有 priority :0
和 votes :0
。然后,运行 rs.status()
以确保成员已过渡到 SECONDARY
状态。最后,使用 rs.reconfig()
更新其优先级和投票。
开始之前
要将成员添加到分片副本集,您需要
一个活动的分片集群副本集。
为新成员提供一个新的主机服务器。新的主机服务器必须能够支持您的分片数据集,并通过网络被活动副本集访问。
从MongoDB 8.0版本开始,您可以使用directShardOperations
角色来执行需要直接对分片执行命令的维护操作。
警告
使用directShardOperations
角色运行命令可能会导致您的集群无法正常工作,并可能造成数据损坏。仅在使用维护目的或MongoDB支持指导下使用directShardOperations
角色。完成维护操作后,停止使用directShardOperations
角色。
步骤
准备数据目录
使用以下策略之一准备新成员的数据目录
让新成员自动从现有成员同步数据。这个过程需要时间,但不需要管理员干预。
确保新成员的数据目录不包含数据。新成员将从现有成员复制数据。
手动从现有成员复制数据目录。新成员将成为次要成员,并将赶上副本集的当前状态。复制数据可能缩短新成员与其他副本集成员同步所需的时间。
确保您可以将数据目录复制到新成员,并在操作日志允许的窗口内开始复制。否则,新实例将不得不执行初始同步,这会完全重新同步数据,如在自管理副本集成员中重新同步中所述。
要检查副本集成员关于操作日志的当前状态,请使用
rs.printReplicationInfo()
。
有关复制部署模式的背景信息,请参阅副本集部署架构文档。
连接到副本集的主节点
您只能在连接到主节点时添加成员。要连接到主节点,请使用 mongosh
。将 host
和 port
的值替换为您部署的相关值
mongosh --host mongodb0.example.com --port 28015
如果您不知道哪个成员是主节点,请连接到复制集的任何成员,并发出 db.hello()
命令。
确保新成员已达到 SECONDARY
状态
要检查复制集成员的状态,请运行 rs.status()
:
rs.status()
下一步操作
一旦新成员已过渡到 SECONDARY
状态,可以使用 rs.reconfig()
来更新新成员的 priority
和 votes
(如有需要)。
警告
rs.reconfig()
命令可以强制当前主节点下线,这会导致 选举。当主节点下线时,mongod
会关闭所有客户端连接。虽然这通常需要 10-20 秒,但请尽量在计划维护期间进行这些更改。避免重新配置包含不同 MongoDB 版本成员的副本集,因为验证规则可能在不同 MongoDB 版本之间有所不同。
示例
如果 rs.conf()
返回的配置文档作为 members
数组的第五个元素,且针对 mongodb3.example.net:27017
,要将其优先级和投票数更新为 1
,请使用以下操作序列
var cfg = rs.conf(); cfg.members[4].priority = 1 cfg.members[4].votes = 1 rs.reconfig(cfg)