1. 程式人生 > >民生銀行:我們的 ELK 日誌分析平臺

民生銀行:我們的 ELK 日誌分析平臺

民生銀行

作者簡介

詹玉林

民生銀行系統管理中心資料庫運維工程師。曾作為研發工程師開發過銀行核心系統,IBM資料庫支援工程師,現關注於大資料的實時解決方案。

前言:

隨著計算機技術的不斷髮展,現實生活中需要處理的資料量越來越大,越來越複雜,對實時性的要求也越來越高。為了適應這種發展,產生了很多大資料計算框架,例如:hadoop、spark等。

尤其在運維監控領域,不同的計算機系統不斷產生大量的指標資料,對於這些資料需要及時收集,實時分析,發現異常,為運維部門高效運維提供幫助。同時由於資料種類繁多、用於統計的維度也非常多樣,這要求使用的統計工具要非常靈活,學習門檻要低,實施週期要短。

ELK stack為我們提供了這樣一種選擇,使每個人都能夠容易掌握,使需要專業技能才能開發的監控、運維繫統不再遙不可及。

大家都可以參與到運維監控系統的建設中,更好地監控、運維相關係統,真正實現高效、視覺化運維。

1.工作中的現實問題

  • 需要對系統執行的各種指標實時進行監控,及時發現各種異常
  • 需要對各類指標進行多維度分析展現(圖、表)
  • 需要對各種資料進行長期有效儲存用於後期分析(容量、效能、對比等)
  • 需要處理多種資料(結構化、非結構化)
  • 需要對日誌文字資料進行全文檢索(精確搜尋、相似搜尋)
  • 需要對大量資料進行處理,通常達到TB或PB級別
  • 需要根據各個系統不同特點滿足各種個性化的需求
  • 需要比較低的開發成本,學習門檻。每個人都可以按照自己的需求進行開發,無需專業人員協助。開發週期短。
  • 需要有一定的機器學習功能,能夠從大量的資料中發現規律,對於不符合規律的現象進行提示,從而實現提前預警。從一定程度上避免被動處理問題。

推廣開來,相似的方法同樣適用於對任意有價值資料的分析。實時總結髮現海量資料處理中的內在規律,為作出正確的決策提供依據。

2. ELKstack解決方案

2.1   介紹

ELK Stack是Elastic的三個開源產品 – Elasticsearch,Logstash和Kibana的集合。 Elasticsearch是基於Lucene搜尋引擎的NoSQL資料庫。

Logstash是一個日誌管道工具,可接受來自各種來源的輸入,執行不同的轉換,進行一些資料預處理的工作,並將資料匯出到各種目標。 Kibana是一個在Elasticsearch之上工作的視覺化層。

這三種不同的開放原始碼產品最常用於IT環境中的日誌分析(儘管ELK Stack有更多的用例,包括商業智慧,安全性和合規性以及Web分析)。 Logstash收集和解析日誌,然後Elasticsearch索引並存儲資訊。然後,Kibana在視覺化中呈現資料,從而為自己的環境提供可行的思路。

總而言之,Logstash負責資料收集、傳輸、預處理。Elasticsearch負責資料儲存、分析。Kibana負責資料展現。這三者的有機結合為大資料實時、視覺化處理提供了完整的解決方案。

 ELKstack

2.2   特點

檢索效能高效。實時快速

叢集線性擴充套件。海量資料

資料安全保障。安全可靠

處理方式靈活。多種介面

配置簡易上手。敏捷開發

對比

  • VS Apache Hadoop,Spark

Apache Hadoop,Spark和ElasticSearch在一些用法中確實有一些重疊。也就是說,基本上是每個框架都想要提供大資料的一瞥,結果是各種技術都模糊不清,也變得混亂。

Hadoop / Spark可以在HDFS中儲存JSON檔案進行分析和處理,ElasticSearch還可以儲存JSON檔案進行搜尋和多面搜尋。每個工具仍然有一個適合他們的地方。

