在這篇文章中,您可以了解Filebeat的關鍵構建模塊以及它們如何一起工作。了解這些概念將有助於您針對特定用例對Filebeat進行配置做出明智的決定。
Filebeat由兩個主要組件組成: prospectors 和 harvesters。 這些組件一起工作來尾隨文件並將事件數據發送到您指定的輸出。
什么是harvesters
harvesters負責讀取單個文件的內容。 harvesters逐行讀取每個文件,並將內容發送到輸出。 每個文件啟動一台harvesters。 harvesters負責打開和關閉文件,這意味着在harvesters運行時文件描述符保持打開狀態。 如果在收獲文件時刪除或重命名文件,Filebeat將繼續讀取文件。 這有副作用,在harvesters關閉之前,磁盤上的空間被保留。 默認情況下,Filebeat保持文件打開,直到達到close_inactive的設置(close_inactive默認為5分鍾,即5分鍾之內,沒有最新的日志信息產生則關閉文件句柄)。
關閉harvester有以下情況:
- 如果在harvester還在讀取文件時文件被刪除,那么文件處理程序關閉,釋放基礎資源。
- 只有在scan_frequency過后,文件的采集才會重新開始。(scan_frequency參數默認為10秒,每隔10秒prospector檢查目錄中日志文件的變化情況)
- 如果在harvester關閉的情況下移動或移除文件,則不會繼續收集文件。
什么是prospector
prospector負責管理harvesters並找到所有的讀取源。如果輸入類型是日志,則prospector會查找驅動器上與所定義的全局路徑匹配的所有文件,並為每個文件啟動一個harvesters。 每個prospector都在自己的Go例程中運行。
以下示例將Filebeat配置為從與指定的glob模式匹配的所有日志文件中獲取行:
filebeat.prospectors:
- type: log
paths:
- /var/log/*.log
- /var/path2/*.log
Filebeat目前支持兩種prospector類型:log和stdin。 每個prospector類型可以定義多次。 日志prospector檢查每個文件以查看是否需要啟動harvesters,是否已經運行,還是可以忽略文件(請參閱ignore_older,如果啟用此選項,Filebeat將忽略在指定時間范圍之前修改的任何文件。 如果長時間保存日志文件,配置ignore_older會特別有用。 例如,如果要啟動Filebeat,但只想從上周發送最新的文件和文件,則可以配置此選項。)。 只有在harvesters關閉后文件的大小發生了變化的情況下,才會選擇新行。
Filebeat的prospectors只能讀取本地文件。 沒有功能連接到遠程主機讀取存儲的文件或日志。
Filebeat如何保持文件的狀態?
Filebeat保持每個文件的狀態,並經常刷新注冊表文件中的磁盤狀態。狀態用於記住收割機正在讀取的最后偏移量,並確保發送所有日志行。
狀態信息記錄在/usr/local/filebeat-6.1.1/data目錄中的registry文件
[root@vl010001134060 data]# pwd
/usr/local/filebeat-6.1.1/data
[root@vl010001134060 data]# ls
meta.json registry
如果輸出(如Elasticsearch或Logstash)無法訪問,Filebeat將跟蹤發送的最后一行,並在輸出再次可用時繼續讀取文件。當Filebeat正在運行時,每個prospectors的狀態信息也被保存在內存中。當Filebeat重新啟動時,來自注冊表文件的數據被用來重建狀態,並且Filebeat繼續在最后一個已知位置的每個harvester。
每個prospectors為每個找到的文件保留一個狀態。由於文件可以被重命名或移動,文件名和路徑不足以識別文件。對於每個文件,Filebeat存儲唯一標識符以檢測文件是否先前被收集。
如果您的使用案例涉及每天創建大量新文件,您可能會發現注冊表文件會變得太大。(使用clean_inactive、clean_removed參數來調整)
Filebeat如何確保至少一次交付?
Filebeat保證事件至少被傳遞到配置的輸出一次,沒有數據丟失。 Filebeat能夠實現此行為,因為它將每個事件的傳遞狀態存儲在注冊表文件中。
在定義的輸出被阻止並且沒有確認所有事件的情況下,Filebeat會一直嘗試發送事件,直到輸出確認已經收到事件。
如果Filebeat在發送事件的過程中關閉,則不會等待輸出在關閉之前確認所有事件。 任何發送到輸出的事件,在Filebeat關閉之前沒有被確認,在重新啟動Filebeat時會再次發送。 這可確保每個事件至少發送一次,但最終可能會將重復事件發送到輸出。 您可以通過設置shutdown_timeout選項來配置Filebeat以在關閉之前等待特定時間。(shutdown_timeout選項默認是關閉狀態,可以設置時間,關閉時等待多長時間后再關閉)。
但是如果日志寫入磁盤的速度超過了Filebeat讀取日志的速度,當日志刪除或者日志被覆蓋時,則可能會丟失數據。
例如:
在Linux文件系統上,Filebeat使用inode和設備來識別文件。從磁盤中刪除文件時,可將inode分配給新文件。在涉及文件旋轉的使用情況下,如果舊文件被刪除並且之后立即創建新文件,則新文件可能與刪除的文件具有完全相同的inode。在這種情況下,Filebeat假定新文件與舊文件相同,並嘗試在舊位置繼續讀取,這是不正確的。
默認狀態不會從注冊表文件中刪除。要解決inode重用問題,我們建議您使用clean_ *選項(特別是clean_inactive)來刪除非活動文件的狀態。例如,如果您的文件每24小時輪換一次,並且輪換的文件不再更新,則可以將ignore_older設置為48小時,將clean_inactive設置為72小時。
您可以使用clean_removed從磁盤中刪除的文件。請注意,clean_removed會在掃描期間無法找到文件時清除注冊表中的文件狀態。如果該文件稍后再次顯示,則將從頭開始重新發送。