--- title: "刷新索引到磁盘" date: 2026-02-12 lastmod: 2026-02-12 description: "将索引的内存数据刷新到磁盘存储,确保数据持久化" tags: ["索引管理", "数据持久化", "索引维护"] summary: "将索引的内存数据刷新到磁盘存储,清空事务日志,确保数据持久化。 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 响应示例:" --- 将索引的内存数据刷新到磁盘存储,清空事务日志,确保数据持久化。 ## 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` ## 示例 ### 刷新所有索引 ```bash POST /_flush ``` **响应示例:** ```json { "_shards": { "total": 10, "successful": 10, "failed": 0 } } ``` ### 刷新单个索引 ```bash POST /my_index/_flush ``` ### 刷新多个索引 ```bash POST /index1,index2/_flush ``` ### 使用通配符刷新索引 ```bash POST /logs-*/_flush ``` ### 强制刷新 ```bash POST /my_index/_flush?force=true ``` ### 异步刷新(不等待) ```bash POST /my_index/_flush?wait_if_ongoing=false ``` ### 只刷新打开的索引(默认) ```bash POST /*/_flush?expand_wildcards=open ``` ### 刷新所有索引(包括关闭的) ```bash POST /*/_flush?expand_wildcards=all ``` ## 响应字段说明 | 字段 | 类型 | 描述 | |------|------|------| | `_shards.total` | 整数 | 总分片数 | | `_shards.successful` | 整数 | 成功的分片数 | | `_shards.failed` | 整数 | 失败的分片数 | ## 使用场景 ### 场景 1:确保数据持久化 在重要数据写入后,确保数据已持久化到磁盘: ```bash # 写入重要数据 POST /important_data/_doc/1 { "critical": "information" } # 立即 flush 到磁盘 POST /important_data/_flush ``` ### 场景 2:释放内存 当内存压力大时,手动触发 flush 释放内存: ```bash POST /_flush ``` ### 场景 3:备份前准备 在创建快照前确保数据完整性: ```bash # 先 flush 所有索引 POST /_flush # 然后创建快照 PUT /_snapshot/my_backup/snapshot_1 ``` ### 场景 4:关闭索引前 在关闭索引前保存所有数据: ```bash # 先 flush POST /my_index/_flush # 再关闭索引 POST /my_index/_close ``` ## 自动 Flush Easysearch 会根据以下条件自动触发 Flush: 1. **Translog 大小**:当事务日志达到一定大小时 2. **时间间隔**:定期自动 flush 3. **内存压力**:当内存压力大时 相关设置: ```json { "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 ```