Elasticsearch 的Translog(事务日志)是什么?它的作用是什么?
Translog(全称 Transaction Log,事务日志)是 Elasticsearch 中用于保证数据持久性(Durability)和数据恢复的一个关键组件。
简单来说,它就是 Elasticsearch 的 “预写日志”(Write-Ahead Log, WAL)。
为了让你透彻理解,我们需要先了解 Elasticsearch 写入数据的痛点,再看 Translog 是如何解决这个问题的。
1. 为什么需要 Translog?(背景与痛点)
Elasticsearch 底层依赖 Lucene 来进行索引和搜索。在 Lucene 中,将数据写入磁盘(生成 Segment 并执行 fsync)是一个非常消耗资源且缓慢的操作(IO 操作)。
- 矛盾点:如果每新增一条文档都立即刷新到磁盘,性能会极差;但如果只是写在内存里,一旦服务器宕机或断电,内存中的数据就会丢失。
- Elasticsearch 的机制:
- 数据先写入内存缓冲区(Memory Buffer)。
- 每隔一段时间(默认 1 秒),执行
refresh操作,将缓冲区的数据写入操作系统的文件缓存(OS Cache),生成新的 Segment。此时数据可以被搜索到,但还没有真正保存到物理磁盘上。 - 风险:如果在数据进入 OS Cache 但还没
flush到物理磁盘的这段时间(可能几分钟甚至更久)内服务器宕机,这部分数据就永久丢失了。
Translog 就是为了解决这个“数据丢失风险”而存在的。
2. Translog 的工作流程
Translog 的工作机制可以概括为:“先记账,后存钱”。
双写(Double Write):
当一个文档被索引时,Elasticsearch 会同时做两件事:- 将数据写入 内存缓冲区(Memory Buffer)(为了生成 Lucene Segment)。
- 将操作追加写入 Translog 文件(为了防止数据丢失)。
Refresh(可搜索,但不安全):
默认每 1 秒,内存缓冲区的数据被refresh到 OS Cache 中,变成 Lucene Segment。此时清空内存缓冲区,但 Translog 不会清空。- 状态:数据可被搜索,但未落盘,Translog 负责保护数据。
Flush(落盘,清空日志):
当 Translog 变得太大(默认 512MB)或者时间过长(默认 30 分钟)时,会触发 Flush 操作:- 执行 Lucene commit,强制将 OS Cache 中的 Segment
fsync到物理磁盘。 - 清空/删除旧的 Translog,开始新的 Translog 记录。
- 状态:数据已安全存储在磁盘,不再需要旧的 Translog。
- 执行 Lucene commit,强制将 OS Cache 中的 Segment
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
request(默认值):- 机制:每次写入请求(Index, Delete, Update, Bulk)完成后,必须强制
fsyncTranslog 到磁盘,才会向客户端返回“成功”。 - 优点:数据最安全,几乎不会丢数据。
- 缺点:写入性能受限于磁盘 IOPS,性能较低。
- 机制:每次写入请求(Index, Delete, Update, Bulk)完成后,必须强制
async(异步):- 机制:写入请求写入 OS Cache 的 Translog 后立即返回成功,后台每隔一段时间(由
index.translog.sync_interval控制,默认 5 秒)才执行一次fsync。 - 优点:写入性能极高。
- 缺点:如果宕机,可能会丢失最近几秒(默认 5 秒)的数据。
- 适用场景:对数据丢失有一定容忍度,但追求极致写入速度的日志采集系统。
- 机制:写入请求写入 OS Cache 的 Translog 后立即返回成功,后台每隔一段时间(由
总结
- Translog 是什么? 一个顺序写入的事务日志文件。
- 作用是什么? 填补了“内存数据”到“物理磁盘数据”之间的时间空隙,防止宕机导致的数据丢失,并辅助节点重启后的数据恢复。