Elasticsearch事务日志translog
跟大多数分布式系统一样,es也通过临时写入写操作来保证数据安全。因为lucene索引过程中,数据会首先据缓存在内存中直到达到一个量(文档数或是占用空间大小)才会写入到磁盘。这就会带来一个风险,如果在写入磁盘前系统崩溃,那么这些缓存数据就会丢失。es通过translog解决了这个问题,每次写操作都会写入一个临时文件translog中,这样如果系统需要恢复数据可以从translog中读取。
这一部分主要包括两部分translog和tanslogFile,前者对外提供了对translogFile操作的相关接口,后者则是具体的translogFile,它是具体的文件。首先看一下translogFile的继承关系,如下图所示:
实现了两种translogFile,它们的最大区别如名字所示就是写入时是否缓存。FsTranslogFile的接口如下所示:
每一个translogFile都会有一个唯一Id,两个非常重要的方法add和write。add是添加对应的操作,这些操作都是在translog中定义,这里写入的只是byte类型的文件,不关注是何种操作。所有的操作都是顺序写入,因此读取的时候需要一个位置信息。
TransLog主要作用是实时记录对于索引的修改操作,确保在索引写入磁盘前出现系统故障不丢失数据。tanslog的主要作用就是索引恢复,正常情况下需要恢复索引的时候非常少,它以stream的形式顺序写入,不会消耗太多资源,不会成为性能瓶颈。它的实现上,translog提供了对外的接口,translogFile是具体的文件抽象,提供了对于文件的具体操作。
Flushing of Tansaction log
translog帮助防止节点失败时的数据丢失。它的设计目的是帮助shard恢复操作,否则数据可能会从内存flush到磁盘时发生意外而丢失。日志每5秒被提交到磁盘上,或者在每个成功的索引、删除、更新或批量请求时提交。
为了防止数据丢失,每个shard都有一个事务日志或与之关联的写入日志。任何索引或删除操作在内部Lucene索引处理后被写入到translog中。在崩溃的情况下,当shard恢复时,可以从事务日志中重新重放最近的事务。
ES的flush是执行Lucene提交并产生新的translog的过程。它是在后台自动完成的,以确保事务日志不会太大,这将使在恢复期间重放其操作花费大量时间。它也通过API来操作。
与刷新索引shard相比,真正昂贵的操作是刷新其事务日志(涉及Lucene提交)。通过延迟刷新或完全禁用它们,可以提高索引吞吐量。但是这种做法有利有弊,延迟的flush当然会花费更长的时间。
基本参数
index.translog.flush_threshold_size - translog按size大小flush,默认为521M。
我们可以增加index.translog.flush_threshold_size从默认的512M到更大的值,比如1gb。这允许在发生刷新之前在translog中积累更大的segment。通过让更大的segment构建,可以减少刷新的频率,而更大的segement合并的频率也更低。所有这些都减少了磁盘I/O开销,提高了索引吞吐量。当然,将需要相应的heap空闲内存来提供额外缓冲空间,调整时此设置时请记住这一点。
index.translog.flush_threshold_ops - 多少任务来执行操作,默认为ulimited
index.translog.flush_threshold_period - 在触发刷新之前,不管事务日志大小,需要等待多长时间。默认为30m
index.translog.sync_interval - 多久检测是否需要flush。默认为5s
index.translog.durability - sync方式。默认为fsync,可选为async。2者区别,fsync每次操作都会commit到translog。async按设置的sync_interval时间定期commit到translog。 fsync更耗费资源,但可靠性好,async模式下,如果sync_interval间隔时间内发生问题,中间没有commit的操作会全部丢失
如没有其他特殊需求。可以使用一下参数来配置
index.translog.flush_threshold_size: "1gb" index.translog.sync_interval: "60s" index.translog.durability: "async"
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!