這篇文章是一步一步的使用指南,介紹了如何結(jié)合使用Elasticsearch和其他ELK技術(shù)棧(現(xiàn)在叫Elastic Stack)來發(fā)送、解析、存儲(chǔ)和分析日志。在這個(gè)指南里我會(huì)使用:
- Filebeat:用于收集日志(注意:日志里包括的信息還可能有指標(biāo)、SQL事務(wù)記錄和其他的Beat能收集的信息源)。
- Logstash:用于處理日志和指標(biāo),并把他們轉(zhuǎn)變成結(jié)構(gòu)化的事件,以便于Elasticsearch進(jìn)行索引處理。
- Kibana:用于對存儲(chǔ)在Elasticsearch里的結(jié)構(gòu)化數(shù)據(jù)做可視化展現(xiàn)。
在這里,我會(huì)使用Apache的訪問日志作為例子。但你從這篇文章里所獲得的知識(shí)可以讓你運(yùn)用于其他類型的日志。文章最后我們會(huì)看看對這樣的系統(tǒng)擴(kuò)展到生產(chǎn)級別所面臨的挑戰(zhàn),無論是你自己干還是使用第三方提供的ELK/Elastic Stack。
安裝和配置Elasticsearch、Kibana和Filebeat。
Elasticsearch
Elasticsearch是一個(gè)Java應(yīng)用,所以你需要安裝最新版的JDK(Oracle的或是Ubuntu 16.04上的OpenJDK)。在Ubuntu 16.04版里,你可以用下面的命令安裝OpenJDK 8。
sudo apt-get install openjdk-8-jdk
如果你用的是RPM/DEB的Linux,我推薦下面這個(gè)官方包。文章里會(huì)用APT資源庫來獲得5.x版本。
wget -qO – https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add –
echo “deb https://artifacts.elastic.co/packages/5.x/apt stable main” | sudo tee -a /etc/apt/sources.list.d/elasticsearch-5.x.list
sudo apt-get update && sudo apt-get install elasticsearch
在啟動(dòng)Elasticsearch(命令是sudo service elasticsearch start)前,你需要決定給它分配多少內(nèi)存。這可以通過修改/etc/elasticsearch/jvm.options文件里面的-Xms和-Xmx值來確定。經(jīng)驗(yàn)法則是一開始使用服務(wù)器總內(nèi)存的一半來配置這兩個(gè)值,這樣剩下的一半內(nèi)存可以被操作系統(tǒng)用于緩存。以后可以通過監(jiān)控Elasticsearch的heap使用情況以及根據(jù)IO吞吐量的需求再調(diào)整這兩個(gè)值。
Kibana
Kibana可以通過使用Elasticsearch同一個(gè)APT資源庫來獲取并安裝。
sudo apt-get install kibana
sudo service kibana start
Filebeat
同樣,我們還是使用同一個(gè)APT資源庫來安裝Filebeat。
sudo apt-get install filebeat
默認(rèn)地Filebeat 5.0會(huì)向Elasticsearch推送一個(gè)模版。對于大多數(shù)的應(yīng)用場景,這個(gè)模版都可以配置與filebeat*模式相匹配的索引。例如,大部分的字符串都會(huì)被作為關(guān)鍵字索引起來,從而能很好地為分析(Kibana的可視化)所用。message字段會(huì)作為文本被索引,從而能被用來做全文本搜索(Kibana的Discover分頁)。對應(yīng)于Apache的日志文件,你需要通過配置filebeat.prospectors(里面的第一個(gè)prospector定義為:input_type: log)里面的paths(路徑)變量來把Filebeat指向它們。你需要用如下方式來定義這個(gè)路徑:
paths:
– /var/log/apache.log
然后啟動(dòng)Filebeat。你的日志應(yīng)該開始被導(dǎo)入了:
sudo service filebeat start
在Kibana里對日志進(jìn)行可視化展現(xiàn)
到這里,你可以在瀏覽器里打開Kibana(默認(rèn)端口是5601)來查看Elasticsearch里的日志了。首先你需要通過定義一個(gè)“索引模式”來指示被搜索的索引。把它設(shè)成filebeat-*:

