1. 程式人生 > >使用Logstash + Elasticsearch作為大資料索引、分析工具

使用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]的方式引用。

最後來張效果圖: