一、logstash
Logstash: 是一個靈活的資料轉送和處理系統,在beats出來之前,還負責進行資料收集。Logstash的任務,就是將各種各樣的資料,經過配置轉化規則,統一化存入Elasticsearch。使用Ruby開發的Logstash在靈活性上,非常出色。不過效能一直是被詬病的問題。
由於Logstash在資料收集上並不出色,而且作為agent,效能並不達標。elastic發布了beats系列輕量級採集組件。至此,elastic形成了一個完整的生態鏈和技術棧,成為大資料超市的佼佼者。
二、Elastic Stack Beats 系列
Beats 是 ELK Stack 技術棧中負責單一用途資料擷取並推送給 Logstash 或 Elasticsearch 的輕量級產品。
Beats 架構:
beats 是一個使用 Golang 構建的平台,libbeat 是其核心庫,用來提供API進行與Elasticsearch,Logstash 的串連,還能配置輸入特性和實現資訊收集等工作。其中封裝一個輸出模組(Publisher),輸出模組可以負責將收集到的資料發送給 Logstash 或者 Elasticsearch。由於 go 語言設計有 channel,收集資料的邏輯代碼與 Publisher 都是通過 channel 通訊的,耦合度的最低的。因此,開發一個收集器,完全不需要知道Publisher 的存在,程式啟動並執行時候自然就“神奇”的把資料發往服務端了。除此之外,還封裝了設定檔處理、Tlog、守護化等功能,方便開發人員拓展 beats 的能力。
Beats 是一組輕量級採集程式的統稱,我們通常常用的幾個如下:
1) filebeat: 進行檔案和目錄採集,主要用於收集日誌資料。
2) metricbeat: 進行指標採集,指標可以是系統的,也可以是眾多中介軟體產品的,主要用於監控系統和軟體的效能。
3)packetbeat: 通過網路抓包、協議分析,對一些請求響應式的系統通訊進行監控和資料收集,可以收集到很多常規方式無法收集到的資訊。
4) Winlogbeat: 專門針對 windows 的 event log 進行的資料擷取。
5) Heartbeat: 系統間連通性檢測,比如 icmp, tcp, http 等系統的連通性監控。
6) 可以通過 beats 產生器來產生自己的 beats
1. filebeats
filebeat是構建於beats之上的,應用於日誌收集情境的實現,用來替代 Logstash Forwarder 的下一代 Logstash 收集器,是為了更快速穩定輕量低耗地進行收集工作,它可以很方便地與 Logstash 還有直接與 Elasticsearch 進行對接。
1) 健壯性
filebeat 異常中斷重啟後會繼續上次停止的位置。(通過${filebeat_home}\data\registry檔案來記錄日誌的位移量)
2) 智能調節傳輸速度,防止logstash、es 過載
Filebeat 使用力道感應式協議(backpressure-sensitive)來傳輸資料,在 logstash 忙的時候,Filebeat 會減慢讀取-傳輸速度,一旦 logstash 恢複,則 Filebeat 恢複原來的速度。
2. Metricbeat
Metricbeat 是一個輕量級的系統級效能指標監控工具。收集CPU,記憶體,磁碟等系統指標和 Redis,nginx等各種服務的指標。
1)通過在Linux,Windows,Mac上部署Metricbeat,可以收集cpu,記憶體,檔案系統,磁碟IO,網路IO等統計資訊。
2)支援採集 Apache, NGINX, MongoDB, MySQL, PostgreSQL, Redis, and ZooKeeper等服務的指標。零依賴,只需要在設定檔中啟用即可
3)如果你使用Docker管理你的服務。可以在該主機上單獨起一個Metricbeat容器,他通過從proc檔案系統中直接讀取cgroups資訊來收集有關Docker主機上每個容器的統計資訊。不需要特殊許可權訪問Docker API
4)Metricbeats是ELK Stack全家桶中的一員,可以和ELK無縫協同工作。例如使用Logstash二次處理資料,用Elasticsearch分析,或者用Kibana建立和共用儀錶盤。
3. Packetbeat
Packetbeat 是一個輕量級的網路資料包分析工具。Packetbeat可以通過抓包分析應用程式的網路互動。並且將抓到的資料發送到 Logstash 或者Elasticsearch。
1)Packetbeat 輕鬆的即時監控並解析像HTTP這樣的網路通訊協定。以瞭解流量是如何經過你的網路。Packetbeat 是被動的,不增加延遲開銷,無代碼侵入,不干涉其他基礎設施。
2)Packetbeat是一個庫,支援多種應用程式層協議,如 http、dns、mysal、icmp、postgres、redis 等。
3)Packetbeat可以讓你即時在目標伺服器上進行抓包-解碼-擷取請求和響應-展開欄位-將json格式的結果發送到Elasticsearch。
4)Packetbeat是ELK Stack全家桶中的一員,可以和ELK無縫協同工作。例如使用Logstash二次處理資料,用Elasticsearch分析,或者用Kibana建立和共用儀錶盤。
4. Winlogbeat
Winlogbeat 是一個輕量級的 Windows 事件記錄收集工具。將 Windows 事件發送到 Elasticsearc h或者Logstash
如果你有 Windows 伺服器的話,其實可以從 Windows 事件記錄中看到很多東西。例如,登陸(4624),登陸失敗(4625),插入USB可攜式裝置(4663)或者新裝軟體(11707)。WinlogBeat可以配置從任何事件記錄通道讀取並且結構化提供原始事件數目據。使得通過 Elasticsearch 過濾和彙總結果變得很容易。
Winlogbeat是ELK Stack全家桶中的一員,可以和ELK無縫協同工作。例如使用Logstash二次處理資料,用Elasticsearch分析,或者用Kibana建立和共用儀錶盤。
5. Heartbeat
Heartbeat 是一個心跳偵查工具,主要監控服務的可用性。監控給定的地址是否可用(官網原話:對於給定的URL列表,Heartbeat就問一句,還活著沒?活著吱一聲。。。) 可以結合ELK Stack其他產品做進一步的分析
1)不管你是測試同主機服務還是其他網路服務,Heartbeat都可以很輕鬆的產生正常已耗用時間和回應時間資料。而且修改配置不需要重啟Heartbeat
2)Heartbeat通過ICMP,TCP,和HTTP進行ping,也支援TLS,身分識別驗證(authentication ),和代理(proxies)。由於簡單的DNS解析,你可以監控所有負載平衡的服務(原文:You can monitor all the hosts behind a load-balanced server thanks to simple DNS resolution)
3)現如今基礎設施,服務和主機經常動態調整。Heartbeat可以修改設定檔後自動載入(原文:Heartbeat makes it easy to automate the process of adding and removing monitoring targets via a simple, file-based interface.)
4)Heartbeat是ELK Stack全家桶中的一員,可以和ELK無縫協同工作。例如使用Logstash二次處理資料,用Elasticsearch分析,或者用Kibana建立和共用儀錶盤。
6. 建立一個自己的 Beat
可以根據官方文檔,使用 beats 產生器產生自己的 beats
https://www.elastic.co/cn/blog/build-your-own-beat
三、 Fluentd
Fluentd是一個完全開源免費的log資訊收集軟體,支援超過125個系統的log資訊收集。其架構圖
Fluentd可以分為用戶端和服務端兩種模組。用戶端為安裝在被採集系統中的程式,用於讀取log檔案等資訊,並發送到Fluentd的服務端。服務端則是一個收集器。在Fluentd服務端,我們可以進行相應的配置,使其可以對收集到的資料進行過濾和處理,並最終路由到下一跳。下一跳可以是用於儲存的資料庫,如MongoDB, Amazon S3, 也可以是其他的資料處理平台,比如Hadoop。
1. install & 啟動
由於Fluentd的安裝較為麻煩,所以業界流行的穩定安裝版本其實是有Treasure Data公司提供的td-agent
curl-Lhttps://toolbelt.treasuredata.com/sh/install-ubuntu-trusty-td-agent2.sh|sh
通過start, stop, restart等命令可以啟動、關閉和重啟Fluentd服務。此時預設的Fluentd設定檔的目錄是/etc/td-agent/td-agent.conf檔案。
2. Post Sample Logs via HTTP
預設情況下,/etc/td-agent/td-agent.conf檔案已經對td-agent進行了基本的配置。可以接收通過HTTP Post的資料,並將其路由、寫入到/var/log/td-agent/td-agent.log中。
可嘗試通過以下curl命令來嘗試post資料。
$curl-XPOST-d'json={"json":"message"}'http://localhost:8888/debug.test
執行之後,可在輸出log的最後一行找到我們輸入的測試資料。
3. Syntax of Config
在Fluentd中,設定檔非常重要,它定義了Fluentd應該執行的操作。
開啟/etc/td-agent/td-agent.conf檔案,可以看到設定檔的具體內容。設定檔中基本會出現的配置分為以下幾種:
source: 定義輸入
match:定義輸出的目標,如寫入檔案,或者發送到指定地點。
filter:過濾,也即事件處理流水線,可在輸入和輸出之間運行。
system:系統層級的設定。
label:定義一組操作,從而實現複用和內部路由。
@include:引入其他檔案,和Java、python的import類似。
1)source: 定義輸入
Fluentd支援多輸入。每一個輸入配置必須包含類型/type,比如tcp資料輸入,或者http類型輸入。type將指定使用的input plugin。以下的樣本中就定義了兩個輸入源,一個是從24224連接埠進入的tcp資料流,另一個是從9880連接埠進入的http資料。
# Receive events from 24224/tcp# This is used by log forwarding and the fluent-cat command@type forward port 24224#http://this.host:9880/myapp.access?json={"event":"data"}@type http port 9880
Source指定的input外掛程式將帶有{tag, time,record} 三個屬性的事件/event提交給Fluentd的引擎,完成資料的輸入。
2)match:定義輸出的目標,如寫入檔案,或者發送到指定地點
Match配置了資料流的匹配規則和匹配成功後所需執行的動作,和路由表項類似。比如以下的配置中就對匹配myapp.access標籤成功的資料包執行file類型動作,將資料寫入到路徑為/var/log/fluent/access的檔案中。
# Match events tagged with "myapp.access" and# store them to /var/log/fluent/access.%Y-%m-%d# Of course, you can control how you partition your data# with the time_slice_format option.@type file path /var/log/fluent/access
標準的動作有file和forward等。File表明寫入檔案,而forward表明轉寄到下一跳。
Match Pattern的設計與正常的正則匹配沒有區別,具體的分類如下:
*:匹配tag的某一部分,比如a.*可以匹配a.b,但a.b.c無法匹配成功。**:匹配0個或者多個tag部分。比如a.**可以匹配a.b,a.b.c{X,Y,Z}:匹配X,Y,orZ,或關係。
此外,他們還可以混用,比如a.{b,c,d}.*等等。當標籤內,有多個匹配模式時,將支援或邏輯的匹配,即只要匹配成功人一個都執行對應的操作。比如:
匹配a和b.匹配a,a.b,a.b.c
3)Logging
Fluentd支援兩種類型的logging 配置,一種是 global 全域的,另一種是針對外掛程式的Plugin。
支援的log的輸出層級有如下幾種:
fatal error warn info debug trace
4)Fluentd有5種類型的外掛程式,分別是:
Input:完成輸入資料的讀取,由source部分配置
Parser:解析外掛程式
Output:完成輸出資料的操作,由match部分配置
Formatter:訊息格式化的外掛程式,屬於filter類型
Buffer:快取區外掛程式,用於快取資料
每一個類型都包含著多種的外掛程式,比如input類型就包含了以下幾種外掛程式:
in_forward in_http in_tail in_exec in_syslog in_scribe
5)Route
Route指的是資料在Fluentd中的處理流水線,一般的流程為
input -> filter -> output
input -> filter -> output with label
即由輸入外掛程式擷取資料,然後交給filter做處理,然後交給output外掛程式去轉寄。同時,也支援資料包/事件的重新提交,比如修改tag之後重新路由等等。
reroute event by tags
reroute event by record content
reroute event to other label
4. Use case
此處將選擇一個最簡單的使用案例來介紹Fluentd的使用。Fluentd收集Docker的登陸資訊案例。
首先建立一個config file, 用於配置Fluentd的行為,可命名為”in_docker.conf“。
type forward port 24224 bind 0.0.0.0type stdout
然後儲存檔案。使用以下命令運行Fluentd。
$fluentd-cin_docker.conf
若運行成功則可見輸出資訊如下所示:
$ fluentd -c in_docker.conf2015-09-01 15:07:12 -0600 [info]: reading config file path="in_docker.conf"2015-09-01 15:07:12 -0600 [info]: starting fluentd-0.12.152015-09-01 15:07:12 -0600 [info]: gem 'fluent-plugin-mongo' version '0.7.10'2015-09-01 15:07:12 -0600 [info]: gem 'fluentd' version '0.12.15'2015-09-01 15:07:12 -0600 [info]: adding match pattern="*.*" type="stdout"2015-09-01 15:07:12 -0600 [info]: adding source type="forward"2015-09-01 15:07:12 -0600 [info]: using configuration file:@type forward port 24224 bind 0.0.0.0@type stdout2015-09-01 15:07:12 -0600 [info]: listening fluent socket on 0.0.0.0:24224
然後啟動docker containner。如果之前沒有安裝過docker engine,請讀者自行安裝。由於docker 本身支援Fluentd收集資訊,所以可以通過啟動命令來啟動Fluentd的client/用戶端。
$dockerrun--log-driver=fluentdubuntuecho"Hello Fluentd!"HelloFluentd!
以上命令中的ubuntu為一個鏡像,如果本地沒有,docker engine會自動下載,並在此鏡像上建立容器。啟動容器後,查看預設的輸出資訊檔:/var/log/td-agent/td-agent.log,可在最後一行查看到輸出的資訊。
總結
Fluentd是一個優秀的log資訊收集的開源免費軟體,目前以支援超過125種系統的log資訊擷取。Fluentd結合其他資料處理平台的使用,可以搭建大資料收集和處理平台,搭建商業化的解決方案。
四、Fluentd & logstash 對比
logstash支援所有主流日誌類型,外掛程式支援最豐富,可以靈活DIY,但效能較差,JVM容易導致記憶體使用量量高。
fluentd支援所有主流日誌類型,外掛程式支援較多,效能表現較好。
參考:
https://www.jianshu.com/p/9c26bd9f6ebd
https://juejin.im/entry/58bad514ac502e006bf70517
http://soft.dog/2015/12/24/beats-basic/
http://www.muzixing.com/tag/fluentd.html