Elasticsearch、Logstash和Kibana簡介與部署

ELK簡介

ELK由Elasticsearch、Logstash和Kibana三部分組件組成。
Elasticsearch是個開源分佈式搜索引擎,它的特點有:分佈式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。
簡單來說,他是個全文搜索引擎,可以快速地儲存、搜索和分析海量數據。
Elastic也可以理解爲是一個分佈式數據庫,允許多臺服務器協同工作,每臺服務器可以運行多個 Elastic 實例。以文檔方式存儲數據,和mangoDB類似。Elasticsearch、MongoDB和Hadoop比較 這篇文章將Elasticsearch和mongoDB做了比較,可以參考一下
Logstash是一個完全開源的工具,它可以把分散的、多樣化的日誌日誌,或者是其他數據源的數據信息進行收集、分析、處理,並將其存儲供以後使用。
kibana 是一個開源和免費的工具,它可以爲Logstash和 ElasticSearch提供的日誌分析友好的Web界面,可以幫助您彙總、分析和搜索重要數據日誌。
其實,簡單來說,ELK的核心是Elasticsearch,logstash和kibana都是爲Elasticsearch服務的。使用logstash能夠很方便的將其他來源的數據,比如:日誌文件、數據庫等方便的導入到Elasticsearch中。使用kibana可以直觀清晰的展示Elasticsearch中存儲的數據,生成圖表,幫助分析,同時提供控制檯來操作Elasticsearch。
所以說沒有logstash和kibana,Elasticsearch也是能夠正常使用的,只是用的沒那麼方便高效而已。

下載與部署

軟件下載

我們可以從官網獲取安裝包。其實官網很棒,還有中文主頁。官網的文檔很容易理解,例子也很好實現。
elastic官網
Elasticsearch、logstash、kibana下載頁面
歷史版本下載頁面Past Releases
在官網下載自己需要的版本即可,但是最好是三者的版本保持一致,Elasticsearch作爲一個版本多,變化大的恢弘鉅作,我認爲是一羣善變的程序員開發出來的。

部署環境

Mac(linux)、jdk1.8

Elasticsearch部署

解壓之後,首先進行配置。配置文件路徑:/config/elasticsearch.yml。
主要配置:
- cluster.name:集羣名稱,默認則會自動分配
- node.name是節點名稱,默認則會自動分配
- http.port是訪問端口,默認9200。

我的配置如下:

cluster.name: my-application
node.name: node-1

執行以下語句即可啓動Elasticsearch。其中,-d是通過守護進程啓動。

./bin/elasticsearch
./bin/elasticsearch -d

檢測是否啓動成功:

curl 'http://localhost:9200/?pretty'

或者直接在瀏覽器訪問這個地址,就可以顯示類似如下的返回結果:

{
  "name" : "node-1",
  "cluster_name" : "my-application",
  "cluster_uuid" : "Q79rR5mCTICI7UfEcwmDnA",
  "version" : {
    "number" : "5.0.1",
    "build_hash" : "080bb47",
    "build_date" : "2016-11-11T22:08:49.812Z",
    "build_snapshot" : false,
    "lucene_version" : "6.2.1"
  },
  "tagline" : "You Know, for Search"
}

這樣,我們的Elasticsearch就成功啓動了。

kibana部署

解壓kibana之後,首先進行配置。配置文件路徑:config/kibana.yml
主要配置:

  • server.host:kibana的訪問ip地址
  • server.port:kibana的訪問端口,默認5601
  • elasticsearch.url:對應的Elasticsearch地址
  • kibana.index:kibana的index索引名

我的配置如下:

server.host: "localhost"
elasticsearch.url: "http://localhost:9200"
kibana.index: ".kibana"
server.port: 5601

啓動方式和Elasticsearch一樣:

./bin/kibana

瀏覽器訪問http://localhost:9200即可進入kibana首頁。

logstash部署

解壓logstash之後,首先進行配置(怎麼還是這句話……)。哦不能首先配置,我們得先來了解一下logstash的工作原理和具體配置。

工作原理

Logstash使用管道方式進行日誌的蒐集處理和輸出,從輸入到輸出,整個過程包括了三個階段:輸入input –> 處理filter(不是必須的) –> 輸出output,每個階段都可以選擇很多的插件配合工作,比如file、elasticsearch、redis;也可以指定多種方式,比如輸出到Elasticsearch或者輸出控制檯。

配置格式

配置格式要包括整個階段的三部分,所以標準格式如下:

input {...} 
filter {...} 
output {...}

每一部分可以指定多個方式,比如輸入要從控制檯和數據庫輸入,按照如下配置:

input {
    stdin {

    }
    jdbc {
        ...
    }
}

輸出如果是輸出控制檯或者Elasticsearch,按照如下配置:

output {
  elasticsearch {
  hosts => "localhost:9200"
  index => "mysql_accept"
  document_type => "accept"

  }
  stdout {
  codec => json_lines
  }
}

