0%

事务日志

Elasticsearch 事务日志(Translog):数据安全与持久化的核心保障

Elasticsearch 基于 Lucene 构建,而 Lucene 采用 “延迟写” 策略(数据先存内存,再批量刷盘)提升性能,但存在内存数据丢失风险。事务日志(Translog) 作为 Elasticsearch 的核心组件,通过记录所有未持久化的操作,确保在节点故障时数据可恢复,是数据安全的关键保障。

事务日志的核心作用

  1. 数据恢复:记录所有未写入磁盘的索引操作(新增、更新、删除),节点重启后可通过 Translog 恢复内存中丢失的数据。
  2. 持久化辅助:配合 Lucene 的段(Segment)机制,平衡写入性能与数据安全性。
  3. 原子性保障:确保每个操作要么完全成功(写入 Translog 并同步到段),要么失败时可回滚。

数据写入与 Translog 交互流程

数据从写入到持久化的完整流程如下,Translog 贯穿始终:

初始写入:内存缓冲 + Translog 记录

  • 文档写入时,先进入 Memory Buffer(内存缓冲区,JVM 堆内存)
  • 同时,操作被追加到 Translog(磁盘文件),确保即使节点崩溃,操作也不会丢失。
  • 此时状态:数据不可搜索(未进入倒排索引),但已通过 Translog 持久化,安全性得到保障。

准实时可见:Refresh 操作

默认每隔 index.refresh_interval(1 秒)触发 Refresh

  • 将 Memory Buffer 中的数据写入 File System Cache(文件系统缓存,操作系统内存),生成新的 Segment(段)
  • 清空 Memory Buffer,数据可被搜索(Segment 虽在内存,但已构成完整倒排索引)。
  • Translog 状态:不清除,仍保留所有操作记录(直至 Flush)。

持久化到磁盘:Flush 操作

当满足以下条件时,触发 Flush 操作,将数据真正写入磁盘:

  • 定时触发:默认 30 分钟(index.translog.flush_threshold_period)。
  • 阈值触发:Translog 大小达 512MB(index.translog.flush_threshold_size)或操作数达阈值(index.translog.flush_threshold_ops)。
  • 手动触发:POST /index/_flush(强制刷新单个索引)或 POST /_flush(刷新所有索引)。

Flush 操作内容

  1. 将 File System Cache 中的所有 Segment 强制刷写到磁盘(通过 fsync 系统调用)。
  2. 清空并滚动 Translog(创建新的 Translog 文件,旧文件可删除)。

故障恢复流程

若节点意外宕机,重启后 Elasticsearch 会:

  1. 读取磁盘上的 Segment 文件,恢复已持久化的数据。
  2. 读取未清空的 Translog,重新执行所有未刷盘的操作,恢复内存中丢失的数据。

Translog 核心配置参数

通过 elasticsearch.yml 或索引设置可调整 Translog 行为,平衡性能与安全性:

参数 作用 默认值
index.translog.flush_threshold_size 触发 Flush 的 Translog 最大容量(超过则强制刷盘) 512MB
index.translog.flush_threshold_period 强制 Flush 的时间间隔(防止长期不刷盘) 30m
index.translog.sync_interval Translog 从内存刷到磁盘的间隔(确保未 Flush 时数据也能持久化) 5s
index.translog.durability 事务提交策略: - request:每次请求后立即刷 Translog 到磁盘(安全优先) - async:按 sync_interval 异步刷盘(性能优先) request
index.translog.disable_flush 是否禁用自动 Flush(仅建议临时调试用,生产环境禁用) false

配置示例(索引级别)

1
2
3
4
5
6
7
8
PUT my_index/_settings
{
"index.translog": {
"flush_threshold_size": "1gb", // 扩大 Translog 容量阈值
"sync_interval": "10s", // 延长异步刷盘间隔
"durability": "async" // 优先性能,牺牲部分安全性
}
}

最佳实践与注意事项

  1. 安全性 vs 性能

    • 对金融、日志等核心数据,使用默认 durability: request,确保操作即时持久化。
    • 对非核心数据(如日志采集),可设 durability: async 提升写入吞吐量(可能丢失 5s 内的数据)。
  2. Translog 大小控制

    • 过大的 Translog 会导致 Flush 时间变长,建议通过 flush_threshold_size 限制(如 512MB~1GB)。
    • 避免频繁手动 Flush(会打断 Lucene 的段合并优化,增加 IO 压力)。
  3. 监控 Translog 状态
    通过 _stats API 查看 Translog 状态,及时发现异常:

    1
    GET my_index/_stats/translog?pretty

    关注 translog.size_in_bytes(当前大小)和 uncommitted_operations(未刷盘操作数)。

  4. 节点故障处理
    若节点宕机,重启后 Elasticsearch 会自动通过 Translog 恢复数据,无需人工干预。若 Translog 损坏,可能需要从副本或快照恢复

欢迎关注我的其它发布渠道