0. 背景
用過ELK(Elasticsearch, Logstash, Kibana)的人應(yīng)該都面臨過同樣的問題抡蛙,Logstash雖然功能強(qiáng)大:支持許多的input/output plugin、強(qiáng)大的filter功能焕蹄。但是確內(nèi)存占用會非常大。還有種情況(我就是orz...)弦叶,在Logstash 5.2+版本中舍败,input plugin使用Log4j,必須使用filebeat婿滓,并且只支持log4j 1.x版本。了解到filebeat已經(jīng)支持filter和不少的output plugin粥喜,果斷轉(zhuǎn)投fielbeat陣營凸主。
1. 簡介
Filebeat官方介紹是這樣的:
Filebeat is a log data shipper for local files. Installed as an agent on your servers, Filebeat monitors the log directories or specific log files, tails the files, and forwards them either to Elasticsearch or Logstash for indexing.
Here’s how Filebeat works: When you start Filebeat, it starts one or more prospectors that look in the local paths you’ve specified for log files. For each log file that the prospector locates, Filebeat starts a harvester. Each harvester reads a single log file for new content and sends the new log data to libbeat, which aggregates the events and sends the aggregated data to the output that you’ve configured for Filebeat.
翻譯成中文大意就是:
Filebeat是一個日志數(shù)據(jù)收集工具,在服務(wù)器上安裝客戶端后额湘,filebeat會監(jiān)控日志目錄或者指定的日志文件卿吐,追蹤讀取這些文件(追蹤文件的變化,不停的讀)锋华,并且轉(zhuǎn)發(fā)這些信息到elasticsearch或者logstarsh中存放嗡官。
以下是filebeat的工作流程:當(dāng)你開啟filebeat程序的時候,它會啟動一個或多個探測器(prospectors)去檢測你指定的日志目錄或文件毯焕,對于探測器找出的每一個日志文件衍腥,filebeat啟動收割進(jìn)程(harvester),每一個收割進(jìn)程讀取一個日志文件的新內(nèi)容芥丧,并發(fā)送這些新的日志數(shù)據(jù)到處理程序(spooler)紧阔,處理程序會集合這些事件坊罢,最后filebeat會發(fā)送集合的數(shù)據(jù)到你指定的地點续担。
更關(guān)于探測器(prospectors)和收割進(jìn)程(harvester)信息,請查看官網(wǎng)How Filebeat works.
1.2 核心功能
1.2.1 性能穩(wěn)健活孩,不錯過任何檢測信號
無論在任何環(huán)境中物遇,隨時都潛伏著應(yīng)用程序中斷的風(fēng)險。Filebeat 能夠讀取并轉(zhuǎn)發(fā)日志行憾儒,如果出現(xiàn)中斷询兴,還會在一切恢復(fù)正常后,從中斷前停止的位置繼續(xù)開始起趾。
1.2.2 Filebeat 不會讓通道過載
考慮到數(shù)據(jù)量較大诗舰,F(xiàn)ilebeat 使用壓力敏感協(xié)議向 Logstash 或 Elasticsearch 發(fā)送數(shù)據(jù)。如果 Logstash 正在繁忙地處理數(shù)據(jù)训裆,它會告知 Filebeat 減慢讀取速度眶根。擁塞解決后蜀铲,F(xiàn)ilebeat 將恢復(fù)初始速度并繼續(xù)輸送數(shù)據(jù)。
1.2.3 不需要重載管道
當(dāng)將數(shù)據(jù)發(fā)送到 Logstash 或 Elasticsearch 時属百,F(xiàn)ilebeat 使用背壓敏感協(xié)議记劝,以考慮更多的數(shù)據(jù)量。如果 Logstash 正在忙于處理數(shù)據(jù)族扰,則可以讓 Filebeat 知道減慢讀取速度厌丑。一旦擁堵得到解決,F(xiàn)ilebeat 就會恢復(fù)到原來的步伐并繼續(xù)運(yùn)行渔呵。
1.2.4 輸送至 Elasticsearch 或 Logstash怒竿。在 Kibana 中實現(xiàn)可視化。
Filebeat 是 Elastic Stack 的一部分扩氢,因此能夠與 Logstash愧口、Elasticsearch 和 Kibana 無縫協(xié)作。無論您要使用 Logstash 轉(zhuǎn)換或充實日志和文件类茂,還是在 Elasticsearch 中隨意處理一些數(shù)據(jù)分析耍属,亦或在 Kibana 中構(gòu)建和分享儀表板,F(xiàn)ilebeat 都能輕松地將您的數(shù)據(jù)發(fā)送至最關(guān)鍵的地方巩检。
2. 性能
運(yùn)行環(huán)境:
OS | 內(nèi)存 | CPU | Filebeat版本 | Logstash版本 |
---|---|---|---|---|
CentOS | 32g | 6核Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz | 6.1 | 5.6.5 |
- Logstash內(nèi)存占用
[root@dde /]# cat /proc/20085/status /proc/20085/status | grep -i vm
VmPeak: 9837428 kB
VmSize: 9835376 kB
VmLck: 0 kB
VmHWM: 798364 kB
VmRSS: 798360 kB
VmData: 9677292 kB
VmStk: 88 kB
VmExe: 4 kB
VmLib: 16520 kB
VmPTE: 2568 kB
VmSwap: 0 kB
VmPeak: 9837428 kB
VmSize: 9835376 kB
VmLck: 0 kB
VmHWM: 798364 kB
VmRSS: 798360 kB
VmData: 9677292 kB
VmStk: 88 kB
VmExe: 4 kB
VmLib: 16520 kB
VmPTE: 2568 kB
VmSwap: 0 kB
- Filebeat內(nèi)存占用
[root@dde /]# cat /proc/22207/status /proc/22207/status | grep -i vm
VmPeak: 452796 kB
VmSize: 410180 kB
VmLck: 0 kB
VmHWM: 16008 kB
VmRSS: 16008 kB
VmData: 376332 kB
VmStk: 88 kB
VmExe: 24764 kB
VmLib: 1804 kB
VmPTE: 184 kB
VmSwap: 0 kB
VmPeak: 452796 kB
VmSize: 410180 kB
VmLck: 0 kB
VmHWM: 16008 kB
VmRSS: 16008 kB
VmData: 376332 kB
VmStk: 88 kB
VmExe: 24764 kB
VmLib: 1804 kB
VmPTE: 184 kB
VmSwap: 0 kB
Logstash因為是運(yùn)行是JVM中的厚骗,可以看到Logstash內(nèi)存占用比Filebeat大的多。
3. 安裝
Filebeat官方提供了以下幾種安裝方式: (deb for Debian/Ubuntu, rpm for Redhat/Centos/Fedora, mac for OS X, docker for any Docker platform, and win for Windows).
- deb:
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.1.2-amd64.deb
sudo dpkg -i filebeat-6.1.2-amd64.deb
- rpm:
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.1.2-x86_64.rpm
sudo rpm -vi filebeat-6.1.2-x86_64.rpm
- mac
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.1.2-darwin-x86_64.tar.gz
tar xzvf filebeat-6.1.2-darwin-x86_64.tar.gz
- docker:
docker pull docker.elastic.co/beats/filebeat:6.1.2
- windows:
1.下載zip包兢哭,地址领舰。
2.解壓到:C:\Program Files
。
3.重命名文件夾為以下格式:filebeat-<version>-windows
迟螺。
4.以管理員身份運(yùn)行Shell冲秽。
5.使用如下命令,講Filebeat安裝為一個Windows Service:
PS > cd 'C:\Program Files\Filebeat'
PS C:\Program Files\Filebeat> .\install-service-filebeat.ps1
4. 配置
Elastic提供了一個配合ELK(Elasticsearch + Logstash + Kibana)的快速配置方式矩父,不過我們不需要配合ELK使用Filebeat锉桑。直接配置filebeat根目錄下filebeat.yml文件:
filebeat.prospectors:
- type: log
enabled: true
paths:
- /var/log/*.log
#- c:\programdata\elasticsearch\logs\*
需要配合elasticsearch使用時,增加以下配置:
output.elasticsearch:
hosts: ["192.168.1.42:9200"]
需要配合kibana使用時窍株,增加以下配置:
setup.kibana:
host: "localhost:5601"
- Output
Filebeat現(xiàn)在已經(jīng)支持豐富的output類型:
- Elasticsearch
- Logstash
- Kafka
- Redis
- File
- Console
- Output codec
- Cloud
output到kafka的配置類似:
output.kafka:
# initial brokers for reading cluster metadata
hosts: ["kafka1:9092", "kafka2:9092", "kafka3:9092"]
# message topic selection + partitioning
topic: '%{[fields.log_topic]}'
partition.round_robin:
reachable_only: false
required_acks: 1
compression: gzip
max_message_bytes: 1000000
當(dāng)事件的大小超過max_message_bytes的值的時候民轴,會被直接丟棄不處理,所以要盡量控制filebeat產(chǎn)生的事件小于max_message_bytes的值球订。
上面示例中字段含義如下:
enable
: 該output是否生效后裸;
hosts
:kafka broker集群地址;
topic
: kafka接收事件的topic;
partition
: kafka output的partioning 策略冒滩,可能值為:random, round_robin, hash微驶。默認(rèn)為hash;官方關(guān)于這幾個可選值解釋如下:
random.group_events
:
Sets the number of events to be published to the same partition, before the partitioner selects a new partition by random. The default value is 1 meaning after each event a new partition is picked randomly.
round_robin.group_events
:
Sets the number of events to be published to the same partition, before the partitioner selects the next partition. The default value is 1 meaning after each event the next partition will be selected.
hash.hash
:
List of fields used to compute the partitioning hash value from. If no field is configured, the events key value will be used.
hash.random
:
Randomly distribute events if no hash or key value can be computed.
required_acks
: kafka broker ACK可靠級別: 0=不需要響應(yīng), 1=等待本地commit, -1=等待所有的 replicascommit. 默認(rèn)值為 1.
Note: 如果設(shè)置為0开睡,kafka將沒有ACK返回因苹,也許會有消息丟失或者錯誤较店。
5.運(yùn)行
sudo ./filebeat -e -c filebeat.yml
Filebeat目前已經(jīng)支持Docker和Kubernetes。
5.1 Docker
(1)pull image
docker pull docker.elastic.co/beats/filebeat:6.1.2
(2) run image
docker run \
-v ~/filebeat.yml:/usr/share/filebeat/filebeat.yml \
docker.elastic.co/beats/filebeat:6.1.2
(3) Configuration
FROM docker.elastic.co/beats/filebeat:6.1.2
COPY filebeat.yml /usr/share/filebeat/filebeat.yml
USER root
RUN chown filebeat /usr/share/filebeat/filebeat.yml
USER filebeat
5.2 Kubernetes
(1)Deploy manifests
curl -L -O https://raw.githubusercontent.com/elastic/beats/6.1/deploy/kubernetes/filebeat-kubernetes.yaml
(2)Setting
- name: ELASTICSEARCH_HOST
value: elasticsearch
- name: ELASTICSEARCH_PORT
value: "9200"
- name: ELASTICSEARCH_USERNAME
value: elastic
- name: ELASTICSEARCH_PASSWORD
value: changeme
(3)Deploy
kubectl create -f filebeat-kubernetes.yaml
check status
$ kubectl --namespace=kube-system get ds/filebeat
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE-SELECTOR AGE
filebeat 32 32 0 32 0 <none> 1m