
1. 摘要
本文是牛冬的 《Elasticsearch實(shí)戰(zhàn)與原理解析》的讀書(shū)筆記。電子書(shū)還是看文字類的舒服,可以在PC上閱讀,也可以在手機(jī)上閱讀。看文章最后,提供原文鏈接和源代碼鏈接。
目錄如下:
第一部分 Elasticsearch 前傳
第1 章 搜索技術(shù)發(fā)展史 2
1.1 正說(shuō)搜索技術(shù)發(fā)展史 2
1.2 Elasticsearch 簡(jiǎn)介 . 5
1.3 Lucene 簡(jiǎn)介 . 5
1.4 知識(shí)點(diǎn)關(guān)聯(lián) . 7
1.5 小結(jié) . 15
第2 章 搜索技術(shù)基本知識(shí) 16
2.1 數(shù)據(jù)搜索方式 . 16
2.2 搜索引擎工作原理 17
2.3 網(wǎng)絡(luò)爬蟲(chóng)工作原理 18
2.4 網(wǎng)頁(yè)分析 . 20
2.5 倒排索引 . 23
2.6 結(jié)果排序 . 26
2.7 中文分詞實(shí)戰(zhàn) . 27
2.7.1 Ansj 中文分詞 . 27
2.7.2 Jcseg 輕量級(jí) Java 中文分詞器 . 30
2.8 知識(shí)點(diǎn)關(guān)聯(lián) . 38
2.9 小結(jié) . 39
第二部分 Elasticsearch 實(shí)戰(zhàn)
第3 章 初識(shí)Elasticsearch 42
3.1 Elasticsearch 簡(jiǎn)介 . 42
3.2 Elasticsearch 的安裝與配置 43
3.2.1 安裝Java 環(huán)境 . 43
3.2.2 Elasticsearch 的安裝 47
3.2.3 Elasticsearch 的配置 52
3.3 Elasticsearch 的核心概念 . 60
3.4 Elasticsearch 的架構(gòu)設(shè)計(jì) . 62
3.4.1 Elasticsearch 的節(jié)點(diǎn)自動(dòng)發(fā)現(xiàn)機(jī)制 64
3.4.2 節(jié)點(diǎn)類型 66
3.4.3 分片和路由 66
3.4.4 數(shù)據(jù)寫(xiě)入過(guò)程 67
3.5 知識(shí)點(diǎn)關(guān)聯(lián) . 70
3.6 小結(jié) . 75
第4 章 初級(jí)客戶端實(shí)戰(zhàn) 76
4.1 初級(jí)客戶端初始化 76
4.2 提交請(qǐng)求 . 83
4.3 對(duì)請(qǐng)求結(jié)果的解析 89
4.4 常見(jiàn)通用設(shè)置 . 91
4.5 高級(jí)客戶端初始化 95
4.6 創(chuàng)建請(qǐng)求對(duì)象模式 98
4.7 知識(shí)點(diǎn)關(guān)聯(lián) . 98
4.8 小結(jié) . 100
第5 章 高級(jí)客戶端文檔實(shí)戰(zhàn)一 . 101
5.1 文檔 . 102
5.2 文檔索引 . 103
5.3 文檔索引查詢 . 114
5.4 文檔存在性校驗(yàn) . 118
5.5 刪除文檔索引 . 121
5.6 更新文檔索引 . 125
5.7 獲取文檔索引的詞向量 131
5.8 文檔處理過(guò)程解析 138
5.8.1 文檔的索引過(guò)程 138
5.8.2 文檔在文件系統(tǒng)中的處理過(guò)程 140
5.9 知識(shí)點(diǎn)關(guān)聯(lián) . 145
5.10 小結(jié) . 146
第6 章 高級(jí)客戶端文檔實(shí)戰(zhàn)二 . 147
6.1 批量請(qǐng)求 . 148
6.2 批量處理器 . 154
6.3 MultiGet 批量處理實(shí)戰(zhàn) 158
6.4 文檔ReIndex 實(shí)戰(zhàn) 164
6.5 文檔查詢時(shí)更新實(shí)戰(zhàn) 171
6.6 文檔查詢時(shí)刪除實(shí)戰(zhàn) 176
6.7 獲取文檔索引的多詞向量 180
6.8 文檔處理過(guò)程解析 185
6.8.1 Elasticsearch 文檔分片存儲(chǔ) 185
6.8.2 Elasticsearch 的數(shù)據(jù)分區(qū) 187
6.9 知識(shí)點(diǎn)關(guān)聯(lián) . 188
6.10 小結(jié) . 189
第7 章 搜索實(shí)戰(zhàn) . 190
7.1 搜索API 191
7.2 滾動(dòng)搜索 . 208
7.3 批量搜索 . 220
7.4 跨索引字段搜索 . 228
7.5 搜索結(jié)果的排序評(píng)估 235
7.6 搜索結(jié)果解釋 . 243
7.7 統(tǒng)計(jì) . 251
7.8 搜索過(guò)程解析 . 258
7.8.1 對(duì)已知文檔的搜索 258
7.8.2 對(duì)未知文檔的搜索 259
7.8.3 對(duì)詞條的搜索 260
7.9 知識(shí)點(diǎn)關(guān)聯(lián) . 262
7.10 小結(jié) . 262
第8 章 索引實(shí)戰(zhàn) . 263
8.1 字段索引分析 . 264
8.2 創(chuàng)建索引 . 271
8.3 獲取索引 . 277
8.4 刪除索引 . 282
8.5 索引存在驗(yàn)證 . 285
8.6 打開(kāi)索引 . 289
8.7 關(guān)閉索引 . 292
8.8 縮小索引 . 296
8.9 拆分索引 . 299
8.10 刷新索引 . 303
8.11 Flush 刷新 306
8.12 同步Flush 刷新 . 310
8.13 清除索引緩存 . 314
8.14 強(qiáng)制合并索引 . 317
8.15 滾動(dòng)索引 . 322
8.16 索引別名 . 326
8.17 索引別名存在校驗(yàn) 330
8.18 獲取索引別名 . 333
8.19 索引原理解析 . 337
8.19.1 近實(shí)時(shí)搜索的實(shí)現(xiàn) 337
8.19.2 倒排索引的壓縮 337
8.20 知識(shí)點(diǎn)關(guān)聯(lián) . 338
8.21 小結(jié) . 339
第三部分 Elasticsearch 生態(tài)
第9 章 Elasticsearch 插件 342
9.1 插件簡(jiǎn)介 . 342
9.2 插件管理 . 343
9.3 分析插件 . 346
9.3.1 分析插件簡(jiǎn)介 346
9.3.2 Elasticsearch 中的分析插件 347
9.3.3 ICU 分析插件 349
9.3.4 智能中文分析插件 360
9.4 API 擴(kuò)展插件 367
9.5 監(jiān)控插件 . 368
9.6 數(shù)據(jù)提取插件 . 368
9.7 常用插件實(shí)戰(zhàn) . 369
9.7.1 Head 插件 369
9.7.2 Cerebro 插件 385
9.8 知識(shí)點(diǎn)關(guān)聯(lián) . 393
9.9 小結(jié) . 394
第10 章 Elasticsearch 生態(tài)圈 395
10.1 ELK 395
10.1.1 Elastic Stack . 395
10.1.2 Elastic Stack 版本的由來(lái) 396
10.1.3 ELK 實(shí)戰(zhàn)的背景 . 397
10.1.4 ELK 的部署架構(gòu)變遷 . 397
10.2 Logstash . 400
10.2.1 Logstash 簡(jiǎn)介 400
10.2.2 Logstash 的輸入模塊 402
10.2.3 Logstash 過(guò)濾器 403
10.2.4 Logstash 的輸出模塊 404
10.3 Kibana 405
10.3.1 Kibana 簡(jiǎn)介 . 405
10.3.2 連接Elasticsearch 406
10.4 Beats 410
10.4.1 Beats 簡(jiǎn)介 410
10.4.2 Beats 輕量級(jí)設(shè)計(jì)的實(shí)現(xiàn) 412
10.4.3 Beats 的架構(gòu) 412
10.5 知識(shí)點(diǎn)關(guān)聯(lián) . 413
10.6 小結(jié) . 414
第一部分 Elasticsearch 前傳
第1 章 搜索技術(shù)發(fā)展史
(1)Elasticsearch基于Java編寫(xiě),其內(nèi)部使用Lucene做索引與搜索。
(2)2019年4月10日,Elasticsearch發(fā)布了7.0版本。該版本的重要特性包含引入內(nèi)存斷路器、引入Elasticsearch的全新集群協(xié)調(diào)層——Zen2、支持更快的前k個(gè)查詢、引入Function score 2.0等。
第2 章 搜索技術(shù)基本知識(shí)
3,第二部分 Elasticsearch 實(shí)戰(zhàn)
第3 章 初識(shí)Elasticsearch
(1)如何檢查Elasticsearch是否已運(yùn)行正確?
curl http://localhost:29200
{
"name" : "node-1",
"cluster_name" : "my-es",
"cluster_uuid" : "xbE6G3BcQQKcQwCT8tWI_A",
"version" : {
"number" : "6.6.0",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "a9861f4",
"build_date" : "2019-01-24T11:27:09.439740Z",
"build_snapshot" : false,
"lucene_version" : "7.6.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
(2)安全設(shè)置elasticsearch.keystore
有些設(shè)置是敏感的,依賴文件系統(tǒng)權(quán)限來(lái)保護(hù)它們的值是不夠的。對(duì)于這個(gè)用例,Elasticsearch提供了一個(gè)密鑰存儲(chǔ)庫(kù)和一個(gè)Elasticsearch -keystore工具來(lái)管理密鑰存儲(chǔ)庫(kù)中的設(shè)置。
注意:elasticsearch密鑰庫(kù)目前只提供混淆。未來(lái)將增加密碼保護(hù)。
幫助文檔:
../bin/elasticsearch-keystore --help
A tool for managing settings stored in the elasticsearch keystore
?
Commands
--------
create - Creates a new elasticsearch keystore
list - List entries in the keystore
add - Add a string setting to the keystore
add-file - Add a file setting to the keystore
remove - Remove a setting from the keystore
創(chuàng)建密鑰存儲(chǔ)庫(kù)
使用create命令來(lái)創(chuàng)建elasticsearch.keystore:
bin/elasticsearch-keystore create
文件elasticsearch.keystore將創(chuàng)建于elasticsearch.yml的目錄位置。
列出密鑰存儲(chǔ)庫(kù)中的設(shè)置
可以通過(guò)list命令獲得密鑰存儲(chǔ)庫(kù)中的設(shè)置列表:
bin/elasticsearch-keystore list
添加字符串設(shè)置
可以使用add命令添加敏感的字符串設(shè)置,比如云插件的身份驗(yàn)證憑據(jù):
bin/elasticsearch-keystore add the.setting.name.to.set
該工具將提示設(shè)置的值。要通過(guò)stdin傳遞該值,請(qǐng)使用--stdin標(biāo)志:
cat /file/containing/setting/value | bin/elasticsearch-keystore add --stdin the.setting.name.to.set
刪除設(shè)置
要從密鑰庫(kù)中刪除設(shè)置,請(qǐng)使用remove命令:
bin/elasticsearch-keystore remove the.setting.name.to.remove
(3)Elasticsearch的核心概念
Elasticsearch的核心概念有Node、Cluster、Shards、Replicas、Index、Type、Document、Settings、Mapping和Analyzer,其含義分別如下所示。
Node
即節(jié)點(diǎn)。節(jié)點(diǎn)是組成Elasticsearch集群的基本服務(wù)單元,集群中的每個(gè)運(yùn)行中的Elasticsearch服務(wù)器都可稱之為節(jié)點(diǎn)。
Cluster
即集群。Elasticsearch的集群是由具有相同cluster.name (默認(rèn)值為elasticsearch)的一個(gè)或多個(gè)Elasticsearch節(jié)點(diǎn)組成的,各個(gè)節(jié)點(diǎn)協(xié)同工作,共享數(shù)據(jù)。同一個(gè)集群內(nèi)節(jié)點(diǎn)的名字不能重復(fù),但集群名稱一定要相同。
在Elasticsearch集群中,節(jié)點(diǎn)的狀態(tài)有Green、Yellow和Red三種,分別如下所述。
① Green:綠色,表示節(jié)點(diǎn)運(yùn)行狀態(tài)為健康狀態(tài)。所有的主分片和副本分片都可以正常工作,集群100%健康。
② Yellow:黃色,表示節(jié)點(diǎn)的運(yùn)行狀態(tài)為預(yù)警狀態(tài)。所有的主分片都可以正常工作,但至少有一個(gè)副本分片是不能正常工作的。此時(shí)集群依然可以正常工作,但集群的高可用性在某種程度上被弱化。
③ Red:紅色,表示集群無(wú)法正常使用。此時(shí),集群中至少有一個(gè)分片的主分片及它的全部副本分片都不可正常工作。雖然集群的查詢操作還可以進(jìn)行,但是也只能返回部分?jǐn)?shù)據(jù)(其他正常分片的數(shù)據(jù)可以返回),而分配到這個(gè)有問(wèn)題分片上的寫(xiě)入請(qǐng)求將會(huì)報(bào)錯(cuò),最終導(dǎo)致數(shù)據(jù)丟失。
Shards
即分片。當(dāng)索引的數(shù)據(jù)量太大時(shí),受限于單個(gè)節(jié)點(diǎn)的內(nèi)存、磁盤(pán)處理能力等,節(jié)點(diǎn)無(wú)法足夠快地響應(yīng)客戶端的請(qǐng)求,此時(shí)需要將一個(gè)索引上的數(shù)據(jù)進(jìn)行水平拆分。拆分出來(lái)的每個(gè)數(shù)據(jù)部分稱之為一個(gè)分片。一般來(lái)說(shuō),每個(gè)分片都會(huì)放到不同的服務(wù)器上。
進(jìn)行分片操作之后,索引在規(guī)模上進(jìn)行擴(kuò)大,性能上也隨之水漲船高的有了提升。Elasticsearch依賴Lucene,Elasticsearch中的每個(gè)分片其實(shí)都是Lucene中的一個(gè)索引文件,因此每個(gè)分片必須有一個(gè)主分片和零到多個(gè)副本分片。
在Elasticsearch中,默認(rèn)為一個(gè)索引創(chuàng)建5個(gè)主分片,并分別為每個(gè)主分片創(chuàng)建一個(gè)副本。
Replicas
即備份,也可稱之為副本。副本指的是對(duì)主分片的備份,這種備份是精確復(fù)制模式。每個(gè)主分片可以有零個(gè)或多個(gè)副本,主分片和備份分片都可以對(duì)外提供數(shù)據(jù)查詢服務(wù)。當(dāng)構(gòu)建索引進(jìn)行寫(xiě)入操作時(shí),首先在主分片上完成數(shù)據(jù)的索引,然后數(shù)據(jù)會(huì)從主分片分發(fā)到備份分片上進(jìn)行索引。
當(dāng)主分片不可用時(shí),Elasticsearch會(huì)在備份分片中選舉出一個(gè)分片作為主分片,從而避免數(shù)據(jù)丟失。
Index
即索引。在Elasticsearch中,索引由一個(gè)和多個(gè)分片組成。在使用索引時(shí),需要通過(guò)索引名稱在集群內(nèi)進(jìn)行唯一標(biāo)識(shí)。
Type
即類別。類別指的是索引內(nèi)部的邏輯分區(qū),通過(guò)Type的名字在索引內(nèi)進(jìn)行唯一標(biāo)識(shí)。在查詢時(shí)如果沒(méi)有該值,則表示需要在整個(gè)索引中查詢。
Document
即文檔。索引中的每一條數(shù)據(jù)叫作一個(gè)文檔,與關(guān)系數(shù)據(jù)庫(kù)的使用方法類似,一條文檔數(shù)據(jù)通過(guò)_id在Type內(nèi)進(jìn)行唯一標(biāo)識(shí)。
Settings
Settings是對(duì)集群中索引的定義信息,比如一個(gè)索引默認(rèn)的分片數(shù)、副本數(shù)等。
Mapping
Mapping表示中保存了定義索引中字段(Field)的存儲(chǔ)類型、分詞方式、是否存儲(chǔ)等信息,有點(diǎn)類似于關(guān)系數(shù)據(jù)庫(kù)(如MySQL)中的表結(jié)構(gòu)信息。
在Elasticsearch中,Mapping是可以動(dòng)態(tài)識(shí)別的。如果沒(méi)有特殊需求,則不需要手動(dòng)創(chuàng)建Mapping,因?yàn)镋lasticsearch會(huì)根據(jù)數(shù)據(jù)格式自動(dòng)識(shí)別它的類型。一個(gè)索引的Mapping一旦創(chuàng)建,若已經(jīng)存儲(chǔ)了數(shù)據(jù),就不可修改了。
Analyzer
Analyzer表示的是字段分詞方式的定義。一個(gè)Analyzer通常由一個(gè)Tokenizer和零到多個(gè)Filter組成。在Elasticsearch中,默認(rèn)的標(biāo)準(zhǔn)Analyzer包含一個(gè)標(biāo)準(zhǔn)的Tokenizer和三個(gè)Filter,即Standard Token Filter、Lower Case Token Filter和Stop TokenFilter。
(4)Elasticsearch的架構(gòu)設(shè)計(jì)

