基于本文回答

播面 播面

文图音视,全方位拆解八股文
0
评论

Elasticsearch 的Translog(事务日志)是什么?它的作用是什么?

知识点图片

Translog(全称 Transaction Log,事务日志)是 Elasticsearch 中用于保证数据持久性(Durability)数据恢复的一个关键组件。

简单来说,它就是 Elasticsearch 的 “预写日志”(Write-Ahead Log, WAL)

为了让你透彻理解,我们需要先了解 Elasticsearch 写入数据的痛点,再看 Translog 是如何解决这个问题的。


1. 为什么需要 Translog?(背景与痛点)

Elasticsearch 底层依赖 Lucene 来进行索引和搜索。在 Lucene 中,将数据写入磁盘(生成 Segment 并执行 fsync)是一个非常消耗资源且缓慢的操作(IO 操作)。

  • 矛盾点:如果每新增一条文档都立即刷新到磁盘,性能会极差;但如果只是写在内存里,一旦服务器宕机或断电,内存中的数据就会丢失。
  • Elasticsearch 的机制
    1. 数据先写入内存缓冲区(Memory Buffer)。
    2. 每隔一段时间(默认 1 秒),执行 refresh 操作,将缓冲区的数据写入操作系统的文件缓存(OS Cache),生成新的 Segment。此时数据可以被搜索到,但还没有真正保存到物理磁盘上。
    3. 风险:如果在数据进入 OS Cache 但还没 flush 到物理磁盘的这段时间(可能几分钟甚至更久)内服务器宕机,这部分数据就永久丢失了。

Translog 就是为了解决这个“数据丢失风险”而存在的。


2. Translog 的工作流程

Translog 的工作机制可以概括为:“先记账,后存钱”

  1. 双写(Double Write)
    当一个文档被索引时,Elasticsearch 会同时做两件事:

    • 将数据写入 内存缓冲区(Memory Buffer)(为了生成 Lucene Segment)。
    • 将操作追加写入 Translog 文件(为了防止数据丢失)。
  2. Refresh(可搜索,但不安全)
    默认每 1 秒,内存缓冲区的数据被 refresh 到 OS Cache 中,变成 Lucene Segment。此时清空内存缓冲区,但 Translog 不会清空

    • 状态:数据可被搜索,但未落盘,Translog 负责保护数据。
  3. Flush(落盘,清空日志)
    当 Translog 变得太大(默认 512MB)或者时间过长(默认 30 分钟)时,会触发 Flush 操作:

    • 执行 Lucene commit,强制将 OS Cache 中的 Segment fsync 到物理磁盘。
    • 清空/删除旧的 Translog,开始新的 Translog 记录。
    • 状态:数据已安全存储在磁盘,不再需要旧的 Translog。
  4. Crash Recovery(故障恢复)
    如果 Elasticsearch 突然宕机,重启时,它会读取磁盘上的 Lucene 索引,然后重放(Replay) Translog 中尚未 Flush 的操作,将丢失的数据恢复回来。


3. Translog 的主要作用

总结起来,Translog 主要有两大作用:

1. 保证数据不丢失(Durability)

这是最核心的作用。即使 Lucene 还没有把数据刷入磁盘(Flush),只要 Translog 成功写入了磁盘,数据就是安全的。

  • 注:默认配置下,ES 会在每个请求返回成功前,强制将 Translog fsync 到磁盘(同步模式),确保绝对安全。

2. 提供实时 CRUD 能力(GET by ID)

虽然 Lucene 的搜索是“近实时”(NRT)的(因为有 1 秒的 refresh 延迟),但当你通过 ID 直接获取文档(GET /_doc/id)时,ES 会优先检查 Translog。
这意味着,即使文档还没 refresh 进 Lucene Segment(还搜不到),你依然可以通过 ID 查到最新版本的文档。


4. 关键配置(面试/调优重点)

Translog 的刷盘策略(Durability)直接影响写入性能数据安全性的平衡。

配置项:index.translog.durability

  1. request (默认值)

    • 机制:每次写入请求(Index, Delete, Update, Bulk)完成后,必须强制 fsync Translog 到磁盘,才会向客户端返回“成功”。
    • 优点:数据最安全,几乎不会丢数据。
    • 缺点:写入性能受限于磁盘 IOPS,性能较低。
  2. async (异步)

    • 机制:写入请求写入 OS Cache 的 Translog 后立即返回成功,后台每隔一段时间(由 index.translog.sync_interval 控制,默认 5 秒)才执行一次 fsync
    • 优点:写入性能极高。
    • 缺点:如果宕机,可能会丢失最近几秒(默认 5 秒)的数据。
    • 适用场景:对数据丢失有一定容忍度,但追求极致写入速度的日志采集系统。

总结

  • Translog 是什么? 一个顺序写入的事务日志文件。
  • 作用是什么? 填补了“内存数据”到“物理磁盘数据”之间的时间空隙,防止宕机导致的数据丢失,并辅助节点重启后的数据恢复。
00:00
00:00