Elasticsearch 之 Translog

1. 概念

我們知道,Elasticsearch(ES) 的底層存儲引擎是 Lucene,ES 調用 Lucene 的接口進行 CRUD,寫入 Lucene 的數據首先是緩存在內存中,只有 commit 后才持久化并可以搜索。commit 是一個開銷比較大的操作,因此不可能每次寫入或刪除都調用 commit,為了保證數據的可靠性,ES 引入了 Translog。ES 每次調用 Lucene 的接口寫入或刪除數據后,都會將操作日志記錄到 Translog 中防止意外斷電或程序奔潰導致數據丟失。如下:


translog.png

2. 設置

  • 同步間隔(index.translog.sync_interval)
    Translog 的日志每次都會寫入到操作系統的緩存中,只有執行 fsync 刷盤后才是安全的。因此 ES 會每隔一段時間執行 fsync 刷盤。默認時間間隔是 5s,最低不能低于 500ms。注:改參數只針對異步落盤方式才生效。
  • 刷盤方式(index.translog.durability)
    Translog 的刷盤方式有兩種:同步(request)和異步(async)
    ES 默認使用的是 request,即每次寫入、更新、刪除操作后立刻執行 fsync 落盤。
    如果使用異步的方式,則根據同步間隔周期性的刷盤。
    兩種方式各有千秋,同步刷盤具備更強數據可靠性保障,但同時帶來更高的 IO 開銷,性能更低。異步刷盤犧牲了一定的可靠性保障,但是降低了 IO 的開銷,性能更佳,因此需要根據不同的場景需求選擇合適的方式。
  • 大小閾值 (index.translog.flush_threshold_size)
    我們不可能讓 translog 的大小無限增長。translog 的大小過大會帶來如下問題:占用磁盤空間;節點恢復需要同步 translog 回放日志,如果太大會導致恢復時間過長。因此,需要設定一個閾值,當日志量達到該閾值時,觸發 flush,生成一個新的提交點,提交點之前的日志便可以刪除了(具體能否刪除還需結合日志的保留時長和保留大小而定)。
  • 日志保留大小(index.translog.retention.size)
    該設置項控制 translog 保留的大小。translog 保留的目的是為了在副本故障恢復時,提高恢復速度(主保留 translog,從恢復時,只需將 global checkpoint 后的日志發送給從就 ok 了)
  • 日志保留時長(index.translog.retention.age)
    同上,滿足任一條件即可
  • 日志 generation 閾值大小(index.translog.generation_threshold_size)
    為了避免 translog 越來越大,增加恢復的時間。在 translog 達到閾值時,會執行 flush,觸發 lucene commit,并滾動 translog 生成新的文件,當前 generation 前的操作數據都會提交到 lucene 持久化,恢復時,只需恢復當前 translog 中的操作即可。
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 簡單操作可以直接使用ElasticsearchRespositor接口,復雜的使用ElasticsearchTem...
    一個彩筆程序猿閱讀 809評論 0 0
  • 歡迎訪問我的博客查看原文:http://wangnan.tech 注:文本整理自《ELKstack權威指南》 架構...
    GhostStories閱讀 19,944評論 0 31
  • es的索引搜索是以lucene為底層的,但是lucene是沒有實現分布式,lucene提供了核心的索引和搜索引擎,...
    Tim在路上閱讀 5,424評論 0 14
  • 2018-12-04 https://segmentfault.com/a/1190000014480912 選舉...
    Ary_zz閱讀 691評論 0 0
  • Elasticsearch 介紹 概要 Elasticsearch 是一個分布式搜索引擎,底層基于 Lucene ...
    blankjee閱讀 444評論 0 0