交易日志
edit事务日志
editLucene的更改仅在Lucene提交期间持久化到磁盘,这是一个相对昂贵的操作,因此不能在每次索引或删除操作后执行。在一次提交和另一次提交之间发生的更改,在进程退出或硬件故障的情况下,将被Lucene从索引中移除。
Lucene 提交在每次单独更改时执行成本过高,因此每个分片副本也会将其操作写入其称为 事务日志 的 translog。所有索引和删除操作在由内部 Lucene 索引处理后但在确认之前都会写入 translog。在发生崩溃的情况下,最近已确认但尚未包含在最后一次 Lucene 提交中的操作将在分片恢复时从 translog 中恢复。
Elasticsearch 的 flush 是指执行 Lucene 提交并启动新的 translog 生成的过程。flush 会在后台自动执行,以确保 translog 不会变得过大,从而在恢复期间重放其操作时不会花费过多时间。translog 的大小永远不会超过磁盘大小的 1%
。手动执行 flush 的能力也通过 API 暴露出来,尽管这很少需要。
Translog 设置
edit事务日志中的数据只有在事务日志被fsync
并提交后才会持久化到磁盘。在硬件故障、操作系统崩溃、JVM崩溃或分片故障的情况下,自上次事务日志提交以来写入的任何数据都将丢失。
默认情况下,index.translog.durability
设置为 request
,这意味着 Elasticsearch 只有在主节点和每个分配的副本上成功执行 fsync
并提交事务日志后,才会向客户端报告索引、删除、更新或批量请求的成功。如果 index.translog.durability
设置为 async
,那么 Elasticsearch 仅每隔 index.translog.sync_interval
执行一次 fsync
并提交事务日志,这意味着在节点恢复时,崩溃前刚刚执行的操作可能会丢失。
以下动态可更新的每个索引设置控制了事务日志的行为:
-
index.translog.sync_interval
-
事务日志多久会被
fsync
到磁盘并提交,无论是否有写操作。默认值为5s
。不允许使用小于100ms
的值。 -
index.translog.durability
-
是否在每次索引、删除、更新或批量请求后执行
fsync
并提交事务日志。此设置接受以下参数:-
request
-
(默认) 每次请求后执行
fsync
并提交。在硬件故障的情况下,所有已确认的写入都已提交到磁盘。 -
async
-
在后台每隔
sync_interval
执行fsync
并提交。在发生故障的情况下,自上次自动提交以来的所有已确认写入都将被丢弃。
-
-
index.translog.flush_threshold_size
-
事务日志存储了所有尚未安全持久化到Lucene的操作(即,不属于Lucene提交点的操作)。尽管这些操作可供读取,但如果分片被停止并需要恢复,它们将需要被重放。此设置控制这些操作的最大总大小,以防止恢复过程耗时过长。一旦达到最大大小,将发生刷新,生成新的Lucene提交点。默认为
10 GB
。