1、logstash介紹
- 數據收集處理引擎
- ETL工具
2、logstash架構簡介
Logstash Event是一個java object,它對外暴露了獲取內部字段以及修改內部字段值的一些api。
下面舉例講解:
stdin:標準輸入
codec是line,這個codec的作用就是按照每一行切割數據,就是說把每一行都轉換成logstash event
stdout:標準輸出
codec是json,這個codec的作用就是把每一個logstash event轉換成json的對象輸出。
line codec decode是按照換行符\n切割的。所以一行原始數據被分成了兩個event。
所以,在原始數據和event之間不是一對一的關係。
event經過json codec encode後就把每一個logstash event輸出成 json object。
3、測試
可以看到上圖的數據有一個message爲空的數據,是因爲在bar的後面又換了一行。
4、詳細講解logstash的架構
下圖是logstash6.x的架構
input是可以有多個的,每個input都有自己的codec,箭頭代表數據流向。
數據會經過Queue,Queue會把流入的數據分發到不同的pipeline中。
每一個pipeline有Batcher、filter、output。
Batcher的作用是批量的從Queue中取數據。Batcher是可以配置的,比如一次取一百個數據。
看上圖可知我有三個pipeline。
5、Life of an Event
這裏介紹logstash Event的生命歷程。
web.log爲我們的配置文件
隨着時間的推移,Batcher會收集越來越多的數據,當達到了處理數據的條件之後(Batcher會有兩種條件,數目或時間,數目達到了設定的閾值或者是時間到了),Batcher就會把數據發送到filter,在filter中對每一條logstash Event進行相關的處理。
最後output就會把數據輸出到你指定的輸出。
那麼,輸出之後,會把處理的ACK發送給Queue,代表着我剛纔處理了哪些event。
6、Queue的分類
logstash有兩個Queue,一個是In Memory在內存中的Queue,這個Queue是固定大小的,是沒法通過配置文件來修改的。壞處就是下圖所示。
爲了解決這個問題,推出了持久化Queue就是Persistent Queue In Disk,這個就是基於磁盤對處理數據進行一個記錄。
7、Persistent Queue In Disk
Data從Input進來,
- Data到PQ中。
- PQ會把這個數據在磁盤中備份一份。
- PQ告訴Input說這條數據我已經收到了。前提是Input要支持這種機制,有了這種機制才能感知目前logstash的這種處理能力。
接下來藍色部分,
- 數據就從PQ到filter output
- output把事件處理之後就會發送ACK到PQ
- PQ收到了這個ACK之後,就會把磁盤上的數據刪除掉
這樣就得知,即使發生了宕機,我的數據還是在disk中有的,只需要重啓logstash把disk中的數據重新消費一次就解決了。
8、Memory Queue與PQ的性能
可以看到性能的下降不是很嚴重,估計是在5%以內,如果沒有特殊需求一般建議把logstash的PQ打開。
9、打開PQ
queue.max_bytes默認是1GB,開大一點後,Queue能存儲的數據也就多了一點。
還有一些:
path.queue PQ存到磁盤的哪個位置。
queue.page_capacity 控制消息隊列每一個文件的大小。
queue.checkpoint.writes 提升容災能力,如果是1 表示每寫一個數據都去做盤,頂多也就會丟失一條數據。
10、logstash中線程的相關情況
調優的時候主要就是調整 Pipeline Workder Thread數。