Elasticsearch已經開始擴充套件超出搜尋引擎,並添加了一些分析和視覺化功能,但仍然是其核心,它仍然主要是全文搜尋引擎,並且作為查詢的一部分,為複雜的計算和聚合提供了較少的支援。雖然統計方面提供了一些能夠檢索計算的統計資訊,但僅限於給定查詢的範圍。

如果我們正在尋找一組文件並使用facet應用一些統計資訊,那麼Elasticsearch是更好的方法。 Elasticsearch在Web分析領域越來越受歡迎,其開源的Logstash用於伺服器端日誌採集和開源視覺化工具Kibana。

Apache Hadoop是靈活和強大的環境,Spark也源於Hadoop。例如,通過HDFS的Hadoop儲存抽象,任何任意任務可以使用MapReduce API,Hive,HBase,Pig,Sizzle,Mahout,RHadoop等對資料進行執行。

Elasticsearch提供了越來越多的聚合分析工具(Bucketing,Metric,Matrix,Pipeline),不需要通過專業的程式碼開發就可以實現對於大量資料的近實時分析。

  • VS傳統關係型資料庫

關係型資料庫被明確設計—毫不意外—用來進行關聯關係管理:

每個實體(或行,在關係世界中)可以被主鍵唯一標識。

實體規範化(正規化)。唯一實體的資料只儲存一次,而相關實體只儲存它的主鍵。只能在一個具體位置修改這個實體的資料。

實體可以進行關聯查詢,可以跨實體搜尋。

單個實體的變化是原子的,一致的,隔離的,和持久的。(可以在 ACID Transactions 中檢視更多細節。)

大多數關係資料庫支援跨多個實體的 ACID 事務。

但是關係型資料庫有其侷限性,包括對全文檢索有限的支援能力。實體關聯查詢時間消耗是很昂貴的,關聯的越多,消耗就越昂貴。特別是跨伺服器進行實體關聯時成本極其昂貴,基本不可用。但單個的伺服器上又存在資料量的限制。

Elasticsearch ,和大多數 NoSQL 資料庫類似,是扁平化的。索引是獨立文件的集合體。文件是否匹配搜尋請求取決於它是否包含所有的所需資訊。

Elasticsearch 中單個文件的資料變更是 ACID 的,而涉及多個文件的事務則不是。當一個事務部分失敗時,無法回滾索引資料到前一個狀態。
扁平化有以下優勢:

  • 索引過程是快速和無鎖的。
  • 搜尋過程是快速和無鎖的。
  • 因為每個文件相互都是獨立的,大規模資料可以在多個節點上進行分佈。

但關聯關係仍然非常重要。某些時候,我們需要縮小扁平化和現實世界關係模型的差異。通常都需要結合其中的某幾個方法來得到最終的解決方案:全文檢索;對海量資料的實時處理;線性擴充套件;高容錯性。

2.3   Logstash

ELK Stack的一個很好的用途是日誌和其他時間序列資料的儲存,視覺化和分析。 Logstash是從源到Elasticsearch的資料工作流程的組成部分。它不僅允許您從各種來源中提取資料,還可以是為您提供過濾,預處理和規範化資料的工具,使其更易於使用。

Logstash在安裝完成好以後,主要工作就是編寫配置檔案。

配置檔案分為三個部分:input,filter,output。在每個部分都包含豐富的plugin可以滿足不同的功能需要。

input 定義輸入,file為輸入的檔案,可以有多個。除file外,還有stdin、TCP、 syslog、collectd等。

filter 過濾配置,可以將日誌整理成自己想要的格式,在這個部分實現對於資料的預處理。logstash有豐富的過濾外掛,date處理、grok正則捕獲、mutate、GeoIP、JSON編碼、key-value切分,對於複雜的操作可以藉助ruby的強大處理等等。

grok是logstash最重要的外掛,在grok中定義好正在表示式,可以在其他地方引用它。語法這裡不過多介紹,需要可以自己從網上學習。

例如:

 Logstash

對於grok的使用可以使用下來資源:

https://raw.githubusercontent.com/logstash-plugins/logstash-patterns-core/master/patterns/grok-patterns

https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns

http://grokdebug.herokuapp.com/
kibana 5自帶grok debugger