我們將Elasticsearch的架構(gòu)自底向上分為五層,分別是核心層、數(shù)據(jù)處理層、發(fā)現(xiàn)與腳本層、協(xié)議層和應(yīng)用層。
發(fā)現(xiàn)與腳本層主要是Discovery(節(jié)點(diǎn)發(fā)現(xiàn))模塊、Script(腳本)模塊和第三方插件模塊。Discovery模塊是Elasticsearch自動(dòng)發(fā)現(xiàn)節(jié)點(diǎn)的機(jī)制。Script模塊支持腳本的執(zhí)行,腳本的應(yīng)用使得我們能很方便的對(duì)查詢出來(lái)的數(shù)據(jù)進(jìn)行加工處理,目前Elasticsearch支持JavaScript、Python等多種語(yǔ)言。第三方插件模塊表示Elasticsearch支持安裝很多第三方的插件,如elasticsearch-ik分詞插件、elasticsearch-sql插件等。
協(xié)議層是Elasticsearch中的數(shù)據(jù)交互協(xié)議。目前Elasticsearch支持Thrift、Memcached和HTTP三種協(xié)議,默認(rèn)的是HTTP。JMX指的是在Elasticsearch中對(duì)Java的管理框架,用來(lái)管理Elasticsearch應(yīng)用。
應(yīng)用層指的是Elasticsearch的API支持模式。Elasticsearch的特色之一就是RESTFul風(fēng)格的API,這種API接口風(fēng)格也是當(dāng)前十分流行的風(fēng)格之一。
(5) Elasticsearch的節(jié)點(diǎn)自動(dòng)發(fā)現(xiàn)機(jī)制
Elasticsearch內(nèi)嵌自動(dòng)發(fā)現(xiàn)功能,主要提供了4種可供選擇的發(fā)現(xiàn)機(jī)制。其中一種是默認(rèn)實(shí)現(xiàn),其他都是通過(guò)插件實(shí)現(xiàn)的,具體如下所示。
(1)Azure discovery插件方式:多播模式。
(2)EC2 discovery插件方式:多播模式。
(3)Google Compute Engine(GCE)discovery插件方式:多播模式。
(4)Zen Discovery,默認(rèn)實(shí)現(xiàn)方式,支持多播模式和單播模式。
Zen Discovery是Elasticsearch內(nèi)置的默認(rèn)發(fā)現(xiàn)模塊。發(fā)現(xiàn)模塊用于發(fā)現(xiàn)集群中的節(jié)點(diǎn)及選舉主節(jié)點(diǎn)(又稱master節(jié)點(diǎn))。Zen Discovery提供單播模式和基于文件的發(fā)現(xiàn),并且可以擴(kuò)展為通過(guò)插件支持其他形式的發(fā)現(xiàn)機(jī)制。
(6)節(jié)點(diǎn)類型
在Elasticsearch中,每個(gè)節(jié)點(diǎn)可以有多個(gè)角色,節(jié)點(diǎn)既可以是候選主節(jié)點(diǎn),也可以是數(shù)據(jù)節(jié)點(diǎn)。
其中,數(shù)據(jù)節(jié)點(diǎn)負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)相關(guān)的操作,如對(duì)數(shù)據(jù)進(jìn)行增、刪、改、查和聚合等。其中,數(shù)據(jù)節(jié)點(diǎn)負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)相關(guān)的操作,如對(duì)數(shù)據(jù)進(jìn)行增、刪、改、查和聚合等。正因?yàn)槿绱?,?shù)據(jù)節(jié)點(diǎn)往往對(duì)服務(wù)器的配置要求比較高,特別是對(duì)CPU、內(nèi)存和I/O的需求很大。
候選主節(jié)點(diǎn)是被選舉為主節(jié)點(diǎn)的節(jié)點(diǎn),在集群中,只有候選主節(jié)點(diǎn)才有選舉權(quán)和被選舉權(quán),其他節(jié)點(diǎn)不參與選舉工作。
(7)分片和路由
片的數(shù)量和副本數(shù)量都可以通過(guò)創(chuàng)建索引時(shí)的Settings來(lái)配置,Elasticsearch默認(rèn)為一個(gè)索引創(chuàng)建5個(gè)主分片,并分別為每個(gè)分片創(chuàng)建一個(gè)副本。配置的參數(shù)如下所示:
index.number_of_shards:5
index.number_of_replicas:1
對(duì)文檔的新建、索引和刪除請(qǐng)求等寫(xiě)操作,必須在主分片上面完成之后才能被復(fù)制到相關(guān)的副本分片。Elasticsearch為了加快寫(xiě)入的速度,寫(xiě)入過(guò)程往往是并發(fā)實(shí)施的。為了解決在并發(fā)寫(xiě)的過(guò)程中出現(xiàn)的數(shù)據(jù)沖突的問(wèn)題,Elasticsearch通過(guò)樂(lè)觀鎖進(jìn)行控制,每個(gè)文檔都有一個(gè)version(版本號(hào)),當(dāng)文檔被修改時(shí)版本號(hào)遞增。
(8)數(shù)據(jù)寫(xiě)入過(guò)程
分段存儲(chǔ)
索引數(shù)據(jù)在磁盤(pán)上的是以分段形式存儲(chǔ)的。“段”是Elasticsearch從Lucene中繼承的概念。在索引中,索引文件被拆分為多個(gè)子文件,其中每個(gè)子文件就叫作段,每個(gè)段都是一個(gè)倒排索引的小單元。段具有不變性,一旦索引的數(shù)據(jù)被寫(xiě)入硬盤(pán),就不能再修改。
延遲寫(xiě)策略
在Elasticsearch中,索引寫(xiě)入磁盤(pán)的過(guò)程是異步的。因此,為了提升寫(xiě)的性能,Elasticsearch并沒(méi)有每新增一條數(shù)據(jù)就增加一個(gè)段到磁盤(pán)上,而是采用延遲寫(xiě)策略。
雖然延遲寫(xiě)策略可以減少數(shù)據(jù)往磁盤(pán)上寫(xiě)的次數(shù),提升Elasticsearch的整體寫(xiě)入能力,但文件緩存系統(tǒng)的引入同時(shí)也帶來(lái)了數(shù)據(jù)丟失的風(fēng)險(xiǎn),如機(jī)房斷電等。為此,Elasticsearch引入事務(wù)日志(Translog)機(jī)制。事務(wù)日志用于記錄所有還沒(méi)有持久化到磁盤(pán)的數(shù)據(jù)。
段合并
在Elasticsearch自動(dòng)刷新流程中,每秒都會(huì)創(chuàng)建一個(gè)新的段。這自然會(huì)導(dǎo)致短時(shí)間內(nèi)段的數(shù)量猛增,而當(dāng)段數(shù)量太多時(shí)會(huì)帶來(lái)較大的資源消耗,如對(duì)文件句柄、內(nèi)存和CPU的消耗。而在內(nèi)容搜索階段,由于搜索請(qǐng)求要檢查到每個(gè)段,然后合并查詢結(jié)果,因此段越多,搜索速度越慢。為此,Elasticsearch引入段合并機(jī)制。段合并機(jī)制在后臺(tái)定期進(jìn)行,從而小的段被合并到大的段,然后這些大的段再被合并到更大的段。
在段合并過(guò)程中,Elasticsearch會(huì)將那些舊的已刪除文檔從文件系統(tǒng)中清除。被刪除的文檔不會(huì)被拷貝到新的大段中,當(dāng)然,在合并的過(guò)程中不會(huì)中斷索引和搜索。
第5章 高級(jí)客戶端文檔實(shí)戰(zhàn)一
...
[待補(bǔ)充]
3,第三部分 Elasticsearch生態(tài)
第9章 Elasticsearch插件
(1) 分析插件
一般分析器會(huì)包含三個(gè)部分:
(1)character filter:分詞之前的預(yù)處理,過(guò)濾HTML標(biāo)簽、特殊符號(hào)轉(zhuǎn)換等。
(2)tokenizer:用于分詞。
(3)token filter:用于標(biāo)準(zhǔn)化輸出。
第10章 Elasticsearch生態(tài)圈
(1)ELK和部署架構(gòu)變更
ELK Stack指的就是Elastic Stack。
“ELK”是三個(gè)開(kāi)源項(xiàng)目的首字母縮寫(xiě),這三個(gè)項(xiàng)目分別是:Elasticsearch、Logstash和Kibana,如圖10-1所示。當(dāng)然,這并非是Elastic Stack的全部,讀者可以根據(jù)需要在生態(tài)中添加Redis、Kafka、Filebeat等軟件。

