将索引的内存数据刷新到磁盘存储,清空事务日志,确保数据持久化。
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 | 通配符展开选项。可选值:open、closed、hidden、none、all |
参数说明 #
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:
- Translog 大小:当事务日志达到一定大小时
- 时间间隔:定期自动 flush
- 内存压力:当内存压力大时
相关设置:
{
"index.translog.flush_threshold_size": "512mb",
"index.translog.sync_interval": "5s",
"index.translog.durability": "REQUEST"
}
性能考虑 #
Flush 的资源消耗 #
| 资源 | 消耗 | 说明 |
|---|---|---|
| 磁盘 I/O | 高 | 需要写入大量数据到磁盘 |
| CPU | 中 | 需要压缩和合并数据 |
| 内存释放 | 是 | flush 后会释放内存 |
最佳实践 #
- 避免频繁手动 flush:系统会自动管理,频繁手动 flush 可能影响性能
- 重要数据操作:在关键操作后手动 flush 确保持久化
- 备份前:创建快照前执行 flush
- 低峰期:大规模 flush 操作在低峰期执行
注意事项 #
- 性能影响:Flush 是昂贵的操作,频繁执行会影响性能
- 自动管理:大多数情况下不需要手动 flush,系统会自动处理
- 持久化保证:Flush 后数据已持久化,但仍需备份以防硬件故障
- 与 Refresh 的区别:
- Refresh 使文档可搜索(近实时)
- Flush 确保数据持久化到磁盘
- Translog:Flush 会清空 translog,释放空间
操作序列 #
典型的数据写入序列:
1. 文档写入内存 buffer
↓
2. Refresh(每秒自动)→ 创建新段,文档可搜索
↓
3. Flush(自动/手动)→ 段写入磁盘,清空 translog





