Kibana 是一款開源的數據分析和可視化平台,它是 Elastic Stack 成員之一,設計用於和 Elasticsearch 協作。您可以使用 Kibana 對 Elasticsearch 索引中的數據進行搜索、查看、交互操作。您可以很方便的利用圖表、表格及地圖對數據進行多元化的分析和呈現。
目錄
- 引子
- ELK快速安裝
- Elasticsearch快速入門
- SpringBoot整合ELK日志中心
ELK是Elastic公司提供的一套完整的日志收集以及展示的解決方案,也就是我們常說的日志中心,其中E代表Elasticsearch,L代表Logstash,K就是本文的中心Kibana。
Elasticsearch在其中擔當了數據源的作用,用於對數據快速搜索定位,這也是Github搜索使用的解決方案。
在超大數據規模的情況下,能夠將查詢條件匹配然后返回,高亮顯示,你應該知道Elasticsearch的強大了。
Logstash的作用是日志收集器,可以將不同來源的日志數據進行處理輸出。下圖是我的Logstash配置文件logstash.conf,配置分為兩個核心模塊,input和output,input中是logstash開放的端口5000,用於應用將日志提交給logstash,在output中是logstash處理完日志后將日志輸出的地方,可以看到是輸出到Elasticsearch,至於下面的用戶名密碼,如果你的Elasticsearch有設置即填,沒有設置則忽略。
Kibana的作用是對Elasticsearch中存儲的數據進行數據分析和可視化處理。
Kibana主要的作用是對日志進行可視化處理,同樣的還有Grafana,不過Grafana可以指定多種數據源,比如Prometheus,Mysql,Elasticsearch等
一. ELK快速安裝
需要了解的ELK開放端口
- 5000: Logstash TCP input
- 9200: Elasticsearch HTTP
- 9300: Elasticsearch TCP transport
- 5601: Kibana
-
方式一:
使用docker安裝,克隆改倉庫https://github.com/deviantony/docker-elk
在目錄下執行
docker-compose up
。 -
方式二:
使用同版本的包,此處ELK三個包版本必須相同,以免使用出現問題,我本地都是7.1.0。
我已經將三個同版本的包打包上傳好了,公眾號回復【ELK】獲得網盤下載地址
將包解壓后,在各個bin目錄下執行相應程序即可。
# ..\elasticsearch-7.1.0\bin .\elasticsearch.bat
# E:\kibana-7.1.0\bin .\kibana.bat
類似這樣,先啟動elasticsearch。
瀏覽器訪問 localhost:9200,可以看到elasticsearch的啟動狀態,然后啟動kibana,瀏覽器訪問 localhost:5601。
二. Elasticsearch快速入門
Ⅰ. 索引,文檔和REST API
1. 文檔
- Elasticsearch是面向文檔的,文檔是所有可搜索數據的最小單位。
- 日志文件中的日志項
- 一部電影的具體信息 / 一張唱片的詳細信息
- MP3播放器中的一首歌 / 一篇PDF文檔中的具體內容
- 文檔會被序列化成JSON格式,保存在ElasticSearch中
- JSON對象由字段組成
- 每個字段都有對應的字段類型(字符串/數值/布爾/日期/二進制/范圍類型)
- 每個文檔都有一個Unique ID
- 你可以自己指定ID
- 或者通過Elasticsearch自動生成
2. JSON文檔
-
一篇文檔包含了一系列字段。類似數據庫表中一條記錄
-
JSON文檔,格式靈活,不需要預先定義格式
- 字段的類型可以指定或者通過ElasticSearch自動推算
- 支持數組/支持嵌套
3. 文檔的元數據
- 元數據,用於標注文檔的相關信息
- _index 文檔所屬的索引名
- _type 文檔所屬的類型名
- _id 文檔唯一id
- _source 文檔的原始Json數據
- _all 整合所有字段內容到該字段,已被廢除
- _version 文檔的版本信息
- _score 相關性打分
4. 索引
-
Index — 索引是文檔的容器,是一類文檔的結合
- Index體現了邏輯空間的概念:每個索引都有自己的Mapping定義,用於定義包含的文檔的字段名和字段類型
- Shard體現了物理空間的概念:索引中數據分散在Shard上
-
索引的Mapping與Setting
- Mapping定義文檔字段的類型
- Setting定義不同的數據分布
-
索引的不同語義
索引(動詞)文檔到ElasticSearch的索引(名詞)中
- 名詞:一個ElasticSearch集群中,可以創建很多個不同的索引
- 動詞:保存一個文檔到ElasticSearch的過程也叫索引(Indexing)
- ES中創建一個倒排索引的過程
- 名詞: 一個B樹索引,一個倒排索引
5. Type
- 在7.0之前,一個Index可以設置多個Types
- 6.0開始,Type已經被Deprecated。7.0開始,一個索引只能有一個Type—"_doc"
6. 與關系型數據庫類比
RDBMS | ElasticSearch |
---|---|
Table | Index |
Row | Document |
Column | Filed |
Schema | Mapping |
SQL | DSL |
- 傳統關系型數據庫與ElasticSearch的區別
- ElasticSearch — Schemaless / 相關性高 / 高性能全文檢索
- RDMS — 事物性 / Join
7. REST API — 很容易被各種語言調用
8. 一些基本的API
- Indices
- 創建Index
- PUT Movies
- 查看所有Index
- _cat/indices
- 創建Index
// 查看指定索引的相關信息 Mapping/Setting的設置
GET index_name
// 查看指定索引的文檔總數
GET index_name/_count
// 查看指定索引的前10條文檔
POST index_name/_search
// _cat indices API
// 對索引名稱進行通配符查詢
GET /_cat/indices/kibana*v&s=index
// 查看索引狀態為綠的索引
GET /_cat/indices/v&health=green
// 按照文檔個數排序
GET /_cat/indices/v&s=docs.count:desc
Ⅱ. 節點,集群,分片和副本
1. 分布式系統的可用性與擴展性
- 高可用性
- 服務可用性 — 允許有節點停止服務
- 數據可用性 — 部分節點丟失,不會丟失數據
- 可擴展性
- 請求量提示 / 數據的不斷增長 (將數據分布到所有節點上)
2. 分布式特性
-
ElasticSearch的分布式架構的好處
- 存儲的水平擴容
- 提升系統的可用性,部分節點停止服務,整個集群的服務不受影響
-
Elasticsearch的分布式架構
- 不同的集群通過不同的名字來區分,默認名字"elasticsearch"
- 通過配置文件修改,或者在命令行中 -E cluster.name=clustername 進行設定
- 一個集群可以有一個或多個節點
3. 節點
- 節點是一個Elasticsearch的實例
- 本質上就是一個JAVA進程
- 一台機器上可以運行多個Elasticsearch進程,但生產環境一個一機一個
- 每個節點都有名字,通過配置文件,或者啟動時通過 -E node.name=nodename進行設定
- 每個節點在啟動之后,會分配一個UID,保存在data目錄下
4. Master-ekigible nodes 和 Master Node
- 每個節點啟動后,默認就是一個Master eligible節點
- 可以設置node.master: false 禁止
- Master-eligible節點可以參與選主流程,成為Master節點
- 當第一個節點啟動時,他會將自己選舉為Master節點
- 每個節點上都保存了集群的狀態,只有Master節點才能修改集群的狀態信息
- 集群狀態,維護了一個集群中,必要的信息
- 所有的節點信息
- 所有的索引和其相關的Mapping與Setting信息
- 分片的路由信息
- 任意節點都能修改信息會導致數據的不一致性
- 集群狀態,維護了一個集群中,必要的信息
5. Data Node & Coordinating Node
- Data Node
- 可以保存數據的節點,叫做Data Node。負責保存分片數據。在數據擴展上起到了至關重要的作用
- Coordinating Node
- 負責接收Client的請求,將請求發到合適的節點,最終把結果匯聚到一起
- 每個節點默認都起到Coordinating Node的職責
6. 其他的節點類型
- Hot & Warm Node
- 不同硬件配置的Data Node,用來實現Hot & Warm架構,降低集群部署的成本
- Machine Learning Node
- 負責跑機器學習的Job,用來做異常檢測
- Tribe Node
- Tribe Node連接到不同的Elasticsearch集群,並且支持將這些集群當成一個單獨的集群處理
7. 配置節點類型
8. 分片(Primary Shard & Replica Shard)
- 主分片,用以解決數據水平擴展的問題。通過主分片,可以將數據發布到集群內所有節點上
- 一個分片是一個運行的Lucene實例
- 主分片在索引創建時指定,后續不允許修改,除非Reindex
- 副本,用以解決數據高可用的問題。分片是主分片的拷貝
- 副本分片數,可以動態調整
- 增加副本數,還可以在一定程度上提高服務的可用性(讀取的吞吐)
9. 分片的設定
- 對於生產環境中分片的設定,需要提前做好容量規划
- 分片數設置過小
- 導致后續無法增加節點實現水品擴展
- 單個分片的數據量太大,導致數據重新分配耗時
- 分片數設置過大,7.0開始,默認主分片設置成1,解決了over- sharding的問題
- 影響搜索結果的相關性打分,影響統計結果的准確性
- 單個節點上過多的分片,會導致資源浪費,同時也會影響性能
- 分片數設置過小
10. 查看集群狀態
-
使用REST API
- _cat/nodes
- _cat/shard
-
使用cerebro
- 啟動訪問localhost:9000
Ⅲ. 文檔的基本CRUD與批量操作
1. 文檔的CRUD
-
Index (如果ID不存在,創建新的文檔,如果存在,刪除原有的再創建,版本會增加)
PUT my_index/_doc/1 { "user": "mike", "comment": "hello" }
-
Create
PUT my_index/_create/1 { "user": "mike", "comment": "hello" } POST my_index/_doc(不用指定ID,自動生成) { "user": "mike", "comment": "hello" }
-
Read
GET my_index/_doc/1
-
Update 文檔必須存在,更新字段
POST my_index/_update/1 { "user": "mike", "comment": "hello es" }
-
Delete
DELETE my_index/_doc/1
2. Bulk API
支持在一次API調用中,對不同的索引進行操作
- 支持四種類型操作
- Index
- Create
- Update
- Delete
- 可以在URL中指定Index,也可以在請求的Payload中進行
- 操作中單個操作失敗,不影響其他操作
- 返回結果包括了每一條操作執行的結果
POST _bulk
{"index": {"_index": "test", "_id": "1"}}
{"field1": "value1"}
{"delete": {"_index": "test", "_id":"2"}}
3. 批量讀取 mget
批量操作,可以減少網絡連接所產生的開銷,提高性能
GET _mget
{
"docs": [
{
"_index": "user",
"_id": 1
},
{
"_index": "comment",
"_id": 1
}
]
}
4. 批量查詢 msearch
POST my_index/_msearch
{}
{"query": {"match_all":{}, "from":0, "size":10}}
{}
{"query": {"match_all":{}}
{"index": "twitter2"}
{"query": {"match_all":{}}
Ⅳ. 倒排索引
1. 正排與倒排索引
- 目錄頁,根據目錄頁索引,
正排索引
,章名稱+頁碼號 - 根據關鍵字進行索引到目錄頁,
倒排索引
在搜索引擎中
- 正排索引 — 文檔ID到文檔內容和單詞的關聯
- 倒排索引 — 單詞到文檔ID的關系
2. 倒排索引的核心組成
- 倒排索引包含兩個部分
- 單詞詞典,記錄所有文檔的單詞,記錄單詞到倒排列表的關聯關系
- 單詞詞典一般比較大,可以通過B+樹或者哈希拉鏈法實現,以滿足高性能的插入與查詢
- 倒排列表,記錄了單詞對應的文檔結合,由倒排索引項組成
- 倒排索引項
- 文檔ID
- 詞頻TF
- 位置 — 單詞在文檔中分詞的位置。用於語句搜索
- 偏移 — 記錄單詞的開始結束位置,實現高亮顯示
- 倒排索引項
- 單詞詞典,記錄所有文檔的單詞,記錄單詞到倒排列表的關聯關系
3. Elasticsearch的倒排索引
- Elasticsearch的JSON文檔中的每個字段,都有自己的倒排索引
- 可以指定對某些字段不做索引
- 優點: 節省存儲空間
- 缺點:字段無法被搜索
Ⅴ. 通過Analyzer進行分詞
1. Analysis與Analyzer
-
Analysis — 文本分析是把全文本轉換為一系列單詞(term/token)的過程,也叫分詞
-
Analysis是通過Analyzer來實現的
- 可使用Elasticsearch內置的分析器/或者按需定制分析器
-
除了在數據寫入時轉換詞條,匹配Query語句時也需要用相同的分析器對查詢語句進行分析
2. Analyzer的組成
-
分詞器是專門處理分詞的組件,Analyzer由三部分組成
- Character Filter,針對原始文本處理,例如去除html / Tokenizer 按照規則切分為單詞 / Token Filter 將切分的單詞進行加工,小寫,刪除stopwords,增加同義詞
3. Elasticsearch內置分詞器
4. 使用_analyzer API
-
直接指定Analyzer進行測試
GET /_analyze { "analyzer": "standard", "text": "Mastering Elasticsearch, elasticsearch in Action" }
-
指定索引字段進行測試
POST books/_analyze { "field": "title", "text": "Mastering Elasticsearch" }
-
自定義分詞進行測試
POST /_analyze
{
"tokenizer": "standard",
"filter": ["lowercase"],
"text": "Mastering Elasticsearch"
}
5. 中文分詞
-
中文句子,切分成一個一個詞,而不是字
-
英文中,單詞有自然空格分隔
-
一句中文,不同上下文有不同理解
- 這個蘋果,不大好吃 / 這個蘋果,不大,好吃!
-
安裝ICU Analyzer
在elasticsearch的bin目錄下執行
elasticsearch-plugin install analysis-icu
提供了Unicode的支持,更好的支持亞洲語言
6. 更多好用的中文分詞器
- LK
- 支持自定義詞庫,支持熱更新分詞字典
- THULAC
- THU Lexuacal Analyzer for Chinese,清華大學自然語言處理和社會人文計算實驗室的一套中文分詞器
Ⅵ. Search API概覽
1. Search API
- URI Search
- 在URL中使用查詢參數
- Request Body Search
- 使用Elasticsearch提供的,基於JSON格式的更加完備的Query Domain Specific Language(DSL)
2. 指定查詢的索引
- /_search 集群上所有的索引
- /index1/_search 索引index1
- /index1,index2/_search 索引index1和2
- /index*/_search 查詢index開頭的索引
3. Request Body
4. 搜索Response
Ⅶ. URI Search
1. 通過URI query實現搜索
GET /movies/_search?q=2012&df=title&sort=year:desc&from=0&size=10&timeout=1s
{
"profile": true
}
- q 指定查詢語句,使用Query String Syntax
- df 默認字段,不指定時,會對所有字段進行查詢
- sort 排序 / from和size用於分頁
- profile 可以查看查詢是如何被執行的
2. Query String Syntax
-
指定字段 v.s 范查詢
-
q=title:2012 / q=2012
查詢title存在2012的,查詢存在2012的
-
-
Term v.s Phrase
- Beautiful Mind 等效於Beautiful OR Mind
- "Beautiful Mind",等效於Beautiful AND Mind。Phrase查詢,要求前后順序一致
-
分組與引號
- title:(Beautiful AND Mind) ---> title:Beautiful title:Mind
- title="Beautiful Mind" ---> title:Beautiful Mind
-
布爾操作
- AND / OR / NOT 或者 && / || / !
- 必須大寫
- title:(matrix NOT reloaded)
- AND / OR / NOT 或者 && / || / !
-
分組
+
表示must-
表示must_not- title:(+matrix -reloaded)
-
通配符查詢(不建議使用,占用內存大,查詢效率低)
- ? 代表1個字符,*代表0或者多個
- title:mi?d
- title:be*
- ? 代表1個字符,*代表0或者多個
-
正則表達
- title:[bt]oy 匹配boy / toy
-
模糊匹配與近似匹配
- title:befutifl~1 允許輸入錯一個
- title:"lord rings"~2 可以不用相鄰,挨着兩個
Ⅷ. Request Body Search與Query DSL
1. Request Body Search
-
將查詢語句通過HTTP Request Body發送給Elasticsearch
-
Query DSL
POST /movies,404_idx/_search?ignore_unavailable=true { "profile": true, "query": { "match_all": {} } }
2. 使用查詢表達式 Match
GET /comments/_doc/_search
{
"query": {
"match": {
"comment": "Last Christmas"
}
}
}
GET /comments/_doc/_search
{
"query": {
"match": {
"comment": {
"query":"Last Christmas",
"operator": "AND"
}
}
}
}
3. Query String Query
類似URI Query
POST users/_search
{
"query": {
"query_string": {
"default_field": "name",
"query": "Ruan AND Ming"
}
}
}
三. SpringBoot整合ELK日志中心
SpringBoot整合ELK的核心在於將日志發送給logstash的開放端口,常用的方案就是使用logstash提供好的日志上傳包。
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>5.1</version>
</dependency>
添加該依賴,該依賴提供了一個appender類LogstashTcpSocketAppender,是logback日志框架的上報日志需要的類的實現,在logback.xml中添加相應的appender規則即可,指定輸出到logstash端口。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml" />
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>127.0.0.1:5000</destination>
<!-- 上述端口為elk-docker默認 -->
<!-- 日志輸出編碼 -->
<encoder charset="UTF-8"
class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp>
<timeZone>UTC</timeZone>
</timestamp>
<pattern>
<pattern>
{
"logLevel": "%level",
"serviceName": "${springAppName:-}",
"pid": "${PID:-}",
"thread": "%thread",
"class": "%logger{40}",
"rest": "%message"
}
</pattern>
</pattern>
</providers>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="LOGSTASH" />
<appender-ref ref="CONSOLE" />
</root>
</configuration>
記得將logstash的配置文件也進行修改。
input {
tcp {
port => 5000
codec => json_lines # 上傳使用json_lines插件格式化
}
}
output {
elasticsearch {
hosts => "elasticsearch:9200"
}
}
啟動ELK三個應用,然后啟動你的SpringBoot應用,就可以在索引管理中看到應用的日志索引了。
然后在管理中創建索引模式,將你的應用索引添加進去,就可以在儀表盤中對日志進行搜索服務了。