rs.status 是什么
rs.status() 是复制集体检的第一条命令:列出每个成员的角色、健康状态、同步时间与心跳信息。重点看 members[].stateStr(PRIMARY / SECONDARY / ARBITER)、health(1 正常 0 异常)、optimeDate(最后一条已应用的操作时间)与 lastHeartbeat(与主节点的心跳)。复制集异常、主从延迟、成员掉线都先从这里看。
基本信息
| 命令 | rs.status() 与 db.hello() |
|---|---|
| 角色字段 | members[].stateStr:PRIMARY / SECONDARY / ARBITER |
| 健康字段 | members[].health,1 正常、0 不可达 |
| 同步进度 | optimeDate 与 lastHeartbeat |
| 集合名 | rs.status().set 给出复制集名称 |
| 权限 | 需要 clusterMonitor 或更高角色 |
典型使用场景
- 确认当前主节点是谁,切换后第一时间核对
- 排查从节点同步延迟:比较各成员的 optimeDate
- 成员加入或恢复时观察 stateStr 从 STARTUP2 走到 SECONDARY
- 维护前确认副本集成员数量满足多数派要求
- 故障复盘:导出各成员状态与时间点作为证据
- 校验 stepDown 后新的主节点是否已就绪
常用取数
常用取数
rs.status().set # 复制集名称
rs.status().members.map(m => ({ name: m.name, state: m.stateStr, health: m.health, optime: m.optimeDate }))
db.hello() # 简洁版:isWritablePrimary 等
rs.printReplicationInfo() # 主节点 oplog 窗口
rs.printSecondaryReplicationInfo() # 各从节点延迟统计常见状态值
| stateStr | 含义 | 处置建议 |
|---|---|---|
| PRIMARY | 当前主节点 | 只应有一个,出现两个属异常 |
| SECONDARY | 正常从节点 | 观察同步延迟是否稳定 |
| ARBITER | 仲裁节点 | 不存数据,只参与选举 |
| STARTUP2 | 正在初始化同步 | 刚加入或追赶数据,先观察 |
| RECOVERING | 恢复中 | 可能正在重建 oplog,勿立即介入 |
optimeDate 反映该成员最后应用的操作时间:从节点与主节点的差值就是复制延迟,用 rs.printSecondaryReplicationInfo() 看更直观。
发现成员不健康时先查网络连通与内部认证(keyfile/证书),不要直接重启整组实例,重启会触发选举并可能造成短暂不可写。
stateStr 出现 STARTUP2 或 RECOVERING 通常是正在追赶数据,属于过程状态;只有当它长时间不变化或反复回退才需要处理。
复制集巡检要点
- 各成员 optimeDate 差值稳定在秒级说明同步健康
- oplog 窗口要覆盖维护窗口,否则从节点可能追不上主节点
- 成员数量保持奇数,选举才能稳定产生多数派
- 复制集名称与配置在各成员上必须一致,否则成员无法加入
- priority 决定选举优先级,避免把低频节点设成主节点首选
- 网络分区时优先恢复连通,再判断是否需要人工干预