首页/数据/NoSQL 速查/复制集扩容与缩容
MongoDB99 条

复制集扩容与缩容

rs.add 加入新成员(默认异步追赶数据),rs.remove 从配置中移除节点;变更后核对 rs.status 与同步进度。

NoSQL 速查数据更新于 2026-10-13

是什么

rs.add() 与 rs.remove() 是 mongosh 中修改复制集成员配置的辅助方法,底层等价于 rs.reconfig():把变更写进复制集配置文档,多数投票成员确认后配置版本号递增。新加入的成员默认是普通投票成员,进程启动后会做初始同步,把主节点现有数据全量复制过来,所以扩容不是立刻可用,必须盯着同步进度直到它变成 SECONDARY。

基本信息

适用版本MongoDB 3.0+,在 mongosh / 旧 mongo shell 中执行
执行位置必须连到当前主节点(PRIMARY),从节点上执行会直接报错
两种写法rs.add(host) 或 rs.add({ host, priority, votes, hidden, tags, secondaryDelaySecs })
移除写法rs.remove(host),host 字符串必须与 rs.conf() 里的 host 完全一致
核对命令rs.status()、rs.conf().members、rs.conf().version

典型使用场景

  • 扩容读能力:加入 priority 0、votes 0 的只读成员,专门承接报表查询与备份任务,不干扰选举
  • 故障替换:先把坏节点 rs.remove,再把新机器用完全相同的 host 名称加入,客户端连接串不用改
  • 跨机房部署:给成员打 tags,配合读偏好把读请求固定在某个机房,减少跨机房时延
  • 延迟节点:设置 secondaryDelaySecs 保留一份滞后数据,用于误删、误更新后的快速捞回
  • 隐藏节点:hidden 且 priority 0 的成员不参与选举、对客户端不可见,适合离线分析

扩容与缩容

扩容与缩容
rs.status().members.map(m => m.name)                # 先确认当前成员清单
rs.add({ host: "m4:27017", priority: 0, votes: 0 }) # 只读节点,不参与投票
rs.add("m5:27017")                                  # 默认成员,参与投票
rs.conf().version                                    # 配置版本号,每次变更 +1
rs.status().members.filter(m => m.stateStr === "STARTUP2").length  # 看是否还在初始同步
rs.remove("m4:27017")                               # 移除,host 写法必须一致

成员状态读法

stateStr含义处理动作
STARTUP2初始同步进行中,尚未追平等待即可,期间别再加压
SECONDARY同步正常,可提供读无需处理
RECOVERING追赶中、回滚中或落后过多先看复制延迟与 oplog 窗口
ARBITER仲裁节点,不存业务数据不要在仲裁节点上读数据
REMOVED已被移出配置,进程仍可能活着确认是否要停掉对应进程
移除成员前必须确认剩余投票成员仍能构成多数:三节点复制集一次只能移除一个,连续删两个会让复制集失去多数而转入只读,此时只能恢复数据文件或重新初始化才能写入。
大库初始同步非常重,磁盘 IO 与网络会长时间打满。可以在加入前先摆好数据目录再启动以跳过全量同步,也可以用 rs.syncFrom() 指定同步源,避免多个新节点同时压向主节点。

易错点

  • host 字符串必须与其他成员保持同一种解析方式(统一用域名或统一用 IP),混用会让同一台机器以两个身份进入配置,导致成员数虚高、选举异常
  • 新成员 priority 默认是 1,大库刚加入尚未同步完就可能被选为主节点,客户端会连到一个数据不完整的实例;扩容期间应显式设 priority 0
  • 正确顺序是先 rs.remove 再下线机器;反过来先关机再 remove,会让复制集持续尝试连接死节点并刷告警
  • 复制集最多 7 个投票成员,成员较多时要给部分节点设 votes 0,否则配置直接报错

数据来源与参考

  • MongoDB Manual: rs.add() / rs.remove()
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