圖1 圖片由Radu Gheorghe友情授權(quán)使用
接著你可以去Discover面板并搜索日志。例如,你采用與grep類似的方式搜索日志的內(nèi)容,但也會(huì)有一樣的缺陷。比如,如果你搜索“200”,你就無法確定是“200 OK”響應(yīng)還是“200 bytes”被傳送。

圖2 圖片由Radu Gheorghe友情授權(quán)使用
需要可視化時(shí),你可以進(jìn)入Visualize分頁并按主機(jī)名區(qū)分顯示。但是同樣的,你也無法使用message字段里的信息,因?yàn)樗锩娴牟煌牟糠郑ū热珥憫?yīng)編碼)還沒有被解析為它們自己的字段:

圖3 圖片由Radu Gheorghe友情授權(quán)使用
使用Logstash解析數(shù)據(jù)
為了能全面地探索你的日志數(shù)據(jù),你需要一個(gè)能解析它們的工具。Logstash就是這樣一個(gè)工具。在Elasticsearch 5.0版里,你可以使用一個(gè)Elasticsearch的“消化節(jié)點(diǎn)”來進(jìn)行這一處理,它能帶來性能的顯著提升。但是消化管道并不能為Logstash提供靈活性(例如條件)。所以在這個(gè)文章里我們會(huì)只會(huì)關(guān)注Logstash。
為了構(gòu)建Filebeat -> Logstash -> Elasticsearch -> Kibana的管道,你需要安裝和配置Logstash,并更新Filebeat的配置選項(xiàng)來讓它從原來指向Elasticsearch改為指向Logstash。讓我們一步一步地完成這個(gè)過程:
首先用相同的資源庫來安裝Lostash:
sudo apt-get install logstash
隨后在/etc/logstash/conf.d/文件夾里創(chuàng)建一個(gè)文件(比如說logstash.conf)。在這個(gè)文件里設(shè)置一個(gè)beats input讓Filebeat來連接。接著你可以使用grok filter來解析你的數(shù)據(jù),然后再發(fā)送給Elasticsearch。
input {
beats {
port => 5044
}
}
filter {
grok {
match => [ “message”, “%{COMMONAPACHELOG}” ]
}
}
output {
elasticsearch {
hosts => “localhost:9200”
}
}
在Filebeat里,你需要注釋掉整個(gè)output.elasticsearch小節(jié),并把output.logstash下面的hosts配置修改為Logstash的地址:
### Logstash as output
logstash:
# The Logstash hosts
hosts: [“localhost:5044”]
為了能讓Filebeat通過Logstash來重發(fā)日志數(shù)據(jù),你需要做以下幾個(gè)動(dòng)作:
- 先停掉Filebeat(sudo service filebeat stop)。
- 刪除注冊文件。Filebeat在這個(gè)文件里記錄了它原來指向的Apache日志。這個(gè)動(dòng)作讓Filebeat完全重啟:sudo rm /var/lib/filebeat/registry
- 刪除Elasticsearch里面已經(jīng)索引的數(shù)據(jù):curl -XDELETE localhost:9200/filebeat*
- 最后啟動(dòng)Logstash和Filebeat:sudo service logstash start; sudo service filebeat start
現(xiàn)在你的日志應(yīng)該已經(jīng)被Elasticsearch再次索引了。只是這次它們是結(jié)構(gòu)化的,并且默認(rèn)是存在索引logstash-*下面。Logstash使用了一個(gè)與Filebeat類似的模版,所以目前你還不用操心它的配置。
再去看一下Kibana。你需要在Settings分頁下新建一個(gè)索引模式,并配置logstash-*指向索引。你可能也想把這個(gè)模式設(shè)為默認(rèn)的。

圖4 圖片由Radu Gheorghe友情授權(quán)使用
因?yàn)楝F(xiàn)在Apache的日志已經(jīng)是結(jié)構(gòu)化的了,所以你可以搜索指定的字段。比如這個(gè)response字段:

圖5 圖片由Radu Gheorghe友情授權(quán)使用
你也可以構(gòu)建可視化圖來查看不同類型的響應(yīng)時(shí)間隨時(shí)間變化的情況:

