使用ElasticSearch搭建日誌系統

如果:

? 你有很多台機器

? 你有各種各樣的Log

只要滿足這兩個條件其中之一,那麼一套日誌系統是很有必要的。優秀的日誌系統可以讓你及時發現問題,輕鬆追查故障原因,進而提高生產力。

本文簡單介紹一下怎麼用Elastic Search全家桶搭出一套日誌系統。Elastic Search全家桶幾乎可以說,就是設計出來干這個事的:

讓我們來研究一下全家桶的每個成員:

? Beats

官方定義是"Data Shippers for Elasticsearch",還來個slogan叫"Collect, Parse & Ship",說得雲里霧裡的。其實說白了,就是數據採集。

Beats是一系列叫XXXbeat的小工具,最常用的是Filebeat。這套東西原先是Logstash的一個模塊,後來單獨拆了出來,又根據不同的功能衍生了幾個分支。

Filebeat是個很輕量級的工具,主要干這麼三件事:

? 監聽本機指定日誌文件的新增條目,類似`tail -f`

? 做最原始的過濾和處理

? 懟去Logstash,或者Elastic Search,又或者其他地方

go語言寫的(好評)。安裝出來,你會發現這套工具異常簡單粗暴。一個可執行文件,一個配置文件,沒了。

? Logstash

官方定義是"Process Any Data, From Any Source",這個很清晰很好,問題是slogan叫"Collect, Enrich & Transport Data"。大哥你的Collect關鍵詞跟Beats兄弟重了啊!

Logstash是用來做數據處理的(也可以用來做數據採集,我相信這是歷史原因導致的),功能非常強大。它敢吹"Process Any Data, From Any Source"是有道理的,因為官方文檔上,目前(20160924)支持的數據源有:

"beats couchdb_changes drupal_dblog elasticsearch exec eventlog file ganglia gelf generator graphite github heartbeat heroku http http_poller irc imap jdbc jmx kafka log4j lumberjack meetup pipe puppet_facter relp rss rackspace rabbitmq redis salesforce snmptrap stdin sqlite s3 sqs stomp syslog tcp twitter unix udp varnishlog wmi websocket xmpp zenoss zeromq"

支持輸出到:

"boundary circonus csv cloudwatch datadog datadog_metrics email elasticsearch elasticsearch_java exec file google_bigquery google_cloud_storage ganglia gelf graphtastic graphite hipchat http irc influxdb juggernaut jira kafka lumberjack librato loggly mongodb metriccatcher nagios null nagios_nsca opentsdb pagerduty pipe riemann redmine rackspace rabbitmq redis riak s3 sqs stomp statsd solr_http sns syslog stdout tcp udp webhdfs websocket xmpp zabbix zeromq"

至於數據處理本身,功能也是有夠多的,我就不貼了。實在不滿意,還可以自己擼袖寫插件。

? Kibana

"See the Value in Your Data""Explore & Visualize Your Data"。有點被營銷加工過的味道。

Kibana這玩意,我一開始是為了用ES的Marvel插件看集群運行狀態而裝的。第一感覺是,ES全家桶怎麼一個綁一個,真麻煩。跑通後閑置了一段時間,之後偶然來玩了下Kibana本身的功能,就發現...挺厲害啊。

Kibana出報表的整個流程分為3步:

? 第一步:寫query,在Elastic Search里搜出一批數據

? 第二步:使用搜出來的數據,創建圖表

? 第三步:拼接多個圖表,做成一個報表

建什麼報表,就是看使用者的想像力了。我一開始是做了搜索相關的報表,像是最近一小時熱搜關鍵詞,最近一小時緩存命中率什麼的。後來發現,Kibana的潛力真是無窮無盡。

Kibana加上Elastic Search,可以做實時數據分析。而且因為Elastic Search本質是個高性能搜索引擎,所以出數據很快

現在讓我們把這幾個成員組裝到一起。

可以看到,Beats + Logstash + Elastic Search + Kibana,可以做一套非常強大的日誌系統。

官方給的圖:

一套日誌系統,高可用,可橫向擴展,高自定義,出來的圖表還好看,你說吼不吼啊!

具體怎麼組裝ES全家桶的,還是推薦各位上官網看文檔,或者搜其他教程,或者直接把全家桶download下來把玩。畢竟日誌系統裡面最核心的ES索引設計,是跟著具體業務走的。本文提供一些經驗:

? 不一定全家桶都要用

在數據量不大、或者做抽樣的時候,完全可以不用Beats和Logstash,數據直接用HTTP RESTful介面懟Elastic Search。如果是一些監控類的腳本,可以直接在shell里一句curl搞定,非常適合運維同學使用。

? 大數據量下的配置

數據量到了一定規模的時候,全家桶組合拳會開始體現價值。

Beats是簡單高可用的,瓶頸一般會出現在Logstash(吃CPU)和Elastic Search(吃磁碟IO)上。Logstash好辦,而Elastic Search在加機器的時候如果分片數量過少,會影響效果。所以建議一開始就給索引(index)配置較大的分片數量(shards)。

Elastic Search的ttl屬性有點問題,如果要按時間分片的話,建議直接從索引這一層來操刀。例如搜索日誌的索引名字就叫search-log-20160924。自己造個輪子,定時創建新的索引、刪除過期的索引。

? 能不能不用Elastic Search

當然可以,Beats跟Logstash單獨拿出來用也是很不錯的工具。數據存儲和分析未必要走-> ES -> Kibana這條路。可以感受到,Elastic Search逐漸成為Elastic Stack的概念了,不僅僅是搜索,而是整套數據解決方案。


推薦閱讀:

ElasticSearch優化系列一:集群節點規劃
使用ElasticSearch踩過的坑
Elasticsearch 5:集群設置與管理(第二篇)
從Elasticsearch來看分散式系統架構設計
Elasticsearch與Solr的選擇?

TAG:Elasticsearch | 数据分析 | 运维 |