ELK 筆記 – 3 – Logstash Persistent Queue
Logstash 處理資料時,其處理工作的 Queue 預設放在記憶體內,因此如果遇到異常狀況,這些資料將會遺失。
Persistent Queue
Logstash 提供一些方式來因應這些錯誤的發生與處理,其中有一個是 Persistent Queue,它把 Queue 從記憶體改放到 Disk 上,減少放在記憶體內的遺失風險,但是當然隨之而來的 IO 開銷也會增加。
以下是研讀 Logstash 6.3 的 Persistent Queue 後所做的筆記,其中提到 Persistent Queue 的部分將會簡稱 PQ。
請注意新版本可能會出現新的功能或參數,請注意文件版本,這邊是以 6.3 為主。
PQ 在 Pipeline 中所處的位置
位在 input 與 filter 之間,input -> PQ -> filter -> output。
關於 input, filter, output ,可以參考 How Logstash Works
PQ 流程圖解
PQ 流程概述
- input 會一直收到 event,很多很多的 event 會一直進來,被儲存在一個叫做 head page 的地方,以 append 的方式加入。
- 此時,event 雖然已經寫入 file,但有可能還沒真正落到 Disk 上,請參考 fsync, delayed write, OS Cache 相關的資料。
- 在對 head page 進行工作時,event 的量每達到 queue.checkpoint.writes 時,就會進行一次 Check Point 的動作,以保證資料落到 Disk 上。
- 關於 Check Point ,每次進行時, Logstash 會去 call fsync,把目前 queue 的資料,在保證原子性(atomically)的前提下寫入 Disk。
- 等 head page 超過 queue.page_capacity 後,該 head page 會被標記成 tail page,tail page 不可修改。之後產生一個新的 head page 繼續接收新的 event。
- tail page 內的資料,會陸陸續續丟到 Filter, Output 去,已完成整套 pipeline 流程的 event ,會被標記為 Acknowledged (ACKed)
- 整個 tail page 的 events 都 Acknowledged 後,Garbage Collection 機制會去回收這部分資源。
Leave a Reply