bigywater.tech
Elasticsearch · 102

index.translog.durability

真实对比translog.durability设成request(默认,每次写入都等fsync落盘)与async(每5秒批量fsync)两种模式,验证约19.5倍的真实吞吐差距,并厘清这份速度提升背后对应的真实数据安全边界权衡。

durability=request(默认)
真实2000条耗时10.305秒,每次都等fsync落盘
durability=async
真实同样2000条只要0.529秒,快约19.5倍
真实的权衡
request保证写入即落盘,async在窗口内有数据丢失风险

做的事:真实对比translog.durability设成request(默认)和async两种模式下写入2000条文档的真实耗时

代码PUT /td_request {"settings":{"translog.durability":"request"}} # 真实默认模式 PUT /td_async {"settings":{"translog.durability":"async","translog.sync_interval":"5s"}} 真实各自循环写入2000条独立文档: POST /td_request/_doc {"n":i} POST /td_async/_doc {"n":i}

验证:request模式真实耗时10.305秒,async模式真实只要0.529秒,快了约19.5倍

实测 · 本机 Elasticsearch 8.15.0 执行输出
durability=request(每次写入都等translog fsync落盘): elapsed_sec=10.305
durability=async(每5秒批量fsync一次,不等单次请求):  elapsed_sec=0.529
  ← 真实快了约19.5倍

这组真实耗时差距直接量化了fsync这个系统调用本身的代价:request模式真实要求每一次写入请求,在真正返回"写入成功"给客户端之前,都必须先确认这条操作已经被真实fsync进了磁盘上的translog文件——fsync真实是一个相对昂贵的系统调用,它要求操作系统真实把数据从内核缓冲区强制刷到物理存储介质,不只是写进缓存就算完事。本次实测2000次独立写入、每次都真实等这个fsync完成,累计耗时真实高达10秒;而async模式真实完全不等这个确认,写入请求真实在数据进了内存缓冲区之后就立刻返回,真正的fsync真实被攒到每5秒才批量做一次,这也是为什么它的吞吐真实能快出接近20倍。

真实理解这19.5倍速度差距背后,两种模式真实承诺的数据安全程度有什么不同

代码真实设想一个进程在写入过程中突然崩溃(比如本系列第96篇真实做过的kill -9实验)的场景

验证:request模式真实保证"写入成功响应=数据已经安全落盘",async模式真实在崩溃窗口内可能丢失最近几秒的数据

实测 · 本机真实的机制对比
request模式: 收到"写入成功"响应的那一刻,真实意味着这条数据已经被fsync进了磁盘
  → 本系列第96篇验证过的kill -9崩溃恢复实验,真实就是在这种保证下做到了数据一条不丢

async模式: 写入请求收到"成功"响应,真实不代表数据已经落盘,可能还停留在操作系统的页缓存里
  → 如果真实在等待下一次5秒周期fsync之前发生进程崩溃或者机器掉电
  → 真实这个5秒窗口内已经返回"写入成功"的那些数据可能会丢失
这组真实对比揭示了index.translog.durability这个设置真实在"写入延迟/吞吐"和"崩溃场景下的数据安全边界"之间做的直接权衡:本系列第96篇真实用kill -9验证过translog能保证写入恢复,但那次实验用的正是默认的request模式——这个强保证真实是靠每次写入都付出一次fsync的代价换来的。如果业务场景真实切换成async模式去换取接近20倍的写入吞吐,就必须真实接受"客户端收到写入成功响应,不代表这条数据在物理层面已经绝对安全"这个真实的风险敞口——如果机器真的在这个异步窗口内掉电或者崩溃,这几秒内已经确认成功的写入真实有可能从译文日志里消失。这也是为什么官方文档把async模式定位为"能接受小概率、小窗口数据丢失风险换取显著吞吐提升"的场景专用选项,不是默认值真实存在的理由——大多数业务场景下,默认的request模式提供的强一致性保证,真实比用19.5倍吞吐去换一个真实存在的数据丢失风险更值得保留。

分步演示:translog持久化策略从request模式的强保证到async模式的真实吞吐差距完整验证

每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。

request模式用fsync换强一致性保证,async模式用弱化保证换约19.5倍吞吐
这一步新验证的durability模式

    本文用到的工具

    • 本机真实部署的 Elasticsearch 8.15.0(单节点,tar包直接启动)
    • 真实的 index.translog.durability 与 sync_interval 设置
    京ICP备2026067502号-1京公网安备11010502063487号