目标
某大索引碎片化导致查询延迟缓慢上升,但整体重建会阻塞主节点写入。本配方利用副本集逐成员滚动重建:先让成员成为备节点,再逐个重建索引,从主节点视角保持写入可用,最后在维护窗口处理主节点,从而在不中断写入的情况下恢复查询性能。
步骤要点
- 逐成员让节点成为备节点,避免影响主节点写入。
- 在备节点上按相同 key 模式重建索引。
- 为主节点预留维护窗口再重建。
- 确认各成员索引重建完成且 p99 恢复基线。
rs.stepDown();
rs.status().members.map(m => ({ name: m.name, stateStr: m.stateStr }));
排错提示
- 主节点重建会阻塞写入,必须最后处理。
- 重建需要额外磁盘空间。
- 滚动重建比离线更慢。
适用边界
- 需要有余量的副本集。
- 不解决导致碎片的索引设计问题。