使用Logstash + Elasticsearch作為大資料索引、分析工具
logstash(1.4.0)是一個不錯的日誌監控與分析工具,資料通過logstash使用後端的ElasticSearch(1.1.1)叢集完成資料索引,以供後續的查詢、分析使用。
logstash提供了一個geoip的filter,如果傳送的事件資料中有IP地址之類的資料,就可以通過這個過濾器將對應的國家、城市等資訊新增到資料中,為以後的上卷或下鑽操作提供資料基礎。我們的應用場景是這樣的:
A Python Producer => Redis 訊息佇列(logstash input,預設支援)=> Filter(geoip,預設支援)=> ElasticSearch叢集 => Kibana3
1. 搭建ES叢集
其中,ES叢集的搭建是非常簡單的,裝好JDK1.7之後(並設定好JAVA_HOME, PATH等環境變數),只需要下載官方軟體包(elasticsearch-1.1.1.tar.gz)解壓即可啟動,具體啟動命令:
bin/elasticsearch -d
在預設配置下,在區域網中啟動多個這樣的例項,就可以自動組建一個ES叢集了,這個叢集是去中心化的,非常簡單。
2. 安裝Kibana3
這實際上就是ES叢集的一個查詢引擎,也可以說是一層皮,其預設的配置(安裝路徑/config.js )中,只需要關心: elasticsearch: "http://"+window.location.hostname+":9200", 即可,不過如果你是在ES叢集中的一個節點上部署的kibana,那麼預設的配置就可以完美工作。Kibana3實際上就是純粹的Javascript和CSS程式碼,只需要在Nginx設定一下對應的虛擬主機,使之能夠訪通過web訪問即可,以下是我的Nginx配置:
# # The default server # server { listen 8080 default_server; server_name _; #charset koi8-r; location / { root /opt/kibana; index index.html index.htm; } error_page 404 /404.html; location = /404.html { root /usr/share/nginx/html; } # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
這樣,在重新載入Nginx配置之後,就可以通過訪問伺服器的8080埠來訪問到kibana的頁面了。
3。 配置logstash
logstash的配置主要分成以下幾個部分: input, codec, filter, output(具體請參見:http://logstash.net/docs/1.4.1/)。
顧名思義,input就是logstash的輸入端,這個埠可以是一個佇列,一個檔案,標準輸出也可以;codec就是資料的編碼格式,logstash自己實現了多種編碼格式,不過我們比較常用的還是JSON格式;filter就是資料過濾器,在這裡我們可以過濾掉我們不想要的資料,或者為資料新增某些欄位,比如我們這裡要geoip;output一般是到Elasticsearch,不過logstash也提供了多種輸出。
在我們的應用場景下,我們使用如下的配置啟動logstash即可:
input {
redis {
host => "a00"
port => "6379"
key => "events"
data_type => "list"
codec => "json"
type => "logstash-redis-demo"
tags => ["logstashdemo"]
}
}
filter {
geoip {
source => "[extra][ip]"
add_tag => [ "geoip" ]
}
}
output {
elasticsearch {
host => "a01"
flush_size => 10240
}
}
我們從一個redis佇列(a00:6379)中獲取資料,通過geoip過濾器,從ip資訊得到對應的地理位置資訊之後,最後將資料匯入到elasticsearch叢集中,對資料做索引。其中需要注意的是,對於巢狀欄位的引用方式是:[parent][child]的方式引用。
最後來張效果圖: