elasticsearch持久化變更

2021-09-29 04:28:13 字數 2851 閱讀 4627

如果沒有用fsync把資料從檔案系統快取刷(flush)到硬碟,我們不能保證資料在斷電甚至是程式正常退出之後依然存在。為了保證 elasticsearch 的可靠性,需要確保資料變化被持久化到磁碟。

在 動態更新索引,我們說一次完整的提交會將段刷到磁碟,並寫入乙個包含所有段列表的提交點。elasticsearch 在啟動或重新開啟乙個索引的過程中使用這個提交點來判斷哪些段隸屬於當前分片。

即使通過每秒重新整理(refresh)實現了近實時搜尋,我們仍然需要經常進行完整提交來確保能從失敗中恢復。但在兩次提交之間發生變化的文件怎麼辦?我們也不希望丟失掉這些資料。

elasticsearch 增加了乙個 translog ,或者叫事務日誌,在每一次對 elasticsearch 進行操作時均進行了日誌記錄。通過 translog ,整個流程看起來是下面這樣:

乙個文件被索引之後,就會被新增到記憶體緩衝區,並且 追加到了 translog ,正如 圖 21 「新的文件被新增到記憶體緩衝區並且被追加到了事務日誌」 描述的一樣。

圖 21. 新的文件被新增到記憶體緩衝區並且被追加到了事務日誌

重新整理(refresh)使分片處於 圖 22 「重新整理(refresh)完成後, 快取被清空但是事務日誌不會」 描述的狀態,分片每秒被重新整理(refresh)一次:

圖 22. 重新整理(refresh)完成後, 快取被清空但是事務日誌不會

這個程序繼續工作,更多的文件被新增到記憶體緩衝區和追加到事務日誌(見 圖 23 「事務日誌不斷積累文件」 )。

圖 23. 事務日誌不斷積累文件

每隔一段時間—​例如 translog 變得越來越大—​索引被重新整理(flush);乙個新的 translog 被建立,並且乙個全量提交被執行(見 圖 24 「在重新整理(flush)之後,段被全量提交,並且事務日誌被清空」 ):

translog 提供所有還沒有被刷到磁碟的操作的乙個持久化紀錄。當 elasticsearch 啟動的時候, 它會從磁碟中使用最後乙個提交點去恢復已知的段,並且會重放 translog 中所有在最後一次提交後發生的變更操作。

translog 也被用來提供實時 crud 。當你試著通過id查詢、更新、刪除乙個文件,它會在嘗試從相應的段中檢索之前, 首先檢查 translog 任何最近的變更。這意味著它總是能夠實時地獲取到文件的最新版本。

圖 24. 在重新整理(flush)之後,段被全量提交,並且事務日誌被清空

這個執行乙個提交並且截斷 translog 的行為在 elasticsearch 被稱作一次 flush 。 分片每30分鐘被自動重新整理(flush),或者在 translog 太大的時候也會重新整理。請檢視translog文件 來設定,它可以用來控制這些閾值:

flushapi 可以被用來執行乙個手工的重新整理(flush):

post /blogs/_flush 

post /_flush?wait_for_ongoing

重新整理(flush)blogs索引。

重新整理(flush)所有的索引並且並且等待所有重新整理在返回前完成。

你很少需要自己手動執行flush操作;通常情況下,自動重新整理就足夠了。

這就是說,在重啟節點或關閉索引之前執行 flush 有益於你的索引。當 elasticsearch 嘗試恢復或重新開啟乙個索引, 它需要重放 translog 中所有的操作,所以如果日誌越短,恢復越快。

translog 有多安全?

translog 的目的是保證操作不會丟失。這引出了這個問題: translog 有多安全?

在檔案被fsync到磁碟前,被寫入的檔案在重啟之後就會丟失。預設 translog 是每 5 秒被fsync重新整理到硬碟, 或者在每次寫請求完成之後執行(e.g. index, delete, update, bulk)。這個過程在主分片和複製分片都會發生。最終, 基本上,這意味著在整個請求被fsync到主分片和複製分片的translog之前,你的客戶端不會得到乙個 200 ok 響應。

在每次請求後都執行乙個 fsync 會帶來一些效能損失,儘管實踐表明這種損失相對較小(特別是bulk匯入,它在一次請求中平攤了大量文件的開銷)。

但是對於一些大容量的偶爾丟失幾秒資料問題也並不嚴重的集群,使用非同步的 fsync 還是比較有益的。比如,寫入的資料被快取到記憶體中,再每5秒執行一次fsync

這個行為可以通過設定durability引數為async來啟用:

put /my_index/_settings

這個選項可以針對索引單獨設定,並且可以動態進行修改。如果你決定使用非同步 translog 的話,你需要 保證 在發生crash時,丟失掉sync_interval時間段的資料也無所謂。請在決定前知曉這個特性。

如果你不確定這個行為的後果,最好是使用預設的引數("index.translog.durability": "request")來避免資料丟失。

redis持久化 AOF持久化

1.aof持久化原理 aof持久化會將被執行的寫命令寫到aof檔案的末尾。在恢復的時候,redis只要從頭到尾重新執行一次aof檔案包含的所有寫命令 2.配置選項 固態硬碟禁用always選項,在某些情況頻繁讀寫會大大降低固態硬碟的壽命 4.aof檔案的重寫和壓縮 aof檔案裡面記錄了所有的命令而不...

redis持久化之AOF持久化

aof與rdb持久化通過儲存資料庫中的鍵值對來記錄資料庫狀態不同,aof持久化是通過儲存redis伺服器所執行的寫命令來記錄資料庫狀態的。被寫入aof檔案的所有命令都是以redis的命令請求協議格式儲存的。當aof持久化功能處於開啟狀態,伺服器在執行完乙個寫命令之後,會以協議格式將被執行的寫命令追加...

介面動態配置 持久化反持久化

介面在可配置的情況下需要讀寫配置檔案,vcl提供了一種方式 treader 和 twriter 方式儲存介面資源。object form1 tform1 left 0 top 0 caption form1 object lbl1 tlabel left 200 top 152 end object...