output 定義輸出目的地。logstash的輸出也有多種,標準輸出,輸出到elasticsearch,redis,kafka等等,可以同時指定多個輸出,stdout方便除錯,檢視實時的日誌。輸出到es說明:hosts 為es的ip和埠;index為索引名稱,按日期分方便管理。

存在的問題:底層使用ruby實現,佔用JVM較大,系統資源消耗較大,效能方面不是很好,除錯、跟蹤困難,異常處理困難等。

為了解決上述問題ELKstack新版本(5.0以上)開發了大量專業的beat,以大量輕量級的beat部署在資料來源端,只負責資料的ship,大量後續的資料解析、分析、預處理等工作放到統一的後端來處理。

如果在不需要logstash完全、複雜處理功能的情況下,可以使用ingest node的processor來進行相關資料預處理,這種組合將極大地提高資料處理的效率,降低了對前端系統的影響。(在某些場景下ingest node的處理能力是logstash的十倍以上)

Ingest node與logstash的對比:
https://sematext.com/blog/2016/04/25/elasticsearch-ingest-node-vs-logstash-performance/

2.4   ElasticSearch

Elasticsearch是一個NoSQL資料庫。這意味著它以非結構化的方式儲存資料,並且不能使用SQL來查詢資料(為適應大量傳統資料庫使用者,後續版本也會提供SQL解析層)。

與大多數NoSQL資料庫不同,Elasticsearch非常重視搜尋功能 – 實際上,從Elasticsearch獲取資料的最簡單方法是使用REST API(Representational state transfer)進行搜尋。

Elasticsearch是整個ELK stack的核心,所有其他功能元件都是圍繞著它來工作的。它對資料處理提供了豐富的介面API,可以輕鬆的實現對資料的CRUD(Create, Read, Update, and Delete)操作。

對資料搜尋提供了兩大類搜尋功能:精確搜尋和全文檢索(根據相似度、匹配度),在搜尋功能中包含強大的資料分析、聚合功能。通過特有的資料查詢語言DSL(Domain SpecificLanguage)可以滿足各種查詢需要。

2.5   Kibana

Kibana是ELK Stack的視覺化層,它是最流行的日誌分析平臺,建立在Elasticsearch,Logstash之上。

Kibana是一個開源分析和視覺化平臺,旨在與Elasticsearch合作。它將您的處理請求轉化為具體的DSL語句(降低對於DSL語言的使用門檻),傳送給ES伺服器獲取查詢結果,然後將查詢結果以視覺化的方式展現給你。通過這種方式您可以輕鬆地執行高階資料分析,並可在各種圖表,表格和地圖中直觀地顯示資料。

Kibana可以輕鬆解析大量資料。其簡單的基於瀏覽器的介面使您能夠快速建立和共享動態儀表板,實時顯示對於ES查詢的變化。

安裝好Kibana後,您可以在幾分鐘內開始探索您的Elasticsearch索引 – 無程式碼,無需額外的基礎架構。

2.5.1    基本概念

1、Discover

在進行任何資料探索之前,需要首先了解你的資料:組成、型別、範圍、資料分佈等。所有這些操作你可以在discover頁面上互動式地完成。

你可以提交任何查詢、過濾條件,你可以觀察資料是如何匹配你所提供的條件的。        對於已經滿足您要求的查詢,你可以儲存下來供下次使用,或供visualize使用。

2、Visualize

這是對基於ES所儲存的資料,按照你所提供的查詢條件和分析方法,用圖形的方式對結果進行展現。

通過各種直方圖、折線圖、餅圖等圖形能夠直觀地顯示資料的變化趨勢、組成佔比、不同資料的對比等資訊。

3、Dashboard

將已經生成好的單個visualization有機地組合成一個個看板,便於使用者更直觀、快速地發現各個圖表間的差異,快捷地根據資訊作出正確判斷。在這裡還可以根據需要臨時輸入各種條件對各圖表所展示的內容進行調整,以突出某個資料。

2.5.2    基本操作

Discover

Discover

Visualize

Visualize

Dashboard

Dashboard

2.5.3    Timelion對於時間序列資料的分析舉例