在當(dāng)前的軟件開(kāi)發(fā)過(guò)程中,業(yè)務(wù)發(fā)展節(jié)奏越來(lái)越快,服務(wù)器梳理越來(lái)越多,隨之而來(lái)的就是各種訪問(wèn)日志、應(yīng)用日志和錯(cuò)誤日志。這時(shí)ELK就可以“隆重登場(chǎng)”啦!
首先,我們使用Logstash進(jìn)行日志的搜集、分析和過(guò)濾。一般工作方式為C/S架構(gòu),Client端會(huì)被安裝在需要收集日志的主機(jī)上,Server端則負(fù)責(zé)收集的各節(jié)點(diǎn)的日志數(shù)據(jù),并進(jìn)行過(guò)濾、修改和分析等操作,預(yù)處理過(guò)的數(shù)據(jù)會(huì)一并發(fā)到Elasticsearch上。
隨后將Kibana接入Elasticsearch,并為L(zhǎng)ogstash和Elasticsearch提供日志分析友好的Web界面,幫助用戶匯總、分析和搜索重要數(shù)據(jù)的日志。
ELK架構(gòu)為數(shù)據(jù)分布式存儲(chǔ)、可視化查詢和日志解析創(chuàng)建了一個(gè)功能強(qiáng)大的管理鏈。
1. 最簡(jiǎn)單的一種ELK部署架構(gòu)方式

