Translog

编辑

对 Lucene 的更改仅在 Lucene 提交期间才会持久化到磁盘,这是一个相对昂贵的操作,因此不能在每次索引或删除操作后执行。在一次提交之后和另一次提交之前发生的更改,在进程退出或硬件故障时,将被 Lucene 从索引中删除。

Lucene 提交对于每次单独的更改执行来说过于昂贵,因此每个分片副本也会将操作写入其事务日志,即 translog。所有索引和删除操作在被内部 Lucene 索引处理之后,但在确认之前,都会被写入 translog。在发生崩溃时,最近已确认但尚未包含在上次 Lucene 提交中的操作,将在分片恢复时从 translog 中恢复。

Elasticsearch 刷新是执行 Lucene 提交并启动新的 translog 生成的过程。刷新在后台自动执行,以确保 translog 不会变得太大,否则在恢复期间重放其操作会花费大量时间。translog 大小永远不会超过磁盘大小的 1%。通过 API 也暴露了手动执行刷新的能力,尽管这很少需要。

Translog 设置

编辑

只有当 translog 被 fsync 并提交时,translog 中的数据才会持久化到磁盘。在发生硬件故障、操作系统崩溃、JVM 崩溃或分片故障时,自上次 translog 提交以来写入的任何数据都将丢失。

默认情况下,index.translog.durability 设置为 request,这意味着 Elasticsearch 只有在 translog 已在主分片和每个已分配副本上成功 fsync 并提交后,才会向客户端报告索引、删除、更新或批量请求的成功。如果 index.translog.durability 设置为 async,则 Elasticsearch 仅每 index.translog.sync_interval fsync 并提交 translog,这意味着在节点恢复时,在崩溃之前执行的任何操作都可能会丢失。

以下可动态更新的每个索引设置控制 translog 的行为

index.translog.sync_interval
无论写入操作如何,translog 多久 fsync 到磁盘并提交。默认为 5s。不允许小于 100ms 的值。
index.translog.durability

是否在每次索引、删除、更新或批量请求后 fsync 并提交 translog。此设置接受以下参数

request
(默认) 在每次请求后 fsync 并提交。在发生硬件故障时,所有已确认的写入都将已提交到磁盘。
async
在后台每 sync_interval fsync 并提交。在发生故障时,自上次自动提交以来的所有已确认写入都将被丢弃。
index.translog.flush_threshold_size
translog 存储所有尚未安全持久化到 Lucene 的操作(即,不属于 Lucene 提交点)。尽管这些操作可用于读取,但如果分片已停止并且必须恢复,则需要重新播放它们。此设置控制这些操作的最大总大小,以防止恢复花费太长时间。一旦达到最大大小,将发生刷新,生成新的 Lucene 提交点。默认为 10 GB