📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

配置项作用 #

index.refresh_interval 配置项控制索引的刷新间隔,即新索引的文档何时可以被搜索到。刷新操作将内存中的文档写入 Lucene 段并打开新的搜索器,使新文档对搜索可见。

配置项类型 #

该配置项为动态配置,可以在运行时通过索引设置 API 进行修改。

默认值 #

1s(1秒)

是否必需 #

可选配置项(有默认值)

取值范围 #

-1(禁用自动刷新)~ 正无穷

配置格式 #

# 默认配置
index.refresh_interval: 1s

# 实时性要求高
index.refresh_interval: 100ms

# 批量导入优化
index.refresh_interval: 30s

# 禁用自动刷新
index.refresh_interval: -1

工作原理 #

近实时搜索(Near Real-Time Search)通过刷新机制实现:

┌─────────────────────────────────────────────────────────────────┐
│                   文档索引到可搜索流程                           │
└─────────────────────────────────────────────────────────────────┘

文档写入
    │
    ▼
┌────────────────────────────────────────────────────────────────┐
│ 内存缓冲区 (Index Buffer)                                       │
│ - 文档在此不可搜索                                              │
│ - 持续累积文档                                                  │
└────────────────────────────────────────────────────────────────┘
    │
    │ refresh_interval 后触发
    ▼
┌────────────────────────────────────────────────────────────────┐
│ Refresh 操作                                                    │
│ 1. 内存缓冲 → 新 Lucene Segment                                 │
│ 2. 打开新 Searcher                                             │
│ 3. 文档变为可搜索                                              │
└────────────────────────────────────────────────────────────────┘
    │
    ▼
文档可被搜索

刷新机制详解 #

Refresh 流程:

┌─────────────────────────────────────────────────────────────────┐
│                      Refresh 触发条件                            │
└─────────────────────────────────────────────────────────────────┘
                         │
         ┌───────────────┼───────────────┐
         │               │               │
    定时触发        手动触发        文档数阈值
    (默认1s)       (_refresh API)    (可配置)
         │               │               │
         └───────────────┴───────────────┘
                         │
                         ▼
                 执行 Refresh 操作
                         │
         ┌───────────────┼───────────────┐
         │               │               │
    创建新段        打开新 Searcher    旧 Searcher 关闭
         │               │               │
         └───────────────┴───────────────┘
                         │
                         ▼
                   新文档可搜索

使用场景 #

1. 默认配置(大多数场景) #

index.refresh_interval: 1s
  • 平衡实时性和性能
  • 适用于大多数业务场景
  • 1秒延迟通常可接受

2. 高实时性要求 #

index.refresh_interval: 100ms

适用场景:

  • 实时日志分析
  • 实时监控告警
  • 即时通讯系统
  • 金融交易数据

代价:

  • 增加 CPU 使用率
  • 产生更多小段
  • 降低索引吞吐量

3. 批量导入优化 #

index.refresh_interval: 30s

适用场景:

  • 大数据批量导入
  • 历史数据迁移
  • 离线数据重建索引

效果:

  • 显著提高索引吞吐量
  • 减少段文件数量
  • 降低 CPU 使用率

4. 极限性能场景 #

# 导入期间禁用刷新
index.refresh_interval: -1

# 完成后恢复
index.refresh_interval: 1s

警告: 禁用刷新后,新文档不会自动变为可搜索,必须手动调用刷新 API。

使用示例 #

创建索引时设置:

PUT /my_index
{
  "settings": {
    "index.refresh_interval": "5s"
  }
}

动态修改:

# 修改为更长间隔以提高索引性能
PUT /my_index/_settings
{
  "index.refresh_interval": "30s"
}

# 修改为更短间隔以提高实时性
PUT /my_index/_settings
{
  "index.refresh_interval": "500ms"
}

# 禁用自动刷新
PUT /my_index/_settings
{
  "index.refresh_interval": "-1"
}

手动触发刷新:

# 刷新特定索引
POST /my_index/_refresh

# 刷新多个索引
POST /index1,index2/_refresh

# 刷新所有索引
POST /_refresh

# 等待刷新完成
POST /my_index/_refresh?wait_for_refresh=true

推荐设置建议 #

场景推荐配置说明
默认/通用1s平衡性能和实时性
高实时性100ms-500ms实时搜索场景
日志/指标5s-10s可容忍一定延迟
批量导入30s-60s提高吞吐量
大规模导入-1导入完成后手动刷新

性能影响分析 #

refresh_interval索引吞吐量搜索实时性段数量CPU 使用
100ms
1s
5s
30s很高很低很少很低
-1最高最少最低

与 translog 的关系 #

文档写入流程:
    │
    ▼
写入 Translog
    │ (持久化保证)
    ▼
写入内存缓冲区
    │
    ▼
等待 refresh_interval
    │
    ▼
Refresh 操作
    │
    ▼
文档可搜索

Translog 持久化配置:
- index.translog.durability: async (异步,默认)
- index.translog.durability: request (同步,更安全)

批量导入最佳实践 #

# 1. 导入前优化配置
PUT /my_index/_settings
{
  "index.refresh_interval": "-1",
  "index.number_of_replicas": 0,
  "index.translog.durability": "async"
}

# 2. 执行批量导入
# (使用 bulk API 批量写入数据)

# 3. 导入后恢复配置
PUT /my_index/_settings
{
  "index.refresh_interval": "1s",
  "index.number_of_replicas": 1,
  "index.translog.durability": "request"
}

# 4. 手动触发刷新
POST /my_index/_refresh

# 5. 强制合并段(可选)
POST /my_index/_forcemerge?max_num_segments=1

监控建议 #

# 查看刷新配置
GET /my_index/_settings?filter_path=*.index.refresh_interval

# 查看索引统计
GET /my_index/_stats?pretty

# 查看刷新耗时
GET /_nodes/stats/indices?filter_path=**.refresh

关键指标:

指标说明
refresh.total总刷新次数
refresh.time总刷新耗时
refresh.listeners当前刷新监听器数
total.refresh_time平均刷新时间

常见问题 #

问题 1:新文档搜索不到

可能原因:

  • refresh_interval 未到
  • 设置了 -1 禁用自动刷新

解决方案:

# 手动刷新
POST /my_index/_refresh

# 或降低刷新间隔
PUT /my_index/_settings
{
  "index.refresh_interval": "500ms"
}

问题 2:索引性能差

可能原因:

  • refresh_interval 设置过短
  • 频繁刷新消耗资源

解决方案:

# 增加刷新间隔
PUT /my_index/_settings
{
  "index.refresh_interval": "10s"
}

问题 3:段文件过多

原因: 频繁刷新产生大量小段

解决方案:

# 1. 增加 refresh_interval
PUT /my_index/_settings
{
  "index.refresh_interval": "30s"
}

# 2. 配置强制合并
POST /my_index/_forcemerge?max_num_segments=1

注意事项 #

  1. 动态更新:此配置为动态配置,可在线修改
  2. 实时性权衡:刷新越频繁,实时性越好但性能越低
  3. 段合并:频繁刷新会产生更多小段,增加合并压力
  4. 手动刷新:禁用自动刷新后需手动调用 _refresh API
  5. 副本影响**:副本也需要刷新,可能增加总体刷新时间
  6. translog 配合**:与 translog 配置配合可进一步优化性能