閱讀840 返回首頁    go 阿裏雲 go 技術社區[雲棲]


ELK統一日誌係統的應用

收集和分析日誌是應用開發中至關重要的一環,互聯網大規模、分布式的特性決定了日誌的源頭越來越分散,

產生的速度越來越快,傳統的手段和工具顯得日益力不從心。在規模化場景下,grep、awk 無法快速發揮作用,我們需要一種高效、靈活的日誌分析方式,可以給故障處理,問題定位提供更好的支持。基於全文搜索引擎 Lucene 構建的 ELKstack 平台,是目前比較流行的日誌收集方解決方案。

ELK係統的部署按照官方文檔操作即可,相關資料也很多,這篇文章更多的關注三個組件的設計和實現,幫助大家了解這個流行的日誌收集係統,

 

ELK統一日誌係統

結合Logstash,ElasticSearch和Kibana三個組件,可以搭建一套高效的日誌收集和分析係統。

ELK日誌係統數據流圖

ELK stack支持組件間的靈活組合,提供強大的開箱即用的日誌收集和檢索功能。

可以看到ELK係統進行日誌收集的過程可以分為三個環節:

  • 日誌收集和導入ElasticSearch
  • ElasticSearch進行索引等處理
  • 可視化操作,查詢等

Logstash可以結合Redis或者kafka等收集應用服務器產生的日誌,經過簡單的過濾等操作後發送到ElasticSearch,ElasticSearch進行相關的索引處理,最後在Kibana進行相關的可視化操作。

 

Logstash進行日誌采集

Logstash 是一種功能強大的信息采集工具,類似於同樣用於日誌收集的 Flume。

Logstash通過配置文件規定 Logstash 如何處理各種類型的事件流,一般包含 input、filter、output 三個部分。

Logstash 為各個部分提供相應的插件,通過 input、filter、output 三類插件完成各種處理和轉換,

另外 codec 類的插件可以放在 input 和 output 部分通過簡單編碼來簡化處理過程。

1.Logstash架構

Logstash使用Jruby語言編寫,對於使用者來講,Logstash本身是基於命令行界麵,麵向任務處理的。

Logstash的軟件架構是一種帶有“管道-過濾器”風格的插件式架構,作為一個開源軟件,Logstash遵循Apache 2.0進行開源,第三方社區為其貢獻了大量插件。

 

 

這張數據流圖來自官方社區,可以看到Logstash的運行時數據處理會經曆三個階段:

  • 輸入階段 接受不同來源的數據流入,可以配置codec插件進行簡單的處理。

  • 過濾階段 對流入數據進行過濾等操作,傳遞給output,其中“輸入”與“輸出”是必須有的,“過濾”階段是可選的。

  • 輸出階段 將數據傳遞到消息隊列,文件係統等進行進一步處理,在ELK的日誌係統中,輸出到ElasticSearch索引中。

三個階段的處理任務是異步的,不存在跨階段任務執行與同一個線程中的情況。

 

2.Logstash如何應用

Logstash可以通過指定配置文件直接啟動,下麵是一份典型的配置示例:

1
2
3
4
5
6
7
8
9
# 讀取access.log日誌並輸出到控製台<br>input {
     filex {
        path => ["/Users/bingyue/Work/workspace/access.log"]
    }
}
output {
    stdout {
    }
}

 

 

ElasticSearch的設計和應用

ElasticSearch是一個開源搜索服務器項目,2010年2月發布至今,該項目已發展成為搜索和數據分析解決方案領域的主要一員。ES的實現和應用包括非常多的內容,這裏我們隻簡單了解,從整體架構入手,做到對ES有一個初步的認識。

 

1.ElasticSearch架構

ElasticSearch基於Apache Lucene實現,Lucene是一個成熟的、高性能並且可擴展的搜索引擎包, ElasticSearch在Lucene之上封裝了索引,查詢,以及分布式相關的接口。

 

2.Elasticsearch概念

  • 節點(Node)和集群(Cluster)

節點是集群中的一個 Elasticearch 實例。 集群是一組擁有共同的 cluster name 的節點。其中一個節點就是一個 ES 進程,多個節點組成一個集群。一般每個節點都運行在不同的操作係統上,配置好集群相關參數後 ES 會自動組成集群。集群內部通過 ES 的選主算法選出主節點,而集群外部則是可以通過任何節點進行操作,無主從節點之分,對外表現對等,去中心化,有利於客戶端編程。

  • 索引 Index

索引在ES中索引有兩層含義, 作為動詞,它指的是把一個文檔保存到 ES 中的過程,索引一個文檔後,我們就可以使用 ES 搜索到這個文檔; 作為名詞,它是指保存文檔的地方,相當於關係數據庫中的database概念,一個集群中可以包含多個索引。

  • 分片 shard

ES 是一個分布式係統,它保存索引時會選擇適合的“主分片”(Primary Shard),把索引保存到其中(我們可以把分片理解為一塊物理存儲區域)。分片的分法是固定的,而且是安裝時候就必須要決定好的(默認是 5),後麵就不能改變了。

既然有主分片,那肯定是有“從”分片的,在 ES 裏稱之為“副本分片”(Replica Shard)。副本分片主要有兩個作用: 高可用:某分片節點掛了的話可走其他副本分片節點,節點恢複後上麵的分片數據可通過其他節點恢複 負載均衡:ES 會自動根據負載情況控製搜索路由,副本分片可以將負載均攤

  • RESTful支持

ES支持RESTful訪問,並且 ES 的 HTTP 接口不隻是可以進行業務操作(索引/搜索),還可以進行一些配置等。

 

下麵介紹幾個很常用的接口:

/_cat/nodes?v:查集群狀態

