阮曉龍 賀路路



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