首先由分布于各個(gè)服務(wù)節(jié)點(diǎn)上的Logstash搜集相關(guān)日志和數(shù)據(jù),經(jīng)過(guò)Logstash的分析和過(guò)濾后發(fā)送給遠(yuǎn)端服務(wù)器上的Elasticsearch進(jìn)行存儲(chǔ)。Elasticsearch將數(shù)據(jù)以分片的形式壓縮存儲(chǔ),并提供多種API供用戶進(jìn)行查詢操作。用戶還可以通過(guò)配置Kibana Web Portal對(duì)日志進(jìn)行查詢,并根據(jù)數(shù)據(jù)生成報(bào)表。
該架構(gòu)最顯著的優(yōu)點(diǎn)是搭建簡(jiǎn)單,易于上手。但缺點(diǎn)同樣很突出,因?yàn)長(zhǎng)ogstash消耗資源較大,所以在運(yùn)行時(shí)會(huì)占用很多的CPU和內(nèi)存。并且系統(tǒng)中沒(méi)有消息隊(duì)列緩存等持久化手段,因而存在數(shù)據(jù)丟失隱患。因此,一般這種部署架構(gòu)通常用于學(xué)習(xí)和小規(guī)模集群。
2. 消息隊(duì)列機(jī)制的ELK架構(gòu)

