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

将索引的内存数据刷新到磁盘存储,清空事务日志,确保数据持久化。

API #

POST /_flush
GET /_flush
POST /{index}/_flush
GET /{index}/_flush

API 的作用 #

该 API 用于执行索引的 Flush 操作,将内存中的数据持久化到磁盘。

Flush 的作用 #

  • 将内存中的段写入磁盘
  • 清空内部事务日志(translog)
  • 释放索引占用的内存
  • 确保数据持久化

Flush vs Refresh #

操作描述数据持久化使文档可搜索
Refresh创建新段,内存中
Flush段写入磁盘,清空 translog是(隐含)

使用场景 #

  • 确保数据持久化到磁盘
  • 释放内存压力
  • 备份前确保数据完整性
  • 关闭索引前保存数据

API 的参数 #

路由参数 #

参数类型是否必填描述
{index}字符串要刷新的索引名称。支持:单个索引、逗号分隔的多个索引、通配符表达式。不指定则操作所有索引

Query String 参数 #

参数类型是否必填默认值描述
force布尔值false强制执行刷新,即使没有未提交的更改
wait_if_ongoing布尔值true如果正在执行其他 flush,是否等待其完成
ignore_unavailable布尔值false是否忽略不可用的索引
allow_no_indices布尔值false当通配符没有匹配到索引时是否忽略
expand_wildcards枚举值open通配符展开选项。可选值:openclosedhiddennoneall

参数说明 #

force #

  • 即使没有未提交的更改也执行刷新
  • 会递增事务日志 ID
  • 用于确保 translog ID 递增的场景

wait_if_ongoing #

  • true:如果其他 flush 正在执行,阻塞等待
  • false:如果其他 flush 正在执行,跳过本次操作
  • force=true 时,此参数必须为 true

示例 #

刷新所有索引 #

POST /_flush

响应示例:

{
  "_shards": {
    "total": 10,
    "successful": 10,
    "failed": 0
  }
}

刷新单个索引 #

POST /my_index/_flush

刷新多个索引 #

POST /index1,index2/_flush

使用通配符刷新索引 #

POST /logs-*/_flush

强制刷新 #

POST /my_index/_flush?force=true

异步刷新(不等待) #

POST /my_index/_flush?wait_if_ongoing=false

只刷新打开的索引(默认) #

POST /*/_flush?expand_wildcards=open

刷新所有索引(包括关闭的) #

POST /*/_flush?expand_wildcards=all

响应字段说明 #

字段类型描述
_shards.total整数总分片数
_shards.successful整数成功的分片数
_shards.failed整数失败的分片数

使用场景 #

场景 1:确保数据持久化 #

在重要数据写入后,确保数据已持久化到磁盘:

# 写入重要数据
POST /important_data/_doc/1
{
  "critical": "information"
}

# 立即 flush 到磁盘
POST /important_data/_flush

场景 2:释放内存 #

当内存压力大时,手动触发 flush 释放内存:

POST /_flush

场景 3:备份前准备 #

在创建快照前确保数据完整性:

# 先 flush 所有索引
POST /_flush

# 然后创建快照
PUT /_snapshot/my_backup/snapshot_1

场景 4:关闭索引前 #

在关闭索引前保存所有数据:

# 先 flush
POST /my_index/_flush

# 再关闭索引
POST /my_index/_close

自动 Flush #

Easysearch 会根据以下条件自动触发 Flush:

  1. Translog 大小:当事务日志达到一定大小时
  2. 时间间隔:定期自动 flush
  3. 内存压力:当内存压力大时

相关设置:

{
  "index.translog.flush_threshold_size": "512mb",
  "index.translog.sync_interval": "5s",
  "index.translog.durability": "REQUEST"
}

性能考虑 #

Flush 的资源消耗 #

资源消耗说明
磁盘 I/O需要写入大量数据到磁盘
CPU需要压缩和合并数据
内存释放flush 后会释放内存

最佳实践 #

  1. 避免频繁手动 flush:系统会自动管理,频繁手动 flush 可能影响性能
  2. 重要数据操作:在关键操作后手动 flush 确保持久化
  3. 备份前:创建快照前执行 flush
  4. 低峰期:大规模 flush 操作在低峰期执行

注意事项 #

  1. 性能影响:Flush 是昂贵的操作,频繁执行会影响性能
  2. 自动管理:大多数情况下不需要手动 flush,系统会自动处理
  3. 持久化保证:Flush 后数据已持久化,但仍需备份以防硬件故障
  4. 与 Refresh 的区别
    • Refresh 使文档可搜索(近实时)
    • Flush 确保数据持久化到磁盘
  5. Translog:Flush 会清空 translog,释放空间

操作序列 #

典型的数据写入序列:

1. 文档写入内存 buffer
   ↓
2. Refresh(每秒自动)→ 创建新段,文档可搜索
   ↓
3. Flush(自动/手动)→ 段写入磁盘,清空 translog