圖6 圖片由Radu Gheorghe友情授權(quán)使用
從概念驗(yàn)證到生產(chǎn)系統(tǒng)
如你所見,Elastic Stack的入門是相當(dāng)?shù)煤唵蚊髁?。不過想把它用于生產(chǎn)環(huán)境的數(shù)據(jù)則需要做更多的工作。
在數(shù)據(jù)收集側(cè),Logstash可能會(huì)成為瓶頸,除非你能把它擴(kuò)展部署到很多節(jié)點(diǎn),或是單機(jī)多節(jié)點(diǎn)。還有其他的備選方案。比如你可以使用rsyslog。它也很快還是輕量級的。你可以很容易地把它裝在每個(gè)Web服務(wù)器上,讓它完成解析和直接發(fā)送數(shù)據(jù)到Elasticsearch的任務(wù)。不過,不同的發(fā)送者用不同的特征集合。在我們這個(gè)場景里,rsyslog允許配置rulesets來使用不同的通道發(fā)送消息,但GeoIP默認(rèn)是不支持這個(gè)功能的。
在Elasticsearch一側(cè),為了實(shí)現(xiàn)容錯(cuò)以及處理更多的日志,你需要為集群加入更多的節(jié)點(diǎn)。你需要在elasticsearch.yml里做一些修改來實(shí)現(xiàn)這個(gè)目標(biāo)。
實(shí)現(xiàn)容錯(cuò)
首先定義discovery.zen.ping.unicast.hosts,這樣節(jié)點(diǎn)間才能相互知道其他的節(jié)點(diǎn)的存在,從而形成一個(gè)集群。生產(chǎn)環(huán)境至少需要3個(gè)節(jié)點(diǎn)。這樣即使一個(gè)節(jié)點(diǎn)掛了,其他的節(jié)點(diǎn)還是能形成一個(gè)仲裁組。想定義仲裁組的大小,可以設(shè)置discovery.zen.minimum_master_nodes為NUMBER_OF_NODES/2+1。最后,你可以通過設(shè)置network.host來讓Elasticsearch監(jiān)聽外部接口(而不是監(jiān)聽默認(rèn)的localhost地址)。這樣就能讓Filebeat、Logstash、Elasticsearch、Kibana和你的瀏覽器運(yùn)行在不同的機(jī)器上。
對于包括更多節(jié)點(diǎn)的集群的配置或是對已有集群的調(diào)優(yōu)則會(huì)要求你對Elasticsearch的工作方式有更深的理解。O’Reilly的培訓(xùn)視頻《使用Elasticsearch》只有3個(gè)小時(shí)長,但會(huì)提供給你所有需要知道的關(guān)于如何配置和管理Elasticsearch的足夠信息。視頻內(nèi)容針對日志和其他的應(yīng)用場景,例如社交媒體分析和內(nèi)容搜索等。
自建還是購買
自建Elastic Stack可以讓你對Elasticsearch有更多的掌控,包括何時(shí)升級、安裝什么插件以及如何與其他的在用的技術(shù)(如數(shù)據(jù)庫、數(shù)據(jù)處理工具等)相集成。缺點(diǎn)則是要花很多時(shí)間、精力和投資來進(jìn)行日常維護(hù)、升級、調(diào)優(yōu),以及在基礎(chǔ)的ELK/Elastic Stack上開發(fā)各種各樣你需要的特性。如果自建對你來說不是那么有吸引力,你還是有一些其他的選擇。
一種選擇是使用云端的日志管理服務(wù)。這能讓你很快就上生產(chǎn),節(jié)省你在配置和維護(hù)Elasticsearch上的時(shí)間和投入。這些服務(wù)一般包括監(jiān)控、備份和升級等。
如果你想自建Elastic Stack,同時(shí)還想降低啟動(dòng)的時(shí)間,那就有很多的選擇可供考慮。比如這個(gè)O’Reilly的視頻課程、Elasticsearch培訓(xùn)和ELK/Elastic Stack咨詢服務(wù)等。
Radu Gheorghe
Radu Gheorghe是Sematext公司的搜索咨詢師和軟件工程師。作為咨詢師,他與客戶一起基于Elasticsearch或Solr開發(fā)搜索、分析和日志的解決方案。他也是支持團(tuán)隊(duì)的一員,幫助解決這些解決方案的生產(chǎn)系統(tǒng)里的問題。作為軟件工程師,他主要貢獻(xiàn)于Logsene、Sematext的日志SaaS。Radu是《使用Elasticsearch》視頻教程的作者,同時(shí)也是《Elasticsearch in Action》的作者之一。