位于各個(gè)節(jié)點(diǎn)上的Logstash客戶端先將數(shù)據(jù)和日志等內(nèi)容傳遞給Kafka,當(dāng)然,也可以用其他消息機(jī)制,如各類MQ(Message Queue)和Redis等。Kafka會(huì)將隊(duì)列中的消息和數(shù)據(jù)傳遞給Logstash,經(jīng)過(guò)Logstash的過(guò)濾和分析等處理后,傳遞給Elasticsearch進(jìn)行存儲(chǔ)。最后由Kibana將日志和數(shù)據(jù)呈現(xiàn)給用戶。在該部署架構(gòu)中,Kafka的引入使得即使遠(yuǎn)端Logstash因故障而停止運(yùn)行,數(shù)據(jù)也會(huì)被存儲(chǔ)下來(lái),從而避免數(shù)據(jù)丟失。
第二種部署架構(gòu)解決了數(shù)據(jù)的可靠性問(wèn)題,但Logstash的資源消耗依然較多
3. 引入Logstash-forwarder架構(gòu)

Logstash-forwarder將日志數(shù)據(jù)搜集并統(tǒng)一后發(fā)送給主節(jié)點(diǎn)上的Logstash,Logstash在分析和過(guò)濾日志數(shù)據(jù)后,把日志數(shù)據(jù)發(fā)送至Elasticsearch進(jìn)行存儲(chǔ),最后由Kibana將數(shù)據(jù)呈現(xiàn)給用戶。這種架構(gòu)解決了Logstash在各計(jì)算機(jī)點(diǎn)上占用系統(tǒng)資源較多的問(wèn)題。與Logstash相比,Logstash-forwarder所占系統(tǒng)的CPU和內(nèi)存幾乎可以忽略不計(jì)。而且,Logstash-forwarder的數(shù)據(jù)安全性更好。Logstash-forwarder和Logstash之間的通信是通過(guò)SSL加密傳輸?shù)?,因此安全有保障?/p>
4. Beats引入的架構(gòu)