/_cat/shards?v:查看分片狀態

/${index}/${type}/_search:搜索

我們也可以直接在所有索引所有類型上進行搜索:/_search。

除了上麵這些,ES官方社區還給出了一些關鍵術語解釋:

 

  • document 文檔

一個文檔就是一個保存在 es 中的 JSON 文本,可以把它理解為關係型數據庫表中的一行。每個文檔都是保存在索引中的,擁有一種類型和 id。一個文檔是一個 JSON 對象(一些語言中的 hash / hashmap / associative array)包含了 0 或多個字段(鍵值對)。原始的 JSON 文本在索引後將被保存在 _source 字段裏,搜索完成後返回值中默認是包含該字段的。

  • id

Id 是用於標識文檔的,一個文檔的索引/類型/id 必須是唯一的。文檔 id 是自動生成的(如果不指定)。

  • field 字段

一個文檔包含了若幹字段,或稱之為鍵值對。字段的值可以是簡單(標量)值(例如字符串、整型、日期),也可以是嵌套結構,例如數組或對象。一個字段類似於關係型數據庫表中的一列。每個字段的映射都有一個字段類型(不要和文檔類型搞混了),它描述了這個字段可以保存的值類型,例如整型、字符串、對象。映射還可以讓我們定義一個字段的值如何進行分析。

  • mapping 映射

一個映射類似於關係型數據庫中的模式定義。每個索引都存在一個映射,它定義了該索引中的每一種類型,以及索引相關的配置。映射可以顯示定義,或者在文檔被索引時自動創建。

3.ElasticSearch的應用場景

ElasticSearch的應用場景主要發揮其強大的全文搜索功能,因為良好的分布式支持,一些公司也會使用ES作為文檔型數據庫,類似MongoDB等的應用。

  • 全文搜索 應用最為廣泛,ES加上分詞插件、拚音插件什麼的可以做成強大的全文搜索引擎
  • 數據庫存儲 主要關注ES的強大統計分析匯總能力,再加上分布式擴展能力
  • 在線統計分析引擎,日誌係統 結合logstash等組件,可以實時動態分析數據

 

Kibana進行可視化分析

Kibana應用在ElasticSearch之上,提供可視化的數據查詢和分析等功能, 主要的版本有Kibana 3和Kibana 4,兩者在設計上區別較大,這裏主要介紹k4的應用。

要使用Kibana,就得告訴它想要探索的 Elasticsearch 索引是那些,需要配置一個或者多個索引模式。 默認情況下,Kibana 認為你要訪問的是通過 Logstash 導入 Elasticsearch 的數據,這時候使用默認的 logstash-* 作為index pattern。 Kibana 數據展示需要一個包含了時間戳的索引字段,用來做基於時間的處理,如果是由logstash導入的日誌,使用默認的@timestamp即可。

連接到Elasticsearch以後,就可以使用kibana進行數據的分析。

kibana的麵板支持以下的功能:

  • 在 Discover 頁搜索和瀏覽數據
  • 在 Visualize 頁轉換數據成圖表
  • 在 Dashboard 頁創建定製自己的儀表板

1.搜索和瀏覽數據

Discover 標簽頁用於交互式探索數據。可以訪問到匹配得上選擇的索引模式的每個索引的每條記錄。可以提交搜索請求,過濾搜索結果,然後查看文檔數 據。還可以看到匹配搜索請求的文檔總數,獲取字段值的統計情況。如果索引模 式配置了時間字段,文檔的時序分布情況會在頁麵頂部以柱狀圖的形式展示出來。

kibana支持Lucene格式的檢索方式。包括:

(1)簡單的文本搜索,直接輸入文本字符串。

比如,如果在搜索網站服務器日誌,可以輸入exception來搜索各字段中的exception單詞。 

(2)搜索特定字段中的值,

搜索特定字段中的值,則在值前加上字段名。比如,可以輸入 status:200 來限製搜索,要搜索一個值的範圍,可以用範圍查詢語法,

(3)使用連接條件進行複雜搜索

要指定更複雜的搜索標準,可以用布爾操作符AND, OR和 NOT 。 

2.數據轉換成圖表

Visualize 標簽頁用來設計可視化。 支持各種圖表進行展示。

數據源可以選擇新建或者讀取一個已保存的搜索。搜索是和一個或者一係列索引相關聯的。如果選擇了在一個配置了多個索引的係統上開始新搜索,從可視化編輯器的下拉菜單裏選擇一個索引模式。

3.自定義儀表盤

Kibana dashboard 能支持自由排列一組已保存的視圖。然後可以保存這個儀表板,用來分享或者重載。

(1)創建新的儀表盤

第一次點擊 Dashboard 標簽的時候,Kibana 會顯示一個空白的儀表板。 通過添加可視化的方式來構建儀表板。

要添加視圖到儀表板上,點擊工具欄麵板上的 Add。從列表中選擇一個已保存的視圖。可以在 Visualization Filter 裏輸入字符串來過濾想要找的視圖。 你選擇的這個視圖會出現在儀表板上的一個容器(container)裏。

(2)修改儀表盤信息

儀表板裏的可視化都存在可以調整大小的容器裏,點擊容器右上角的 Edit 按鈕在 Visualize 頁打開可視化編輯。

 

以上是關於ELK組件的介紹,在具體的日誌係統搭建中,有很多細節需要注意。另外隨著容器化部署的興起,日誌收集的方式也變的更多樣化,後麵會分享下關於ELK結合容器內日誌收集的方案。

最後更新:2017-04-12 12:30:31

  上一篇:go 數據挖掘之數據準備——時間相關數據
  下一篇:go Nginx學習之負載均衡fair模塊