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