在實(shí)際使用中,Beats平臺(tái)在滿負(fù)荷狀態(tài)時(shí)所耗系統(tǒng)資源和Logstash-forwarder相當(dāng),但其擴(kuò)展性和靈活性更好。Beats平臺(tái)目前包含Packagebeat、Topbeat和Filebeat三個(gè)產(chǎn)品,均為Apache 2.0 License。同時(shí)用戶可以根據(jù)需要進(jìn)行二次開(kāi)發(fā)。
與前面三個(gè)部署架構(gòu)相比,顯然第四種架構(gòu)更靈活,可擴(kuò)展性更強(qiáng)。
(2)Logstash組件
Logstash由三部分組成,即輸入模塊(INPUTS)、過(guò)濾器模塊(FILTERS)和輸出模塊(OUTPUTS),如圖10-6所示。

Logstash能夠動(dòng)態(tài)地采集、轉(zhuǎn)換和傳輸數(shù)據(jù),不受格式或復(fù)雜度的影響。利用Grok從非結(jié)構(gòu)化數(shù)據(jù)中派生出結(jié)構(gòu),從IP地址解碼出地理坐標(biāo),匿名化或排除敏感字段,并簡(jiǎn)化整體處理過(guò)程。
1. Logstash的輸入模塊
Logstash支持各種輸入選擇,可以在同一時(shí)間從眾多常用來(lái)源捕捉事件,能夠以流式傳輸方式,輕松地從用戶的日志、指標(biāo)、Web應(yīng)用、數(shù)據(jù)存儲(chǔ)及各種AWS服務(wù)中采集數(shù)據(jù)。
為了支持各種數(shù)據(jù)輸入,Logstash提供了很多輸入插件,匯總?cè)缦隆?/p>
(1)azure_event_hubs:該插件從微軟Azure事件中心接收數(shù)據(jù)。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-input-azure_event_hubs獲取插件。
(2) beats:該插件從Elastic Beats框架接收數(shù)據(jù)。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-input-beats獲取插件。
(3)cloudwatch:該插件從Amazon Web Services CloudWatch API中提取數(shù)據(jù)。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-input-cloudwatch獲取插件。
(4)couchdb_changes:該插件從CouchDB更改URI的流式處理事件中獲取數(shù)據(jù)。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-input-couchdb_changes獲取插件。
(5)dead_letter_queue:該插件從logstash的dead letter隊(duì)列中讀取數(shù)據(jù)。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-input-dead_letter_queue獲取插件。
(6)elasticsearch:該插件從ElasticSearch群集中讀取查詢結(jié)果。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-input-elasticsearch獲取插件。
(7)exec:該插件將shell命令的輸出捕獲為事件,并獲取數(shù)據(jù)。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-input-exec獲取插件。
(8)file:該插件從文件流式處理中獲取數(shù)據(jù)。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-input-file獲取插件。
(9)ganglia:該插件通過(guò)UDP數(shù)據(jù)包讀取ganglia中的數(shù)據(jù)包來(lái)獲取數(shù)據(jù)。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-input-ganglia獲取插件。
(10)gelf:該插件從graylog2中讀取gelf格式的消息獲取數(shù)據(jù)。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-input-gelf獲取插件。
(11)http:該插件通過(guò)HTTP或HTTPS接收事件獲取數(shù)據(jù)。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-input-http獲取插件。
(12)jdbc:該插件通過(guò)JDBC接口從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-input-jdbc獲取插件。
(13)kafka:該插件從Kafka主題中讀取事件,從而獲取數(shù)據(jù)。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-input-kafka獲取插件。
(14)log4j:該插件通過(guò)TCP套接字從Log4J SocketAppender對(duì)象中讀取數(shù)據(jù)。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-input-log4j獲取插件。
(15)rabbitmq:該插件從RabbitMQ數(shù)據(jù)交換中提取數(shù)據(jù)。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-input-rabbitmq獲取插件。https://github.com/logstash-plugins/logstash-input-rabbitmq
(16)redis:該插件從redis實(shí)例中讀取數(shù)據(jù)。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-input-redis獲取插件。
2. Logstash過(guò)濾器
Logstash過(guò)濾器用于實(shí)時(shí)解析和轉(zhuǎn)換數(shù)據(jù)。
在數(shù)據(jù)從源傳輸?shù)酱鎯?chǔ)庫(kù)的過(guò)程中,Logstash過(guò)濾器能夠解析各個(gè)數(shù)據(jù)事件,識(shí)別已命名的字段,構(gòu)建對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu),并將它們轉(zhuǎn)換成通用格式,以便更輕松、更快速地進(jìn)行分析,實(shí)現(xiàn)商業(yè)價(jià)值。
在數(shù)據(jù)從源傳輸?shù)酱鎯?chǔ)庫(kù)的過(guò)程中,Logstash過(guò)濾器能夠解析各個(gè)數(shù)據(jù)事件,識(shí)別已命名的字段,構(gòu)建對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu),并將它們轉(zhuǎn)換成通用格式,以便更輕松、更快速地進(jìn)行分析,實(shí)現(xiàn)商業(yè)價(jià)值。
為了處理各種各樣的數(shù)據(jù)源,Logstash提供了豐富多樣的過(guò)濾器庫(kù),常用的過(guò)濾器插件匯總?cè)缦隆?/p>
(1)aggregate:該插件用于從一個(gè)任務(wù)的多個(gè)事件中聚合信息。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-filter-aggregate獲取插件。
(2)alter:該插件對(duì)mutate過(guò)濾器不處理的字段執(zhí)行常規(guī)處理。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-filter-alter獲取插件。
(3)bytes:該插件將以計(jì)算機(jī)存儲(chǔ)單位表示的字符串形式,如“123MB”或“5.6GB”,解析為以字節(jié)為單位的數(shù)值。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-filter-bytes獲取插件。
(4)cidr:該插件根據(jù)網(wǎng)絡(luò)塊列表檢查IP地址。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-filter-cidr獲取插件。
(5)cipher:該插件用于對(duì)事件應(yīng)用增加或移除密鑰。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-filter-cipher獲取插件。
(6)clone:該插件用于復(fù)制事件。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-filter-clone獲取插件。
(7)csv:該插件用于將逗號(hào)分隔的值數(shù)據(jù)解析為單個(gè)字段。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-filter-csv獲取插件。
(8)date:該插件用于分析字段中的日期,多用于事件日志中存儲(chǔ)的時(shí)間戳。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-filter-date獲取插件。
(9) dns:該插件用于執(zhí)行正向或反向DNS查找。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-filter-dns獲取插件。(10)elasticsearch:該插件用于將Elasticsearch日志事件中的字段復(fù)制到當(dāng)前事件中。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-filter-elasticsearch獲取插件。
(11)geoip該插件用于添加有關(guān)IP地址的地理信息。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-filter-geoip獲取插件。
(12)json:該插件用于解析JSON事件。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-filter-json獲取插件。
(13)kv:該插件用于分析鍵值對(duì)。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-filter-kv獲取插件。
(14)memcached:該插件用于提供與memcached中數(shù)據(jù)的集成。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-filter-memcached獲取插件。
(15)split:該插件用于將多行消息拆分為不同的事件。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-filter-split獲取插件。
3. Logstash的輸出模塊
Logstash的輸出模塊用于將目標(biāo)數(shù)據(jù)導(dǎo)出到用戶選擇的存儲(chǔ)庫(kù)。
在Logstash中,盡管Elasticsearch是Logstash官方首選的,但它并非唯一選擇。
(1) csv:該插件以CVS格式將結(jié)果數(shù)據(jù)寫(xiě)入磁盤(pán)。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-output-csv獲取插件。
(2) mongodb:該插件將結(jié)果數(shù)據(jù)寫(xiě)入MongoDB。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-output-mongodb獲取插件。
(3)elasticsearch:該插件將結(jié)果數(shù)據(jù)寫(xiě)入Elasticsearch。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-output-elasticsearch獲取插件。
(4)email:該插件將結(jié)果數(shù)據(jù)發(fā)送到指定的電子郵件。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-output-email獲取插件。
(5)kafka:該插件將結(jié)果數(shù)據(jù)寫(xiě)入Kafka的Topic主題。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-output-kafka獲取插件。
(6)file:該插件將結(jié)果數(shù)據(jù)寫(xiě)入磁盤(pán)上的文件。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-output-file獲取插件。(7)redis:該插件使用redis中的rpush命令將結(jié)果數(shù)據(jù)發(fā)送到redis隊(duì)列。讀者可訪問(wèn)GitHub官網(wǎng),搜索logstash-output-redis獲取插件。
(3)Kibana組件
Kibana是一個(gè)基于Web的圖形界面,可以讓用戶在Elasticsearch中使用圖形和圖表對(duì)數(shù)據(jù)進(jìn)行可視化。
在實(shí)際使用過(guò)程中,Kibana一般用于搜索、分析和可視化存儲(chǔ)在Elasticsearch指標(biāo)中的日志數(shù)據(jù)。Kibana利用Elasticsearch的REST接口檢索數(shù)據(jù),不僅允許用戶創(chuàng)建自己的數(shù)據(jù)定制儀表板視圖,還允許他們以特殊的方式查詢和過(guò)濾數(shù)據(jù)??梢哉f(shuō)從跟蹤、查詢、負(fù)載到理解請(qǐng)求如何流經(jīng)整個(gè)應(yīng)用,Kibana都能輕松完成。
Kibana提供了基本內(nèi)容服務(wù)、位置分析服務(wù)、時(shí)間序列服務(wù)、機(jī)器學(xué)習(xí)服務(wù),以及圖表和網(wǎng)絡(luò)服務(wù)。
(1)基本內(nèi)容服務(wù):指的是Kibana核心產(chǎn)品中搭載的一批經(jīng)典功能,如基于篩選數(shù)據(jù)繪制柱形圖、折線圖、餅圖、旭日?qǐng)D等。
(2)位置分析服務(wù):主要借助Elastic Maps探索位置數(shù)據(jù)。另外,還可以獲得創(chuàng)意,對(duì)定制圖層和矢量形狀進(jìn)行可視化。
(3)時(shí)間序列服務(wù):借助Kibana團(tuán)隊(duì)精選的時(shí)序數(shù)據(jù)UI,對(duì)用戶所用Elasticsearch中的數(shù)據(jù)執(zhí)行高級(jí)時(shí)間序列分析。因而,用戶可以利用功能強(qiáng)大、簡(jiǎn)單易學(xué)的表達(dá)式來(lái)描述查詢、轉(zhuǎn)換和可視化。
(4)機(jī)器學(xué)習(xí)服務(wù):主要是借助非監(jiān)督型機(jī)器學(xué)習(xí)功能檢測(cè)隱藏在用戶所用Elasticsearch數(shù)據(jù)中的異常情況,并探索那些對(duì)用戶有顯著影響的屬性。
(5)圖表和網(wǎng)絡(luò)服務(wù):憑借搜索引擎的相關(guān)性功能,結(jié)合Graph關(guān)聯(lián)分析,揭示用戶所用Elasticsearch數(shù)據(jù)中極其常見(jiàn)的關(guān)系。
此外,Kibana還支持用戶把Kibana可視化內(nèi)容分享給他人,如團(tuán)隊(duì)成員、老板、客戶、合規(guī)經(jīng)理或承包商等,進(jìn)而讓每個(gè)人都感受到Kibana的便利。除分享鏈接外,Kibana還有其他內(nèi)容輸出形式,如嵌入儀表板,導(dǎo)出為PDF、PNG或CSV等格式文件,以便把這些文件作為附件發(fā)送給他人。
KIBANA示例圖:

