elasticsearch 事務日志是個啥東西?


是什么?

translog是elasticsearch的事務日志文件,它記錄了所有對索引分片的事務操作(add/update/delete),每個分片對應一個translog文件。

干嘛用的?

translog是用來恢復數據的。Es用“后寫”的套路來加快寫入速度 — 寫入的索引並沒有實時落盤到索引文件,而是先雙寫到內存和translog文件,
下圖1中灰色部分(見藍色箭頭)表示數據出於 可搜索 & 未落盤 & 已寫日志 的狀態。此時如果掉電,es重啟后還可以把數據從日志文件中讀回來。
圖1

什么時機寫?

有兩種玩法:
request — 每操作都寫(默認策略),可靠性最高。
async — 異步定時寫,可靠性跟時間間隔有關,試問自己斷電時你能接受多少數據無法恢復?
我實際對比兩種策略的性能數據,第二種的性能優勢表現不明顯。

存在哪里?

在索引分片目錄下,取名translog(藍色框),跟數據文件目錄(金黃色)相鄰。
translog-N.tlog  - 真正的日志文件,N表示generation(代)的意思,通過它跟索引文件關聯
tranlog.ckp - 日志的元數據文件,長度總是20個字節,記錄3個信息:偏移量 & 事務操作數量 & 當前代
圖2

什么時候刪?

在flush的時候,translog文件會被清空。實際的過程是先刪掉老文件,再創建一個新文件,取名時,序號加1,比如圖2中,flush后你只會看到 translog-2.tlog,原來的translog-1.tlog已被刪除。

為什么要刪?

如果能留着該多好?像mysql的binlog那樣,只要日志在,那么隨時可以重放來恢復數據,還可以通過對接數據平台,把數據同步到其它的系統。
那留着有什么壞處呢?數據冗余(因為索引文件和日志文件各有一份),想想mysql的數據文件和binlog文件,人家也冗余,冗余就冗余,沒毛病。
是恢復數據時間更長嗎?不對,因為恢復只跟新日志文件有關,舊文件可以留着不刪。
這個問題我沒想特明白,我猜也許只是個設計思路的問題 — 刪掉一了百了,更簡潔,不考慮重放,留着沒多大用,還得要想法子收拾。

translog 長成啥樣?

translog為什么總是43個字節?

因為每次事務默認總是被提交,導致translog總會立刻被刪除,然后創建新的。而你能看到的總是新的文件。
看下面的代碼,當REQUESET時,indexShard.sync會執行,引發flush 操作。
可以通過添加以下配置改變策略,不要每次都flush。
index.translog.durability: async
index.translog.sync_interval: 3600s

translog-n.tlog 文件這43個字節到底寫的啥?

 

數據項
魔法數
中斷符
常量
中斷符
版本
中斷符
UUID長度
UUID
長度(字節) 4 1 8 3 1 3 1 22
取值 3fd76c17 08 “translog”的ascII碼 ox000 ox02 ox000 ox16 uuid hex
作用

用來區分lucene不同版本

的文件

      確認es的版本    

區分tranlog文件,

同一個分片目錄的translog

這個值是一樣的

translog.ckp 里面都有啥?

其實就是tranlog-1.tlog的3個元數據,而且一直都會是20個字節
當前偏移量 —  2b十進制就是43,正好是文件頭的位置
事務數 — 當前是0
當前代 — 1,可以還原出文件名 tranlog-1.tlog,懂了吧
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM