ELK是一整套解決方案,是三個(gè)軟件產(chǎn)品的首字母縮寫,Elasticsearch,Logstash和Kibana。
Logstash:負(fù)責(zé)數(shù)據(jù)的收集,處理和儲(chǔ)存
Elasticsearch:負(fù)責(zé)數(shù)據(jù)的檢索和分析
Kibana:負(fù)責(zé)可視化
體系結(jié)構(gòu)

基本流程是 logstash 負(fù)責(zé)從各種數(shù)據(jù)源里采集數(shù)據(jù),然后再寫入 Elasticsearch,Elasticsearch 對(duì)這些數(shù)據(jù)創(chuàng)建索引,然后由 Kibana 對(duì)其進(jìn)行各種分析并以圖表的形式展示。
安裝過程
具體安裝過程如下:
步驟1,安裝JDK1.8
步驟2,安裝Elasticsearch
步驟3,安裝Kibana
步驟4,安裝logstash
步驟5,安裝logstash-input-jdbc
步驟6,驗(yàn)證
logstash

Mysql in elasticsearch out
input {
jdbc {
jdbc_connection_string => "jdbc:mysql://xxx.xxx.xxx.xxx:3306/database?useCursorFetch=true&defaultFetchSize=100"
jdbc_user => "user"
jdbc_password => "password"
jdbc_validate_connection => true
jdbc_driver_library => "/usr/local/logstash/lib/mysql-connector-java-5.1.13-bin.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
statement => "select * from article"
}
}
output {
elasticsearch {
index => "article"
hosts => "xxx.xxx.xxx.xxx:9200"
}
}
Kibana
配置ES的索引顯示

Kibana ES Dev Tools

elasticsearchAPI基于HTTP協(xié)議,以JSON為數(shù)據(jù)交互格式的RESTful API向Elasticsearch發(fā)出的請(qǐng)求的組成部分與其它普通的HTTP請(qǐng)求是一樣的:curl -X'://:/?' -d ''
VERB HTTP方法:GET, POST, PUT, HEAD, DELETE
PROTOCOL http或者h(yuǎn)ttps協(xié)議(只有在Elasticsearch前面有https代理的時(shí)候可用)
HOST Elasticsearch集群中的任何一個(gè)節(jié)點(diǎn)的主機(jī)名,如果是在本地的節(jié)點(diǎn),那么就叫l(wèi)ocalhost
PORT Elasticsearch HTTP服務(wù)所在的端口,默認(rèn)為9200
PATH API路徑(例如_count將返回集群中文檔的數(shù)量),PATH可以包含多個(gè)組件,例如_cluster/stats或者_(dá)nodes/stats/jvm
QUERY_STRING 一些可選的查詢請(qǐng)求參數(shù),例如?pretty參數(shù)將使請(qǐng)求返回更加美觀易讀的JSON數(shù)據(jù)
BODY 一個(gè)JSON格式的請(qǐng)求主體(如果請(qǐng)求需要的話)
舉例說明,為了計(jì)算集群中的文檔數(shù)量,我們可以這樣做:
curl -XGET 'http://xxx.xxx.xxx.xxx:9200/_count?pretty' -d '
{
"query": {
"match_all": {}
}
}
'
索引
在Elasticsearch中,文檔歸屬于一種類型(type),而這些類型存在于索引(index)中,我們可以畫一些簡單的對(duì)比圖來類比傳統(tǒng)關(guān)系型數(shù)據(jù)庫:
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices? -> Types? -> Documents -> Fields
我們將進(jìn)行如下操作:
為每個(gè)員工的文檔(document)建立索引,每個(gè)文檔包含了相應(yīng)員工的所有信息。
每個(gè)文檔的類型為employee。
employee類型歸屬于索引megacorp。
megacorp索引存儲(chǔ)在Elasticsearch集群中。
實(shí)際上這些都是很容易的(盡管看起來有許多步驟)。我們能通過一個(gè)命令執(zhí)行完成的操作:
PUT /megacorp/employee/1
{
"first_name" : "John",
"last_name" :? "Smith",
"age" :? ? ? ? 25,
"about" :? ? ? "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
我們看到path:/megacorp/employee/1包含三部分信息:
名字 ? ? ? ? ? ? ? ? ? ? ?說明
megacorp ? ? ? ? ? ?索引名
employee ? ? ? ? ? ? 類型名
1 ? ? ? ? ? ? ? ? ? ? ? ? ? ?這個(gè)員工的ID
接下來,讓我們?cè)谀夸浿屑尤敫鄦T工信息:
PUT /megacorp/employee/2
{
"first_name" :? "Jane",
"last_name" :? "Smith",
"age" :? ? ? ? 32,
"about" :? ? ? "I like to collect rock albums",
"interests":? [ "music" ]
}
PUT /megacorp/employee/3
{
"first_name" :? "Douglas",
"last_name" :? "Fir",
"age" :? ? ? ? 35,
"about":? ? ? ? "I like to build cabinets",
"interests":? [ "forestry" ]
}
搜索
檢索文檔
我們只要執(zhí)行HTTP GET請(qǐng)求并指出文檔的“地址”——索引、類型和ID既可。根據(jù)這三部分信息,我們就可以返回原始JSON文檔:
GET /megacorp/employee/1
簡單搜索
搜索全部員工的請(qǐng)求:
GET /megacorp/employee/_search
搜索姓氏中包含“Smith”的員工
GET /megacorp/employee/_search?q=last_name:Smith
使用DSL語句查詢
GET /megacorp/employee/_search
{
"query" : {
"match" : {
"last_name" : "Smith"
}
}
}
全文搜索
搜索所有喜歡“rock climbing”的員工:
GET /megacorp/employee/_search
{
"query" : {
"match" : {
"about" : "rock climbing"
}
}
}
短語搜索
匹配若干個(gè)單詞或者短語(phrases),將match查詢變更為match_phrase查詢即可:
GET /megacorp/employee/_search
{
"query" : {
"match_phrase" : {
"about" : "rock climbing"
}
}
}
聚合
Elasticsearch有一個(gè)功能叫做聚合(aggregations),它允許你在數(shù)據(jù)上生成復(fù)雜的分析統(tǒng)計(jì)。它很像SQL中的GROUP BY但是功能更強(qiáng)大。
舉個(gè)例子,讓我們找到所有職員中最大的共同點(diǎn)(興趣愛好)是什么:
GET /megacorp/employee/_search
{
"aggs": {
"all_interests": {
"terms": { "field": "interests" }
}
}
}
問題: set fielddata = true on
解決:
PUT megacorp/_mapping/employee
{
"employee": {
"properties": {
"interests": {
"type": "text",
"fielddata": true
}
}
}
}