(4)Beats組件
Logstash在數(shù)據(jù)收集上并不出色,而作為代理,其性能也并不達(dá)標(biāo)。于是,Elastic官方發(fā)布了Beats系列輕量級(jí)采集組件。
Beats平臺(tái)集合了多種單一用途的數(shù)據(jù)采集器。它們從成百上千臺(tái)機(jī)器和系統(tǒng)向Logstash或Elasticsearch發(fā)送數(shù)據(jù)。
Beats是一組輕量級(jí)采集程序的統(tǒng)稱,如圖10-14所示。

Beats中包括但不限于以下組件:
(1)Filebeat:該組件會(huì)進(jìn)行文件和目錄的采集,主要用于收集日志數(shù)據(jù)。
(2)Metricbeat:該組件會(huì)進(jìn)行指標(biāo)采集。這里說(shuō)的指標(biāo)可以是系統(tǒng)的,也可以是眾多中間件產(chǎn)品的。主要用于監(jiān)控系統(tǒng)和軟件的性能。
(3)Packetbeat:該組件通過(guò)網(wǎng)絡(luò)抓包和協(xié)議分析,對(duì)一些請(qǐng)求響應(yīng)式的系統(tǒng)通信進(jìn)行監(jiān)控和數(shù)據(jù)收集,可以收集到很多常規(guī)方式無(wú)法收集到的信息。
(4)Winlogbeat:該組件專門(mén)針對(duì)Windows的event log進(jìn)行數(shù)據(jù)采集。
(5)Audibeat:該組件用于審計(jì)數(shù)據(jù)場(chǎng)景,收集審計(jì)日志。
(6)Heartbeat:該組件用于系統(tǒng)間連通性檢測(cè),如ICMP、TCP、HTTP等的連通性監(jiān)控。
(7)Functionbeat:該組件用于無(wú)須服務(wù)器的采集器。
官方支持的7種組件與ELK的數(shù)據(jù)流轉(zhuǎn)關(guān)系如圖10-15所示。

