ELK是一整套解決方案,是三個軟件產品的首字母縮寫,Elasticsearch,Logstash和Kibana。
Logstash:負責數據的收集,處理和儲存
Elasticsearch:負責數據的檢索和分析
Kibana:負責可視化
體系結構
基本流程是 logstash 負責從各種數據源里采集數據,然后再寫入 Elasticsearch,Elasticsearch 對這些數據創建索引,然后由 Kibana 對其進行各種分析并以圖表的形式展示。
安裝過程
具體安裝過程如下:
步驟1,安裝JDK1.8
步驟2,安裝Elasticsearch
步驟3,安裝Kibana
步驟4,安裝logstash
步驟5,安裝logstash-input-jdbc
步驟6,驗證
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協議,以JSON為數據交互格式的RESTful API向Elasticsearch發出的請求的組成部分與其它普通的HTTP請求是一樣的:curl -X'://:/?' -d ''
VERB HTTP方法:GET, POST, PUT, HEAD, DELETE
PROTOCOL http或者https協議(只有在Elasticsearch前面有https代理的時候可用)
HOST Elasticsearch集群中的任何一個節點的主機名,如果是在本地的節點,那么就叫localhost
PORT Elasticsearch HTTP服務所在的端口,默認為9200
PATH API路徑(例如_count將返回集群中文檔的數量),PATH可以包含多個組件,例如_cluster/stats或者_nodes/stats/jvm
QUERY_STRING 一些可選的查詢請求參數,例如?pretty參數將使請求返回更加美觀易讀的JSON數據
BODY 一個JSON格式的請求主體(如果請求需要的話)
舉例說明,為了計算集群中的文檔數量,我們可以這樣做:
curl -XGET 'http://xxx.xxx.xxx.xxx:9200/_count?pretty' -d '
{
"query": {
"match_all": {}
}
}
'
索引
在Elasticsearch中,文檔歸屬于一種類型(type),而這些類型存在于索引(index)中,我們可以畫一些簡單的對比圖來類比傳統關系型數據庫:
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices? -> Types? -> Documents -> Fields
我們將進行如下操作:
為每個員工的文檔(document)建立索引,每個文檔包含了相應員工的所有信息。
每個文檔的類型為employee。
employee類型歸屬于索引megacorp。
megacorp索引存儲在Elasticsearch集群中。
實際上這些都是很容易的(盡管看起來有許多步驟)。我們能通過一個命令執行完成的操作:
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 ? ? ? ? ? ? ? ? ? ? ? ? ? ?這個員工的ID
接下來,讓我們在目錄中加入更多員工信息:
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" ]
}
搜索
檢索文檔
我們只要執行HTTP GET請求并指出文檔的“地址”——索引、類型和ID既可。根據這三部分信息,我們就可以返回原始JSON文檔:
GET /megacorp/employee/1
簡單搜索
搜索全部員工的請求:
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"
}
}
}
短語搜索
匹配若干個單詞或者短語(phrases),將match查詢變更為match_phrase查詢即可:
GET /megacorp/employee/_search
{
"query" : {
"match_phrase" : {
"about" : "rock climbing"
}
}
}
聚合
Elasticsearch有一個功能叫做聚合(aggregations),它允許你在數據上生成復雜的分析統計。它很像SQL中的GROUP BY但是功能更強大。
舉個例子,讓我們找到所有職員中最大的共同點(興趣愛好)是什么:
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
}
}
}
}