舉例1:展示不同時段的CPU使用率資料對比

CPU

過程如下:

—顯示使用者cpu的平均使用率

.es(index=metricbeat-*,  timefield=’@timestamp’,
metric=’avg:system.cpu.user.pct’)

—同時顯示一個小時之前的對比資料

.es(index=metricbeat-,  timefield=’@timestamp’,
metric=’avg:system.cpu.user.pct’), .es(offset=-1h,index=metricbeat-
,
timefield=’@timestamp’, metric=’avg:system.cpu.user.pct’)

—對不同的資料進行區別標識

.es(offset=-1h,index=metricbeat-,  timefield=’@timestamp’,
metric=’avg:system.cpu.user.pct’).label(‘last hour’),
.es(index=metricbeat-
, timefield=’@timestamp’,
metric=’avg:system.cpu.user.pct’).label(‘current hour’)

—增加標題
—改變系列型別
—改變一系列的顏色和不透明度
—修改圖例
—增加標題

.es(offset=-1h,index=metricbeat-,  timefield=’@timestamp’,
metric=’avg:system.cpu.user.pct’).label(‘last hour’),
.es(index=metricbeat-
, timefield=’@timestamp’,
metric=’avg:system.cpu.user.pct’).label(‘current hour’).title(‘CPU
usage over time’)

—設定填充和寬度

.es(offset=-1h,index=metricbeat-,  timefield=’@timestamp’,
metric=’avg:system.cpu.user.pct’).label(‘last
hour’).lines(fill=1,width=0.5),  .es(index=metricbeat-
,
timefield=’@timestamp’,
metric=’avg:system.cpu.user.pct’).label(‘current hour’).title(‘CPU
usage over  time’)

—設定不同的顏色

.es(offset=-1h,index=metricbeat-,  timefield=’@timestamp’,
metric=’avg:system.cpu.user.pct’).label(‘last
hour’).lines(fill=1,width=0.5).color(gray), .es(index=metricbeat-
,
timefield=’@timestamp’,
metric=’avg:system.cpu.user.pct’).label(‘current  hour’).title(‘CPU
usage over time’).color(#1E90FF)

—設定圖示顯示的列數和位置

.es(offset=-1h,index=metricbeat-,  timefield=’@timestamp’,
metric=’avg:system.cpu.user.pct’).label(‘last
hour’).lines(fill=1,width=0.5).color(gray), .es(index=metricbeat-
,
timefield=’@timestamp’,
metric=’avg:system.cpu.user.pct’).label(‘current  hour’).title(‘CPU
usage over time’).color(#1E90FF).legend(columns=2, position=nw)

展示效果:

舉例2:展示網路流量變化

過程如下:

—網路流量增長量

.es(index=metricbeat*,  [email protected],
metric=max:system.network.in.bytes)

—關注網路流量的變化量會更有價值,derivative

es(index=metricbeat*,  [email protected],
metric=max:system.network.in.bytes).derivative()

—同時顯示網路流入和流出量,通過算術運算獲得,multiply()

.es(index=metricbeat,  [email protected],
metric=max:system.network.in.bytes).derivative(),
.es(index=metricbeat
, [email protected],
metric=max:system.network.out.bytes).derivative().multiply(-1)

—為了更好地閱讀,將位元組轉換為MB,divide

es(index=metricbeat,  [email protected],
metric=max:system.network.in.bytes).derivative().divide(1048576),
.es(index=metricbeat
, [email protected],
metric=max:system.network.out.bytes).derivative().multiply(-1).divide(1048576)

—根據前面所學加上標題、填充、顏色、圖示等資訊

.es(index=metricbeat,  [email protected],
metric=max:system.network.in.bytes).derivative().divide(1048576).lines(fill=2,
width=1).color(green).label(“Inbound traffic”).title(“Network  traffic
(MB/s)”), .es(index=metricbeat
, [email protected],
metric=max:system.network.out.bytes).derivative().multiply(-1).divide(1048576).lines(fill=2,
width=1).color(blue).label(“Outbound traffic”).legend(columns=2,
position=nw)

文章來自微信公眾號:高效運維