簡介
????ELK是Elasticsearch、Logstash鬼譬、Kibana的簡稱,這三者是核心套件逊脯,但并非全部优质。后文的四種基本架構中將逐一介紹應用到的其它套件。
????? Elasticsearch是實時全文搜索和分析引擎,提供搜集巩螃、分析演怎、存儲數(shù)據(jù)三大功能;是一套開放REST和JAVA API等結構提供高效搜索功能避乏,可擴展的分布式系統(tǒng)爷耀。它構建于Apache Lucene搜索引擎庫之上。
????? Logstash是一個用來搜集淑际、分析畏纲、過濾日志的工具。它支持幾乎任何類型的日志春缕,包括系統(tǒng)日志盗胀、錯誤日志和自定義應用程序日志。它可以從許多來源接收日志锄贼,這些來源包括 syslog票灰、消息傳遞(例如 RabbitMQ)和JMX,它能夠以多種方式輸出數(shù)據(jù)宅荤,包括電子郵件屑迂、websockets和Elasticsearch。
????? Kibana是一個基于Web的圖形界面冯键,用于搜索惹盼、分析和可視化存儲在 Elasticsearch指標中的日志數(shù)據(jù)。它利用Elasticsearch的REST接口來檢索數(shù)據(jù)惫确,不僅允許用戶創(chuàng)建他們自己的數(shù)據(jù)的定制儀表板視圖手报,還允許他們以特殊的方式查詢和過濾數(shù)據(jù)。
????? Filebeat隸屬于Beats改化。目前Beats包含四種工具:
????????? Packetbeat(搜集網(wǎng)絡流量數(shù)據(jù))掩蛤;
????????? Topbeat(搜集系統(tǒng)、進程和文件系統(tǒng)級別的 CPU 和內(nèi)存使用情況等數(shù)據(jù))陈肛;
????????? Filebeat(搜集文件數(shù)據(jù))揍鸟;
????????? Winlogbeat(搜集 Windows 事件日志數(shù)據(jù));
官方文檔
????Filebeat:
????????https://www.elastic.co/cn/products/beats/filebeat
????????https://www.elastic.co/guide/en/beats/filebeat/6.2/index.html
? ??Logstash:? ?
? ??????https://www.elastic.co/cn/products/logstash
? ??????https://www.elastic.co/guide/en/logstash/6.2/index.html
? ??Kibana:
? ??????https://www.elastic.co/cn/products/kibana
? ??????https://www.elastic.co/guide/en/kibana/6.2/index.html
????Elasticsearch:
? ??????https://www.elastic.co/cn/products/elasticsearch
? ??????https://www.elastic.co/guide/en/elasticsearch/reference/6.2/index.html
????Elasticsearch中文社區(qū):
????????https://elasticsearch.cn/
Why ELK?
? ??一般我們需要進行日志分析場景:直接在日志文件中 grep句旱、awk 就可以獲得自己想要的信息阳藻。但在規(guī)模較大的場景中,此方法效率低下谈撒,面臨問題包括日志量太大如何歸檔稚配、文本搜索太慢怎么辦、如何多維度查詢港华。需要集中化的日志管理道川,所有服務器上的日志收集匯總。常見解決思路是建立集中式日志收集系統(tǒng),將所有節(jié)點上的日志統(tǒng)一收集冒萄,管理臊岸,訪問。
? ??一般大型系統(tǒng)是一個分布式部署的架構尊流,不同的服務模塊部署在不同的服務器上帅戒,問題出現(xiàn)時,大部分情況需要根據(jù)問題暴露的關鍵信息崖技,定位到具體的服務器和服務模塊逻住,構建一套集中式日志系統(tǒng),可以提高定位問題的效率迎献。
? ??一個完整的集中式日志系統(tǒng)瞎访,需要包含以下幾個主要特點:
????????? 收集-能夠采集多種來源的日志數(shù)據(jù);
????????? 傳輸-能夠穩(wěn)定的把日志數(shù)據(jù)傳輸?shù)街醒胂到y(tǒng)吁恍;
????????? 存儲-如何存儲日志數(shù)據(jù)扒秸;
????????? 分析-可以支持 UI 分析;
????????? 警告-能夠提供錯誤報告冀瓦,監(jiān)控機制伴奥;
? ??ELK提供了一整套解決方案,并且都是開源軟件翼闽,之間互相配合使用拾徙,完美銜接,高效的滿足了很多場合的應用感局。
Filebeat工作原理
? ?? Filebeat由兩個主要組件組成:prospectors 和 harvesters锣吼。這兩個組件協(xié)同工作將文件變動發(fā)送到指定的輸出中。
? ??Harvester:
? ??????Harvester負責讀取單個文件內(nèi)容蓝厌。每個文件會啟動一個Harvester,每個Harvester會逐行讀取各個文件古徒,并將文件內(nèi)容發(fā)送到制定輸出中拓提。Harvester負責打開和關閉文件,意味在Harvester運行的時候隧膘,文件描述符處于打開狀態(tài)代态,如果文件在收集中被重命名或者被刪除,F(xiàn)ilebeat會繼續(xù)讀取此文件疹吃。所以在Harvester關閉之前蹦疑,磁盤不會被釋放。默認情況filebeat會保持文件打開的狀態(tài)萨驶,直到達到close_inactive(如果此選項開啟歉摧,filebeat會在指定時間內(nèi)將不再更新的文件句柄關閉,時間從harvester讀取最后一行的時間開始計時。若文件句柄被關閉后叁温,文件發(fā)生變化再悼,則會啟動一個新的harvester。關閉文件句柄的時間不取決于文件的修改時間膝但,若此參數(shù)配置不當冲九,則可能發(fā)生日志不實時的情況,由scan_frequency參數(shù)決定跟束,默認10s莺奸。Harvester使用內(nèi)部時間戳來記錄文件最后被收集的時間。例如:設置5m冀宴,則在Harvester讀取文件的最后一行之后灭贷,開始倒計時5分鐘,若5分鐘內(nèi)文件無變化花鹅,則關閉文件句柄氧腰。默認5m)。
? ??Prospector:
? ?????? 負責管理Harvester并找到所有讀取源刨肃。
????Prospector會找到/apps/logs/*目錄下的所有info.log文件古拴,并為每個文件啟動一個Harvester。Prospector會檢查每個文件真友,看Harvester是否已經(jīng)啟動黄痪,是否需要啟動,或者文件是否可以忽略盔然。若Harvester關閉桅打,只有在文件大小發(fā)生變化的時候Prospector才會執(zhí)行檢查。只能檢測本地的文件愈案。
? ??Filebeat會將文件狀態(tài)記錄在文件中(默認在/var/lib/filebeat/registry)挺尾。此狀態(tài)可以記住Harvester收集文件的偏移量。若連接不上輸出設備站绪,如ES等遭铺,filebeat會記錄發(fā)送前的最后一行,并再可以連接的時候繼續(xù)發(fā)送恢准。Filebeat在運行的時候魂挂,Prospector狀態(tài)會被記錄在內(nèi)存中。Filebeat重啟的時候馁筐,利用registry記錄的狀態(tài)來進行重建涂召,用來還原到重啟之前的狀態(tài)。每個Prospector會為每個找到的文件記錄一個狀態(tài)敏沉,對于每個文件果正,F(xiàn)ilebeat存儲唯一標識符以檢測文件是否先前被收集炎码。
????Filebeat之所以能保證事件至少被傳遞到配置的輸出一次,沒有數(shù)據(jù)丟失舱卡,是因為filebeat將每個事件的傳遞狀態(tài)保存在文件中辅肾。在未得到輸出方確認時,filebeat會嘗試一直發(fā)送轮锥,直到得到回應矫钓。若filebeat在傳輸過程中被關閉,則不會再關閉之前確認所有時事件舍杜。任何在filebeat關閉之前為確認的時間新娜,都會在filebeat重啟之后重新發(fā)送。這可確保至少發(fā)送一次既绩,但有可能會重復概龄。可通過設置shutdown_timeout 參數(shù)來設置關閉之前的等待事件回應的時間(默認禁用)饲握。
Logstash工作原理
? ??Logstash事件處理有三個階段:inputs → filters → outputs私杜。是一個接收,處理救欧,轉(zhuǎn)發(fā)日志的工具衰粹。支持系統(tǒng)日志,webserver日志笆怠,錯誤日志铝耻,應用日志,總之包括所有可以拋出來的日志類型蹬刷。
Input
????輸入數(shù)據(jù)到logstash瓢捉,一些常用的輸入為:
????????? file:從文件系統(tǒng)的文件中讀取,類似于tial -f命令办成;
????????? syslog:在514端口上監(jiān)聽系統(tǒng)日志消息泡态,并根據(jù)RFC3164標準進行解析;
????????? redis:從redis service中讀扔芈某弦;
????????? beats:從filebeat中讀取冷守;
Filters
????數(shù)據(jù)中間處理,對數(shù)據(jù)進行操作惊科,一些常用的過濾器為:
????????? grok:解析任意文本數(shù)據(jù)拍摇,Grok 是 Logstash 最重要的插件。它的主要作用就是將文本格式的字符串馆截,轉(zhuǎn)換成為具體的結構化的數(shù)據(jù)充活,配合正則表達式使用蜂莉。內(nèi)置120多個解析語法。
????????官方提供的grok表達式:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns
????????grok在線調(diào)試:https://grokdebug.herokuapp.com/
????????? mutate:對字段進行轉(zhuǎn)換混卵。例如對字段進行刪除映穗、替換、修改幕随、重命名等蚁滋。
????????? drop:丟棄一部分events不進行處理。
????????? clone:拷貝 event赘淮,這個過程中也可以添加或移除字段辕录。
????????? geoip:添加地理信息(為前臺kibana圖形化展示使用)
Outputs
????outputs是logstash處理管道的最末端組件。一個event可以在處理過程中經(jīng)過多重輸出梢卸,但是一旦所有的outputs都執(zhí)行結束走诞,這個event也就完成生命周期。一些常見的outputs為:
????????? elasticsearch:可以高效的保存數(shù)據(jù)蛤高,并且能夠方便和簡單的進行查詢蚣旱。
????????? file:將event數(shù)據(jù)保存到文件中。
????????? graphite:將event數(shù)據(jù)發(fā)送到圖形化組件中戴陡,一個很流行的開源存儲圖形化展示的組件塞绿。
Codecs
????codecs 是基于數(shù)據(jù)流的過濾器,它可以作為input猜欺,output的一部分配置位隶。Codecs可以幫助你輕松的分割發(fā)送過來已經(jīng)被序列化的數(shù)據(jù)。一些常見的codecs:
????????? json:使用json格式對數(shù)據(jù)進行編碼/解碼开皿。
????????? multiline:將匯多個事件中數(shù)據(jù)匯總為一個單一的行涧黄。比如:java異常信息和堆棧信息。
Elasticsearch
????Elasticsearch 是一個分布式的搜索和分析引擎赋荆,可以用于全文檢索笋妥、結構化檢索和分析,并能將這三者結合起來窄潭。Elasticsearch 基于 Lucene 開發(fā)春宣,現(xiàn)在是使用最廣的開源搜索引擎之一。
? ??基本概念
????????? node:即一個 Elasticsearch 的運行實例嫉你,使用多播或單播方式發(fā)現(xiàn) cluster 并加入月帝。
????????? cluster:包含一個或多個擁有相同集群名稱的 node,其中包含一個master node幽污。
????????? index:類比關系型數(shù)據(jù)庫里的DB嚷辅,是一個邏輯命名空間。
????????? alias:可以給 index 添加零個或多個alias距误,通過 alias 使用index 和根據(jù)index name 訪問index一樣簸搞,但是扁位,alias給我們提供了一種切換index的能力,比如重建了index趁俊,取名customer_online_v2域仇,這時,有了alias寺擂,我要訪問新 index暇务,只需要把 alias 添加到新index 即可,并把alias從舊的 index 刪除沽讹。不用修改代碼般卑。
????????? type:類比關系數(shù)據(jù)庫里的Table。其中爽雄,一個index可以定義多個type蝠检,但一般使用習慣僅配一個type。
????????? mapping:類比關系型數(shù)據(jù)庫中的 schema 概念挚瘟,mapping 定義了 index 中的 type叹谁。mapping 可以顯示的定義,也可以在 document 被索引時自動生成乘盖,如果有新的 field焰檩,Elasticsearch 會自動推測出 field 的type并加到mapping中。
????????? document:類比關系數(shù)據(jù)庫里的一行記錄(record)订框,document 是 Elasticsearch 里的一個 JSON 對象析苫,包括零個或多個field。
????????? field:類比關系數(shù)據(jù)庫里的field穿扳,每個field 都有自己的字段類型衩侥。
????????? shard:是一個Lucene 實例。Elasticsearch 基于 Lucene矛物,shard 是一個 Lucene 實例茫死,被 Elasticsearch 自動管理。之前提到履羞,index 是一個邏輯命名空間峦萎,shard 是具體的物理概念,建索引忆首、查詢等都是具體的shard在工作爱榔。shard 包括primary shard 和 replica shard,寫數(shù)據(jù)時糙及,先寫到primary shard详幽,然后,同步到replica shard丁鹉,查詢時妒潭,primary 和 replica 充當相同的作用。replica shard 可以有多份揣钦,也可以沒有雳灾,replica shard的存在有兩個作用,一是容災冯凹,如果primary shard 掛了谎亩,數(shù)據(jù)也不會丟失,集群仍然能正常工作宇姚;二是提高性能匈庭,因為replica 和 primary shard 都能處理查詢。另外浑劳,如上圖右側紅框所示阱持,shard數(shù)和replica數(shù)都可以設置,但是魔熏,shard 數(shù)只能在建立index 時設置衷咽,后期不能更改,但是蒜绽,replica 數(shù)可以隨時更改镶骗。
????ES VS RDB
Kibana
? ??Kibana是一個開源的分析與可視化平臺,設計出來用于和Elasticsearch一起使用的躲雅《︽ⅲ可以用kibana搜索、查看相赁、交互存放在Elasticsearch索引里的數(shù)據(jù)相寇,使用各種不同的圖表、表格噪生、地圖等kibana能夠很輕易地展示高級數(shù)據(jù)分析與可視化裆赵。
ELK 架構
? ??第一種ELK架構,是最簡單的一種ELK架構方式跺嗽。優(yōu)點是搭建簡單战授,易于上手。缺點是Logstash耗資源較大桨嫁,運行占用CPU和內(nèi)存高植兰。另外沒有消息隊列緩存,存在數(shù)據(jù)丟失隱患璃吧。建議供學習者和小規(guī)模集群使用楣导。此架構首先由Logstash分布于各個節(jié)點上搜集相關日志、數(shù)據(jù)畜挨,并經(jīng)過分析筒繁、過濾后發(fā)送給遠端服務器上的Elasticsearch進行存儲噩凹。Elasticsearch將數(shù)據(jù)以分片的形式壓縮存儲并提供多種API供用戶查詢,操作毡咏。用戶亦可以更直觀的通過配置Kibana Web Portal方便的對日志查詢驮宴,并根據(jù)數(shù)據(jù)生成報表。
? ??第二種架構呕缭,引入了消息隊列機制堵泽,位于各個節(jié)點上的Logstash Agent先將數(shù)據(jù)/日志傳遞給Kafka(或者Redis),并將隊列中消息或數(shù)據(jù)間接傳遞給Logstash恢总,Logstash過濾迎罗、分析后將數(shù)據(jù)傳遞給Elasticsearch存儲。最后由Kibana將日志和數(shù)據(jù)呈現(xiàn)給用戶片仿。因為引入了Kafka(或者Redis),所以即使遠端Logstash server因故障停止運行纹安,數(shù)據(jù)將會先被存儲下來,從而避免數(shù)據(jù)丟失砂豌。這種架構適合于較大集群的解決方案钻蔑,但由于Logstash中心節(jié)點和Elasticsearch的負荷會比較重,可將他們配置為集群模式奸鸯,以分擔負荷咪笑,這種架構的優(yōu)點在于引入了消息隊列機制,均衡了網(wǎng)絡傳輸娄涩,從而降低了網(wǎng)絡閉塞尤其是丟失數(shù)據(jù)的可能性窗怒,但依然存在Logstash占用系統(tǒng)資源過多的問題。
????第三種架構蓄拣,引入了Logstash-forwarder扬虚。首先,Logstash-forwarder將日志數(shù)據(jù)搜集并統(tǒng)一發(fā)送給主節(jié)點上的Logstash球恤,Logstash分析辜昵、過濾日志數(shù)據(jù)后發(fā)送至Elasticsearch存儲,并由Kibana最終將數(shù)據(jù)呈現(xiàn)給用戶咽斧。這種架構解決了Logstash在各計算機點上占用系統(tǒng)資源較高的問題堪置。經(jīng)測試得出,相比Logstash张惹,Logstash-forwarder所占用系統(tǒng)CPU和MEM幾乎可以忽略不計舀锨。另外,Logstash-forwarder和Logstash間的通信是通過SSL加密傳輸宛逗,起到了安全保障坎匿。如果是較大集群,用戶亦可以如結構三那樣配置logstash集群和Elasticsearch集群,引入High Available機制替蔬,提高數(shù)據(jù)傳輸和存儲安全告私。更主要的配置多個Elasticsearch服務,有助于搜索和數(shù)據(jù)存儲效率承桥。但在此種架構下發(fā)現(xiàn)Logstash-forwarder和Logstash間通信必須由SSL加密傳輸德挣,這樣便有了一定的限制性。
????第四種架構快毛,將Logstash-forwarder替換為Beats。經(jīng)測試番挺,Beats滿負荷狀態(tài)所耗系統(tǒng)資源和Logstash-forwarder相當唠帝,但其擴展性和靈活性有很大提高。Beats platform目前包含有Packagebeat玄柏、Topbeat和Filebeat三個產(chǎn)品襟衰,均為Apache 2.0 License。同時用戶可根據(jù)需要進行二次開發(fā)粪摘。這種架構原理基于第三種架構瀑晒,但是更靈活,擴展性更強徘意。同時可配置Logstash 和Elasticsearch 集群用于支持大集群系統(tǒng)的運維日志數(shù)據(jù)監(jiān)控和查詢苔悦。
? ??小結:不管采用上面哪種ELK架構,都包含了其核心組件椎咧,即:Logstash玖详、Elasticsearch 和Kibana。當然這三個組件并非不能被替換勤讽,只是就性能和功能性而言蟋座,這三個組件已經(jīng)配合的很完美,是密不可分的脚牍。究竟該采用哪種架構向臀,可根據(jù)現(xiàn)實情況和架構優(yōu)劣而定。
應用
????在海量日志系統(tǒng)的運維中诸狭,以下幾個方面是必不可少的:
????????? 分布式日志數(shù)據(jù)集中式查詢和管理券膀;
????????? 系統(tǒng)監(jiān)控,包含系統(tǒng)硬件和應用各個組件的監(jiān)控驯遇;
????????? 故障排查三娩;
????????? 安全信息和事件管理;
????????? 報表功能妹懒;
????ELK組件各個功能模塊如下圖所示雀监,它運行于分布式系統(tǒng)之上,通過搜集、過濾会前、傳輸好乐、儲存,對海量系統(tǒng)和組件日志進行集中管理和準實時搜索瓦宜、分析蔚万,使用搜索、監(jiān)控临庇、事件消息和報表等簡單易用的功能反璃,幫助運維人員進行線上業(yè)務的準實時監(jiān)控、業(yè)務異常時及時定位原因假夺、排除故障淮蜈、程序研發(fā)時跟蹤分析Bug、業(yè)務趨勢分析已卷、安全與合規(guī)審計梧田,深度挖掘日志的大數(shù)據(jù)價值。同時Elasticsearch提供多種API(REST JAVA PYTHON等API)供用戶擴展開發(fā)侧蘸,以滿足其不同需求裁眯。
????匯總ELK組件在大數(shù)據(jù)運維系統(tǒng)中,主要可解決的問題如下:
????????? 日志查詢讳癌,問題排查穿稳,上線檢查;
????????? 服務器監(jiān)控晌坤,應用監(jiān)控司草,錯誤報警,Bug管理泡仗;
????????? 性能分析埋虹,用戶行為分析,安全漏洞分析娩怎,時間管理搔课;
? ??小結:ELK組件在大數(shù)據(jù)運維中的應用是一套必不可少的且方便、易用的開源解決方案截亦。