Elasticsearch事務日誌translog

2022-06-21 17:54:12 字數 2164 閱讀 2116

跟大多數分布式系統一樣,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是具體的檔案抽象,提供了對於檔案的具體操作。

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"

elasticsearch 事務日誌

是什麼?translog是elasticsearch的事務日誌檔案,它記錄了所有對索引分片的事務操作 add update delete 每個分片對應乙個translog檔案。幹嘛用的?translog是用來恢復資料的。es用 後寫 的套路來加快寫入速度 寫入的索引並沒有實時落盤到索引檔案,而是先雙...

elasticsearch配置詳解

elasticsearch的config資料夾裡面有兩個配置檔案 elasticsearch.yml和logging.yml,第乙個是es的基本配置檔案,第二個是日誌配置檔案,es也是使用log4j來記錄日誌的,所以logging.yml裡的設定按普通log4j配置檔案來設定就行了。下面主要講解下e...

誰在使用Elasticsearch

github github使用elasticsearch搜尋20tb的資料,包括13億的檔案和1300億行的 這個不用介紹了吧,碼農們都懂的,github在2013年1月公升級了他們的 搜尋,由solr轉為elasticsearch,目前集群規模為26個索引儲存節點和8個客戶端節點 負責處理搜尋請求...