Beats輕量級(jí)設(shè)計(jì)的實(shí)現(xiàn)
Beats是一組輕量級(jí)采集程序的統(tǒng)稱,那么Beats是如何做到輕量級(jí)的呢?
(1)數(shù)據(jù)處理簡(jiǎn)單。在數(shù)據(jù)收集層面,Beats并不進(jìn)行過(guò)于復(fù)雜的數(shù)據(jù)處理,只是將數(shù)據(jù)簡(jiǎn)單的組織并上報(bào)給上游系統(tǒng)。
(2)并發(fā)性好、便于部署。Beats采用Go語(yǔ)言開(kāi)發(fā)而成。
因此,Beats的性能顯著好于Logstash。
Beats架構(gòu)設(shè)計(jì)
Beats之所以有上乘的性能及良好的可擴(kuò)展性,能獲得如此強(qiáng)大的開(kāi)源支持,其根本原因在于它有一套設(shè)計(jì)良好的代碼框架。Beats的架構(gòu)設(shè)計(jì)如圖10-16所示。

libbeat是Beats的核心包。在Beats架構(gòu)中,有輸出模塊(Publisher)、數(shù)據(jù)收集模塊(Logging)、配置文件模塊(Configuration)、日志處理模塊和守護(hù)進(jìn)程模塊(Daemon/service)。其中,輸出模塊負(fù)責(zé)將收集到的數(shù)據(jù)發(fā)送給Logstash或者Elasticsearch。
因?yàn)镚o語(yǔ)言天然就有channel,所以收集數(shù)據(jù)的邏輯代碼與輸出模塊都是通過(guò)channel通信的。也就是說(shuō),兩個(gè)模塊的耦合度最低。
4.參考
(1) 《Elasticsearch實(shí)戰(zhàn)與原理解析》
https://weread.qq.com/web/reader/01a32c5071d7c79a01a0831
(2)配套源代碼
http://www.broadview.com.cn/file/resource/003179083145134038138254251183181156060026092118