elastic stack開源技術棧介紹elastic stack棧涉及到以下幾個組件
使用elastic stack進行日志平臺架構如下圖所示: elastic stack技術棧 從以上日志數據的流向可以看到掌閱的應用日志數據有三種流向,下面分別說明:
beats采集數據beats是elasticstack的一員,屬于一種輕量級的日志采集組件,使用go語言開發,沒有依賴,可以簡化部署和運維操作,使用yaml格式的配置文件來采集日志或者系統信息,目前beats支持的事件采集包括:網絡數據,日志文件,mysql,system,mongodb,kafka,nginx,redis,zookeeper,haproxy等 beats提供了一個易于開發和擴展的框架用于擴展相關的監控指標的采集來滿足各種不同的指標采集需求,logstash提供了對beats數據采集的接入接口,因此只需要使用beats工具進行數據采集,然后將數據推到logstash集群即可;另外beats的數據還支持直接寫入es,這種場景適合不需要針對性的對數據做結構化的場景。 目前beats支持以下幾種:
beats使用指南 beats是基于libbeat框架進行開發的專門用于采集數據的一個組件。 開源的beats組件列表:https://www./guide/en/beats/libbeat/5.2/community-beats.html Beats 平臺是 Elastic.co 從 packetbeat 發展出來的數據收集器系統,統一基于go進行開發和擴展。beat 收集器可以直接寫入 Elasticsearch,也可以傳輸給 Logstash。其中抽象出來的 libbeat,提供了統一的數據發送方法,輸入配置解析,日志記錄框架等功能。也就是說,所有的 beat 工具,在配置上,除了 input 以外,在output、filter、shipper、logging、run-options 上的配置規則都是完全一致的,下圖是Filebeats的架構設計 filebeat架構設計 上圖的filebeat是最常見的一個日志采集工具,主要用來采集文件日志,filebeat的工作原理如下:
注意:因為registry文件記錄了每個文件的狀態并且持久化到了磁盤,如果有大量的文件的話,registry文件可能會變的很大,為了減少registry文件的大小,建議開啟clean_removed和clean_inactive兩個配置項。 安裝和使用filebeat因為filebeat為go語言開發,語言特性決定了filebeat的安裝和使用將會特別方便,首先去官方下載對應版本的壓縮包,然后解壓到指定路徑即可。 當我們安裝完filebeat之后,我們可以在filebeat的安裝目錄下看到兩個文件
使用yaml配置beats 1,配置文件名稱filebeat.yml,格式yaml格式。 2,filebeat日志勘探器prospector配置項說明
3,輸出相關的配置:output
輸出到elasticsearch 安裝filebeats的時候會在相應得目錄下有一份filebeat.template.json的文件,該文件用于高速Elasticsearch集群如何處理filebeat采集的日志,可以用以下命令手動裝載該模板: curl -XPUT 'http://localhost:9200/_template/filebeat?pretty' -d@/etc/filebeat/filebeat.template.json 如果要刪除該模板,執行: curl -XDELETE 'http://localhost:9200/filebeat-*'
輸出到logstash
輸出到kafka
輸出到Redis
輸出到文件
輸出到終端 4,完成配置后需要檢查配置的可用性 編寫完成filebeats相關的配置后執行如下命令檢查配置是否正確 ./filebeat -configtest -e 5,啟動beats 使用本地文件為輸入源,console為輸出進行debug測試啟動
測試配置
/data/server/filebeat/filebeat -c /data/server/filebeat/filebeat.test.yml -e 線上啟動可以用nohup或者supervisord進行管理。 nohup /data/server/filebeat/filebeat -e -c /data/server/filebeat/filebeat.yml >/dev/null 2>&1 & 6,使用beats組件需要測試和了解的幾項指標
安裝和使用logstash1,logstash安裝 安裝Java環境,要求Jdk版本大于1.8。 Java版本查看 安裝logstash wget https://artifacts./downloads/logstash/logstash-5.2.1.tar.gz 解壓到指定路徑 tar -xzvf logstash-5.2.1.tar.gz -C /data/server 測試logstash是否安裝成功 logstash -e 'input { stdin { } } output { stdout {} }' 2,logstash配置文件講解 logstash的配置文件是一種DSL的配置方式,主要包括三部分:
配置文件舉例: 3,啟動logstash進行測試 常規啟動方式: /data/server/logstash/bin/logstash -f /data/server/logstash/pipeline/demo.conf 推薦使用supervisord進行管理啟動,啟動腳本supervisord.conf配置舉例: [program:elkpro_1]environment=LS_HEAP_SIZE=5000mdirectory=/data/server/logstash/command=/data/server/logstash/bin/logstash -f /data/server/logstash/pipelien/pro1.conf --pluginpath /data/server/logstash/plugins/ -w 10 -l /data/logs/logstash/pro1.log[program:elkpro_2]environment=LS_HEAP_SIZE=5000mdirectory=/data/server/logstashcommand=/data/server/logstash/bin/logstash -f /data/server/logstash/pro2.conf --pluginpath /data/server/logstash/plugins/ -w 10 -l /data/logs/logstash/pro2.log 4,logstash的工作原理 在logstash中有輸入,過濾,輸出即:input,filter,output三種配置,這三種功能在logstash中是通過不同的線程進行處理,通過top命令然后H可以查看logstash的各個線程的工作情況 logstash處理的數據在線程之間以event形式傳遞,在過濾的過程中可以給event添加或者刪除修改event的tag,每個filter插件都會提供add_tag,remove_tag,add_field和remove_field四個方法。 logstash默認基于內存的隊列在管道間進行事件傳遞,如果logstash異常終止緩存在內存的事件將會被丟失,為了避免logstash異常終止導致的事件丟失,可以考慮使用持久化隊列來處理事件。跟持久化隊列相關的配置項有以下幾個:
當使用了持久化隊列的配置后,有一種場景也可能發生就是隊列分配的資源使用完了,這時候logstash為了避免后端ES過載采取的措施是不再接受新事件輸入。這個時候如果往logstash寫入數據的是beats組件時,beats會停止往logstash寫入數據,直到logstash隊列被消費后才繼續寫入。 5,logstash事件生命周期 logstash的事件會經歷inputs=>filters=>outputs這樣的管道完成一個事件的生命周期,我們針對事件的完整生命周期來分別講解每個階段的工作內容。 5.1 inputs 可以作為輸入源的類型有以下幾種
5.2 filters filters階段是對event的加工處理,每個事件在該階段都是運行在一個獨立的線程中,并將讀取到event寫入到Java的一個同步隊列SynchronousQueue,該隊列會將數據發送給當前空閑的worker去處理,如果所有的worker都是busy狀態就會阻塞。worker線程數可以通過配置文件進行設置,優化logstash的執行性能可以參考Tuning and Profiling logstash Performance 默認情況下logstash在各個管道(pipeline)間通過內存隊列做緩沖進行事件傳遞 常用的filters有以下幾種
5.3 outputs event最后的處理階段,該階段將event事件輸出到指定的服務中,當前支持的輸出服務有以下幾個
5.4 Codec 可以用于input或者output中。codecs可以簡化某些event的序列化操作,比較流行的codec有以下幾個
6,logstash插件架構 基于以上架構可以擴展和豐富logstash日志插件。不再贅述,如果當前插件不能滿足業務需求的時候可以考慮進行開發和擴展。以下是官方的插件列表舉例: 7,使用filebeat做為文件輸入源進行簡單配置舉例 8,logstash性能調優 logstash默認會選擇最佳的性能方案,當默認配置不能滿足需求的時候可以對影響性能的幾個參數進行調整,涉及到性能相關的參數有以下幾個:
9,logstash測試指標
使用隊列做數據緩沖由于數據寫入太快logstash或者ES集群性能有問題會導致數據寫入失敗,因此常規的架構上一般在輸入數據層都會使用一個隊列系統做緩沖區進行緩沖,常見的做為日志平臺的數據緩沖的隊列系統有以下幾種:
幾種隊列做一個簡單的對比:
引入隊列中間件的好處:
從以上對比分析可以無論選擇什么隊列做中間件,只要自己能夠hold住整體架構即可,每個中間件自身都各有千秋。接下來我們以kafka為隊列中間件做分析和舉例: 1,kafka架構及原理講解 kafka通過zookeeper集群保證服務的高可用,kafka自身又包括生產者和消費者,生產者和消費者的連接的橋梁是broker。 生產者和消費者關系 生產者將數據轉發到自己感興趣的topic中,每個topic在kafka上又支持劃分多個分區,通過分區的方式來解決負載均衡問題。多個消費者可以訂閱自己感興趣的topic, 生產者和消費者的關系 從上圖可以看出生產者是推送數據給kafka,消費者是從kafka拉取數據。 2,kafka集群搭建 從以上原理圖大家大概能知道kafka集群的搭建首先需要搭建zookeeper集群,搭建完zookeeper集群后需要根據日志平臺進行評估kafka集群的規模,設計kakfa服務器的磁盤分區以及配置項,由于篇幅有限,本文不再單獨講解kafka如何搭建。有興趣的讀者可以參考:http:///2017/09/04/kafka-best-pratice/ 存儲集群ElasticSearch講解elasticsearch是基于luncene的一個分布式搜索服務,支持在線擴容,海量數據存儲,高性能倒排列表,模糊搜索等高級特性,為了方便大家理解我拿ES和普通的關系數據庫進行對比如下: 使用es2unix工具可以在命令行上操作es 可以用paramedic插件監控ES集群的狀態,使用head插件可以查看ES索引的狀態,具體如何安裝插件和擴展請大家參考插件官方網站即可,不再贅述。 1,單機搭建ES集群講解 下載elasticsearch指定版本,注意ES官方目前已經升級到6.0以上版本,建議基于最新穩定版本搭建。 ES安裝比較簡單,從官方下載指定的壓縮包,然后解壓到指定路徑即可。 2,單機模式ES服務啟動 用于測試ES服務的接口和API等相關特性,搭建一個節點的單機版本進行測試 啟動ES集群前需要先設置ES啟動時依賴的一些系統參數:
啟動命令: /path/to/elasticsearch/bin/elasticsearch 3,集群模式搭建 由于不同規模,不同配置的硬件對集群搭建要求不一樣,建議大家基于自身服務器條件進行定制化搭建,不再贅述。 4,curator管理elasticsearch的索引 curator是python開發的一個工具,專門用來管理es集群相關的索引,通過該工具的api可以對es集群的索引進行單獨管理,包括查看,修改,刪除,副本,restore,snapshot等。 總結以上就是一個簡單的日志平臺涉及到的關鍵組件的講解和對應組件的原理分析。下面一個章節我們會將docker和這些組件的適配進行講解。敬請大家期待。 |
|