阮曉龍 賀路路
摘要:基于ELK在智慧運(yùn)維大數(shù)據(jù)分析平臺(tái)實(shí)現(xiàn)海量數(shù)據(jù)分析,對(duì)ELK的部署結(jié)構(gòu)進(jìn)行優(yōu)化,并在日志采集和日志處理中間增加KaVa消息處理隊(duì)列,減輕Logstash壓力,增加集群高可用性。通過(guò)Logstash的Filter插件利用正則表達(dá)式實(shí)現(xiàn)日志數(shù)據(jù)拆分,將拆分后的字段在Elasticsearch中存儲(chǔ),最終利用Kibana對(duì)日志數(shù)據(jù)進(jìn)行搜索、繪圖和展示。使用基于ELK的智慧運(yùn)維大數(shù)據(jù)平臺(tái)解決了運(yùn)維過(guò)程中日志采集、日志處理、日志可視化問(wèn)題,同時(shí)在數(shù)據(jù)處理上實(shí)現(xiàn)了接近1s的延遲搜索。
關(guān)鍵詞:ELK;KaVa;日志分析;大數(shù)據(jù);流式數(shù)據(jù)
DOI:10.11907/rjdk.192248 開(kāi)放科學(xué)(資源服務(wù))標(biāo)識(shí)碼(OSID):
中圖分類號(hào):TP319文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1672-7800(2020)006-0150-05
0 引言
讓運(yùn)維更智能、更高效是運(yùn)維的首要需求,智慧運(yùn)維是運(yùn)維發(fā)展的必然趨勢(shì)。對(duì)數(shù)據(jù)中心海量運(yùn)行數(shù)據(jù)進(jìn)行分析,從數(shù)據(jù)中找規(guī)律、找價(jià)值是智慧運(yùn)維的核心。智慧運(yùn)維的基礎(chǔ)是海量日志數(shù)據(jù)分析,日志分析是日常運(yùn)維、故障排錯(cuò)、性能分析的重要途徑。數(shù)據(jù)中心每天產(chǎn)生的日志數(shù)據(jù)越來(lái)越多,日志處理工作量越來(lái)越大,處理方法越來(lái)越復(fù)雜,對(duì)實(shí)時(shí)性的要求越來(lái)越高。針對(duì)傳統(tǒng)日志分析方法而言,日志獲取難、分析耗時(shí)耗力、不易動(dòng)態(tài)擴(kuò)展等問(wèn)題逐漸凸顯。
隨著分析技術(shù)及搜索技術(shù)的成熟與發(fā)展,在日志處理領(lǐng)域出現(xiàn)了以ELK Stack為代表的實(shí)時(shí)日志分析平臺(tái),運(yùn)維人員從TB甚至PB級(jí)的日志中獲取所需關(guān)注的信息及實(shí)現(xiàn)日志實(shí)時(shí)分析,使可視化展示分析成為可能。ELKStack是日志采集工具Logstash.分布式搜索引擎Elasticsearch、數(shù)據(jù)可視化分析平臺(tái)Kibana 3個(gè)開(kāi)源軟件的組合。本文基于ELK Stack技術(shù),實(shí)現(xiàn)了對(duì)海量日志進(jìn)行實(shí)時(shí)采集、檢索和展示的智慧運(yùn)維大數(shù)據(jù)分析平臺(tái)部署。
1 基于ELK智慧運(yùn)維大數(shù)據(jù)分析平臺(tái)
1.1 平臺(tái)整體架構(gòu)
數(shù)據(jù)采集、數(shù)據(jù)處理、數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)可視化展示是一個(gè)完整的日志分析系統(tǒng)必不可少的組成部分。在ELKStack架構(gòu)中,Logstash或Beats作為日志采集器分布于各業(yè)務(wù)系統(tǒng)進(jìn)行日志采集,將日志文本按照既定規(guī)則解析后輸出至Elasticsearch。Elasticsearch是ELK Stack中的核心系統(tǒng),負(fù)責(zé)存儲(chǔ)和搜索日志。Kibana是大數(shù)據(jù)圖形化展示工具,集成了DSL命令行、數(shù)據(jù)處理等插件,可以對(duì)Elasticsearch中的數(shù)據(jù)進(jìn)行搜索、分析以及可視化展示。
ELKStack架構(gòu)如圖l所示。
1.2 日志數(shù)據(jù)實(shí)時(shí)收集
日志采集是日志分析的基礎(chǔ),Logstash是一個(gè)開(kāi)源數(shù)據(jù)收集引擎,具有實(shí)時(shí)管道功能,可以同時(shí)從多個(gè)數(shù)據(jù)源獲取數(shù)據(jù),并對(duì)數(shù)據(jù)進(jìn)行處理后發(fā)送到Elasticsearch服務(wù)器中。
業(yè)務(wù)數(shù)據(jù)往往以各種各樣的形式分散在不同系統(tǒng)中,Logstash支持各種輸入選擇,可以在同一時(shí)間從眾多來(lái)源捕捉事件,能夠以連續(xù)的流式傳輸方式,實(shí)現(xiàn)日志、指標(biāo)、Web應(yīng)用、數(shù)據(jù)存儲(chǔ)以及各種AWS服務(wù)的日志數(shù)據(jù)采集。采集的日志數(shù)據(jù)流通過(guò)Logstash中的Input流人,經(jīng)過(guò)Filter實(shí)時(shí)解析和數(shù)據(jù)處理后通過(guò)Output進(jìn)行輸出。
Logstash擁有豐富的Filter插件,例如Grok是Log.stash的一個(gè)正則表達(dá)式插件,用于處理Syslog、Apache和其它Web服務(wù)日志、MySQL日志以及人為定義的日志格式,且其內(nèi)置超過(guò)120種常用正則表達(dá)式。利用Grok處理日志文本時(shí)一般按以下步驟進(jìn)行解析:①對(duì)將要進(jìn)行分析的日志進(jìn)行解讀,理解日志中每一個(gè)字段代表的含義;②確定利用Grok要將一條日志分為多少個(gè)字段,拆分字段是后期分析的重要指標(biāo);③利用Grok Debugger對(duì)編寫的正則進(jìn)行調(diào)試,獲取目標(biāo)字段。
例如一條訪問(wèn)日志信息如下:
10.10.3.2292019-08-0516:30:58GE//var/www/html 200461120.075
根據(jù)日志字段含義,通過(guò)Grok編寫規(guī)則如下。拆分日志后的內(nèi)容及格式如下:
Beats是ELK Stack的一系列數(shù)據(jù)采集器的總稱,對(duì)于不同的日志使用不同的采集器,目前Beats系列包含以下7個(gè)成員,如表1所示。
相比Logstash,Beats只負(fù)責(zé)采集數(shù)據(jù)而不處理數(shù)據(jù),因而占用的CPU和內(nèi)存比Logstash少得多,其對(duì)業(yè)務(wù)服務(wù)器的影響可忽略不計(jì)。在實(shí)際應(yīng)用環(huán)境中,推薦在業(yè)務(wù)系統(tǒng)部署B(yǎng)eats系列而不是Logstash采集數(shù)據(jù)從而來(lái)減輕服務(wù)器自身壓力,并由Logstash進(jìn)行數(shù)據(jù)處理。
1.3 日志數(shù)據(jù)存儲(chǔ)
Elasticsearch為開(kāi)源、分布式、基于Restful API、支持PB甚至更高數(shù)量級(jí)的搜索引擎工具,作為ElK Stack的核心,可以集中存儲(chǔ)數(shù)據(jù)。
Elasticsearch在生產(chǎn)環(huán)境中一般以集群的形式存在,在集群中節(jié)點(diǎn)分為主節(jié)點(diǎn)、數(shù)據(jù)節(jié)點(diǎn)、客戶端節(jié)點(diǎn)3種角色。主節(jié)點(diǎn)負(fù)責(zé)集群中索引的創(chuàng)建、刪除以及數(shù)據(jù)的Rebalance等操作,但不負(fù)責(zé)數(shù)據(jù)的索引和檢索,一般負(fù)載較輕。數(shù)據(jù)節(jié)點(diǎn)負(fù)責(zé)集群中數(shù)據(jù)的索引和檢索,一般壓力較大,對(duì)機(jī)器配置要求較高??蛻舳斯?jié)點(diǎn)負(fù)責(zé)來(lái)自不同請(qǐng)求的分發(fā)、匯總等,增加客戶端節(jié)點(diǎn)更多是為了負(fù)載均衡。
為了更好地理解Elasticsearch,將Elasticsearch與關(guān)系型數(shù)據(jù)庫(kù)MySQL進(jìn)行對(duì)比如表2所示。
1.4 日志數(shù)據(jù)可視化
數(shù)據(jù)可視化主要借助于圖形化手段,清晰有效地傳達(dá)與溝通信息。Kibana是一款開(kāi)源的數(shù)據(jù)分析和可視化平臺(tái),它是ElKStack成員之一,用作與Elasticsearch交互,可以對(duì)Elasticsearch索引中的數(shù)據(jù)進(jìn)行搜索、查看,同時(shí)利用圖表、表格及地圖對(duì)數(shù)據(jù)進(jìn)行多元化分析和呈現(xiàn)。
2 基于ELK+Kafka的智慧運(yùn)維大數(shù)據(jù)分析平臺(tái)部署
ELK Stack在實(shí)際生產(chǎn)環(huán)境中通常以集群的方式部署,集群部署的好處就是系統(tǒng)擴(kuò)展容易且能夠?qū)崿F(xiàn)負(fù)載均衡,保持系統(tǒng)長(zhǎng)期穩(wěn)定運(yùn)行。
整個(gè)ELK Stak架構(gòu)的調(diào)優(yōu)不僅是Elasticsearch集群的調(diào)優(yōu),同時(shí)包含數(shù)據(jù)采集、數(shù)據(jù)處理過(guò)程調(diào)優(yōu),因此在數(shù)據(jù)采集后增加Kafka集群。Kafka是一個(gè)適合離線和在線消息的隊(duì)列,Kafka消息保留在磁盤上,并在集群內(nèi)復(fù)制以防止數(shù)據(jù)丟失。部署Kafka可以減輕Logstash壓力,避免日志在處理前丟失。
經(jīng)過(guò)系統(tǒng)拓?fù)鋬?yōu)化,結(jié)合現(xiàn)有實(shí)際情況,本文部署結(jié)構(gòu)使用10臺(tái)服務(wù)器,拓?fù)浣Y(jié)構(gòu)如圖2所示。服務(wù)器功能劃分如表2所示。
2.1 Kafka集群部署
部署kafka集群需要3個(gè)基礎(chǔ)軟件,分別為Java環(huán)境、ZooKeeper和Kafka。目前JDK最新版本為12.0.2,下載地址為https://www.oracle.com/technetwork/java/javase/down10ads/jdkl2-downloads-5295953.html。ZooKeeper最新版本為3.5.5,下載地址為https://www-us.apache.org/dist/zookeepedzookeeper-3.5.5/(推薦使用bin格式的壓縮包)。Kafka最新版本為2.3.0,下載地址為http://kafka.apache.org/downloads(推薦使用bin格式且為Scala 2.12)。建議在部署時(shí)關(guān)閉CentOS 7的防火墻以及SELinux,待部署完成后開(kāi)啟相應(yīng)端口。
2.1.1 Java環(huán)境安裝
將JDK安裝包上傳到CentOS 7相應(yīng)目錄下。通過(guò)如下命令進(jìn)行JDK壓縮包解壓,并將解壓的目錄重新命名,其命令如下:
#tar-zxvfjdk-12.0.2_linux-x64_bin.tar.gz
#my jdk-12.0.2/jdk
安裝JDK后需要配置環(huán)境變量,編輯/etc/profile文件。在文件尾部添加如下配置。
#vim/etc/profile
export JAVA_HOME=/opt/jdk
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JA.VA_HOME/lib/dtjar:$JAVA_HOME/lib/tools.jar
export PATH=$PA7H:$JAVA_HOME/bin
通過(guò)source命令重新加載/etc/profile文件,使得修改后的內(nèi)容生效,命令如下:
#source/etc/profile
#java-version
2.1.2 ZooKeeper集群部署
將ZooKeeper壓縮包上傳到CentOS 7相應(yīng)目錄下。通過(guò)如下命令進(jìn)行ZooKeeper壓縮包解壓,并將解壓的目錄重新命名,其命令如下所示:
#tar-zxvf apache-zookeeper-3.5.5-bin.tar.gz
#mv apache-zookeeper-3.5.5-bin/zookeeper
ZooKeeper的配置文件在zookeeper/config/目錄下,首先復(fù)制zoo_sample.cfg為zoo.Cfg,然后在zookeeper目錄下創(chuàng)建data目錄和logs目錄,用于存放zookeeper數(shù)據(jù)和運(yùn)行日志。相關(guān)命令如下:
#cp zoo_sample.cfgzoo.Cfg
#mkdir/opt/zookeeper/{data,logs}
在data目錄下創(chuàng)建myid文件,myid值是zoo.cfg文件里定義的server.A項(xiàng)的值。10.10.2.226、10.10.2.227、10.10.2.228的myid值分別為l、2、3,myid值可配置為1-255。
zoo.CfC配置文件配置內(nèi)容如下:
dataDir=/opt/zookeeper/data
dataLogDir=/opt/zookeeperflogs
clientPort=218l
server.1=10.10.2.226:2888:3888
server.2=10.10.2.227:2888:3888
server.3=10.10.2.228:2888:3888
按照上述方法完成3臺(tái)Kafka服務(wù)器配置,分別在3臺(tái)Kafka服務(wù)器上啟動(dòng)ZooKeeper集群,啟動(dòng)、查看狀態(tài)命令如下。啟動(dòng)后會(huì)顯示當(dāng)前ZooKeeper節(jié)點(diǎn)屬于主節(jié)點(diǎn)還是從節(jié)點(diǎn)。
#/opt/zookeeper/bin/zkServer.sh start//啟動(dòng)命令
#/opt/zookeeper/bin/zkServer.sh status//狀態(tài)查看
2.1.3 Kafka集群部署
將Kafka壓縮包上傳到CentOS 7相應(yīng)目錄下。通過(guò)如下命令進(jìn)行Kafka壓縮包解壓,并將解壓的目錄重新命名,其命令如下:
#tar-zxvf kafka_2.12-2.3.0.tgz
#mv kafka_2.12-2.3.0/kafka
Kafka的配置文件在/opt/kafka/config目錄下,編輯server.properties文件,編輯內(nèi)容如下:
broker.id=1
listeners=PLAIN了EXT:H10.10.2.226:9092
advertised.1isteners=PLAINTEXT://10.10.2.226:9092
log.dirs=/opt/kafka/logs
zookeeper.connect:10.10.2.226:2181,10.10.2.227:2181,10.10.2.228:2181
按照上述方法完成3臺(tái)Kafka服務(wù)器的配置,分別在3臺(tái)Kafka服務(wù)器上啟動(dòng)Kafka集群,啟動(dòng)命令如下。其它兩個(gè)節(jié)點(diǎn)的的broker.id不同,另外分別為2、3。
#/opt/kafka/bin/kafka-server-start.sh/opt/kafka/config/server.properties
2.2 Logstash部署
目前,Logstash的最新版本為7.2.0,下載地址為:https://artifacts.elastic.co/downloads/logstash/logstash-7.2.0.tar.gz。將Logstash壓縮包上傳到CentOS 7相應(yīng)目錄下。
通過(guò)如下命令進(jìn)行Logstash壓縮包解壓,并將解壓的目錄重新命名,其命令如下:
#tar-zxvf logstash-7.2.0.tar.gz
#mv logstash-7.2.0/logstash
Logstash的配置文件在/opt/logstash/config目錄下,編輯logstash.yml文件,配置內(nèi)容如下:
node.name:asc-analysis
path.data:/optflogstash/data
http.host:“10.10.2.229'
http.port:9600-9700
配置完成后通過(guò)運(yùn)行最基本的Logstash管道測(cè)試Logstash是否安裝成功。Logstash管道有兩個(gè)必需元素:input和output,相關(guān)測(cè)試命令如下:
#/opt/logstash/bin/logstash-e‘input{stdin{}}output{std-out{}}
測(cè)試時(shí)無(wú)論輸入什么內(nèi)容,Logstash都會(huì)按照規(guī)范格式輸出,其中-e參數(shù)允許Logstash直接通過(guò)命令行接受設(shè)置,以實(shí)現(xiàn)在測(cè)試配置時(shí)不需要頻繁編輯配置文件。
2.3 Elasticsearch集群部署
目前,Elasticsearch的最新版本為7.2.0,下載地址為:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.2.0-1inux-x86_64.tar.gz。將Elasticsearch壓縮包上傳到CentOS 7相應(yīng)目錄下。通過(guò)如下命令進(jìn)行Logstash壓縮包解壓,并將解壓的目錄重新命名,其命令如下:
Elasticsearch的配置文件在/opt/elasticsearch/config目錄下,編輯elasticsearch.yml文件,進(jìn)行Elasticseach集群名稱、節(jié)點(diǎn)IP地址、通信端口、數(shù)據(jù)存放目錄、運(yùn)行日志目錄配置,注意在配置時(shí)每一個(gè)配置項(xiàng)前需要有空格。
配置完成后使用創(chuàng)建的elk用戶啟動(dòng)Elasticsearch,啟動(dòng)后通過(guò)瀏覽器訪問(wèn)部署的Elasticsearch節(jié)點(diǎn),如圖3所示。其余節(jié)點(diǎn)配置相同,注意在配置時(shí)集群名稱保持一致。
2.4 Kibana部署
目前,Kibana的最新版本為7.2.0,下載地址為:https://artifacts.elastic.co/downloads/kibana/kibana-7.2.0-1inux-x8664.tar.gz。將Elasticsearch壓縮包上傳到CentOS 7相應(yīng)目錄下。
通過(guò)如下命令進(jìn)行Logstash壓縮包解壓,并將解壓的目錄重新命名,其命令如下:
#tar-zxvf kibana-7.1.1-linux-x86_64.tar.gz
#mv kibana-7.1.1-linux-x86_64/kibana
編輯Kibana的配置文件kibana.yml。其中Server.host是部署Kibana機(jī)器的IP地址,服務(wù)端口為5601,Elastic.search.url是部署Elasticsearch機(jī)器的IP地址。配置完成后通過(guò)http:HIP:5601訪問(wèn)。
3 數(shù)據(jù)可視化展示
Kibana具有多個(gè)功能,Discover、可視化、儀表盤是常用的3個(gè)功能。Discover對(duì)搜索到的數(shù)據(jù)進(jìn)行展示并用柱狀圖表示統(tǒng)計(jì)結(jié)果??梢暬С种鶢顖D、面體圖、餅圖、折線圖等18種圖形創(chuàng)建。儀表盤將創(chuàng)建的可視化聚合在一起,整體反映整個(gè)業(yè)務(wù)或者系統(tǒng)運(yùn)行情況,且支持任意時(shí)間段的數(shù)據(jù)信息查看。信息技術(shù)學(xué)院教學(xué)云平臺(tái)業(yè)務(wù)整體運(yùn)行情況分析部分截圖如圖4所示。
4 結(jié)語(yǔ)
本文對(duì)ELK進(jìn)行研究與部署應(yīng)用,實(shí)現(xiàn)了Kafka、Elas.ticsearch集群部署并使用Logstash對(duì)日志數(shù)據(jù)進(jìn)行正則處理,最終在Kibana上繪制圖表加以展示?;贓LK的智慧運(yùn)維大數(shù)據(jù)分析平臺(tái)的建立和應(yīng)用解決了日志采集、日志處理、日志可視化等一系列問(wèn)題,使得日志實(shí)時(shí)分析成為可能,為日常運(yùn)維管理和日志分析提供了新的解決方案。
目前只是對(duì)ELK的簡(jiǎn)單應(yīng)用,后續(xù)將研究ELK的機(jī)器學(xué)習(xí)功能,實(shí)現(xiàn)故障發(fā)生時(shí)間、業(yè)務(wù)宕機(jī)、業(yè)務(wù)訪問(wèn)突增的預(yù)測(cè),并結(jié)合移動(dòng)端實(shí)現(xiàn)故障與預(yù)警的實(shí)時(shí)推送。