Translog
编辑Translog编辑
对 Lucene 的更改仅在 Lucene 提交期间持久保存到磁盘,这是一个相对昂贵的操作,因此不能在每次索引或删除操作后执行。在一次提交之后和另一次提交之前发生的更改将在 Lucene 在进程退出或硬件故障的情况下从索引中删除。
Lucene 提交对于每个单独的更改来说太昂贵了,因此每个分片副本也会将其操作写入其称为translog的事务日志中。所有索引和删除操作在由内部 Lucene 索引处理后但在确认之前都会写入 translog。在发生崩溃的情况下,已确认但尚未包含在上次 Lucene 提交中的最新操作将在分片恢复时从 translog 中恢复。
Elasticsearch 刷新 是执行 Lucene 提交并启动新的 translog 生成过程。刷新会在后台自动执行,以确保 translog 不会增长过大,这会导致在恢复期间重放其操作需要相当长的时间。通过 API 也公开了手动执行刷新的功能,尽管这很少需要。
Translog 设置编辑
translog 中的数据只有在 translog 被 fsync
并提交时才会持久保存到磁盘。在发生硬件故障或操作系统崩溃或 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 提交点。默认为
512mb
。