因爲filter的配置不是必須的,所以這裏暫時不表,等後續需要再講解。

常用命令

-f指定Logstash的配置文件,根據配置文件配置logstash並進行啓動:

./logstash -f logstash.conf

-e字符串當做配置啓動,”“則默認控制檯輸入控制檯輸出

./logstash -e ""

-t測試配置文件是否正確並退出

./logstash -t logstash.conf

啓動

上文已經講解了logstash的基本配置以及啓動命令。不過如果我們的logstash只是做從控制檯輸入再從控制檯輸出的工作實在是太沒有意義了。一般的業務需求中,是需要將海量的數據從數據庫中索引到Elasticsearch中的,所以這裏主要介紹一下如何從MySQL和oracle將數據保存到Elasticsearch。Jdbc input plugin是官方文檔對於jdbc插件的介紹,感興趣的話可以看一看,畢竟官方文檔是最權威的。
jdbc的input配置中,以下幾項是比較重要的:

  • jdbc_driver_library:jdbc的依賴包路徑
  • jdbc_driver_class:註冊jdbc驅動。這裏要注意!如果是MySQL則配置爲”com.mysql.jdbc.Driver”,如果是oracle則配置爲”Java::oracle.jdbc.driver.OracleDriver”(這裏筆者找了半天的問題,後來發現官方文檔裏其實有寫)
  • jdbc_connection_string:數據庫連接
  • jdbc_user:數據庫用戶名
  • jdbc_password:數據庫密碼
  • schedule:定時服務配置,多長時間執行一次數據同步,格式爲* * * * *,對應分 時 天 月 年。
  • statement:每次同步時的sql執行語句
  • statement_filepath:如果sql語句寫在文件中,則在這裏配置sql文件的路徑

以下幾項是增量更新的配置。logstash對於數據庫的增兩個更新有兩種控制方式,一種是根據時間,一種是根據自增判斷。執行完一次同步後,logstash會將最後同步的那條記錄的時間或者自增值記錄到文件中,下次同步時則從最新記錄那裏開始執行,記錄值在sql語句中用:sql_last_value作爲替代。
如果是用時間做控制,則sql語句這樣寫:

select * from tablename where update_time>:sql_last_value

如果不配置,則每次都會全量更新,這樣比較浪費資源,所以建議配置:

  • last_run_metadata_path:記錄最後更新值的保存路徑。
  • use_column_value:true或者false。如果是true則使用自增值控制,false則使用時間控制。
  • tracking_column:選擇控制增量更新的字段,對於上面的例子,這裏配置成update_time

對於output到Elasticsearch的配置,最好是配置好數據索引到Elasticsearch的index、type和文檔的id。下面是一個簡單的配置:

output {
  elasticsearch {
  hosts => "localhost:9200"
  index => "my_index"
  document_type => "my_type"
  document_id => "%{id}"
  }
  stdout {
  codec => json_lines
  }
}

其中,index爲同步數據時要保存到的索引,document_type爲要保存到的type,document_id則配置保存成單個文檔的id,%{id}中的id對應sql語句中的主鍵id字段名,同時數據也會輸出到控制檯。
下面是我的一個配置:

input {
  jdbc {
    jdbc_driver_library => "/Users/tinybye/Documents/elk/logstash-5.0.1/lib/mysql-connector-java-5.1.10-bin.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/mysql_logstash"
    jdbc_user => "root"
    jdbc_password => "root"
    schedule => "* * * * *"
    statement => "SELECT id,name,age from person_table where update_time > :sql_last_value"
    last_run_metadata_path => "./logstash_jdbc_last_run"  
    use_column_value => false  
    tracking_column => "submit_time" 
  }
  jdbc {
    jdbc_driver_library => "/Users/tinybye/Documents/elk/logstash-5.0.1/lib/ojdbc6.jar"
    jdbc_driver_class => "Java::oracle.jdbc.driver.OracleDriver"
    jdbc_connection_string => "jdbc:oracle:thin:test/test@//127.0.0.1:1521/orcl"
    jdbc_user => "test"
    jdbc_password => "test"
    schedule => "* * * * *"
    statement_filepath => "/Users/tinybye/Documents/elk/logstash-5.0.1/bin/logstash_sql/select.sql"
    last_run_metadata_path => "./logstash_jdbc_last_run_oracle"  
    use_column_value => false  
    tracking_column => "submit_time"
  }
}

# filter {

# }

output {
  elasticsearch {
  hosts => "localhost:9200"
  index => "mysql_logstash"
  document_type => "person"
  document_id => "%{id}"
  }
  stdout {
  codec => json_lines
  }
}

執行以下命令,就可以將數據同步到之前配置好的Elasticsearch中了:

./logstash -f logstash.conf

參考文章

ELK日誌分析系統
Logstash使用詳解
logstash-input-jdbc 同步原理及相關問題解讀

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章