← 中文资源

简体中文版本

在线重建 MongoDB 索引

借助副本集滚动重建索引,在不阻塞写入的情况下降低索引碎片与查询延迟。

阅读英文原文

目标

某大索引碎片化导致查询延迟缓慢上升,但整体重建会阻塞主节点写入。本配方利用副本集逐成员滚动重建:先让成员成为备节点,再逐个重建索引,从主节点视角保持写入可用,最后在维护窗口处理主节点,从而在不中断写入的情况下恢复查询性能。

步骤要点

  1. 逐成员让节点成为备节点,避免影响主节点写入。
  2. 在备节点上按相同 key 模式重建索引。
  3. 为主节点预留维护窗口再重建。
  4. 确认各成员索引重建完成且 p99 恢复基线。
rs.stepDown();
rs.status().members.map(m => ({ name: m.name, stateStr: m.stateStr }));

排错提示

  • 主节点重建会阻塞写入,必须最后处理。
  • 重建需要额外磁盘空间。
  • 滚动重建比离线更慢。

适用边界

  • 需要有余量的副本集。
  • 不解决导致碎片的索引设计问题。