為什麼是Elasticsearch
es
是一種在分散式環境中快速、可擴充套件的搜尋和分析引擎。它建立在Apache Lucene
上。Lucene
定義如下
Apache Lucene是一種高效能、全功能的完全用java寫的廣西搜尋引擎庫。它是一種幾乎適合於任何需要全文搜尋,特別是跨平臺的應用程式的技術
Elasticseaarch
通過提供強大的RESTful API
隱藏了Lucene
背後的複雜性,使得查詢索引資料更容易,並使其適用於任何程式語言。Elasticsearch
可以基於PB
級別的結構化或者非結構化資料建立跨多臺伺服器的分散式實時分析,這大大擴充套件了Lucene
的能力
Elasticsearch
的基本概念
索引
- 索引是具備某些共同特徵的文件集
- 每一個索引包含多個型別,每個型別相應的包含多個文件,每個文件又包含多個欄位。在
es
中,一個索引包含多個JSON
格式的文件。在es
叢集中的數量可以是任意的 - 在
ELK
中,將Logstash
的JSON
文件傳送到es
時,它們被儲存為預設的索引模式”logstash-
%{+YYYY.MM.dd
}” - 搜尋和查詢索引的
URL
看起來如下
文件
es
中的文件是指儲存在索引裡的JSON
格式的文件。每一個文件都有一個型別和相應的唯一標識(ID
)。例如,儲存在es
的文件看起來如下
欄位
- 欄位是文件內的基本單,基本欄位是如下鍵值對
book_name : “learning elk”
型別
- 用於提供索引中的邏輯分割槽。它基本上代表一類類似的文件型別。一個索引可以有多個型別,可以根據上下文來定義它們。如,
Facebook
的索引中可以使用post
作為一種索引型別,使用comments
作為另一種索引型別
對映
- 用來對映文件的每個欄位,以及欄位對應的資料型別,如
string
、integer
、float
、double
等
分片
- 儲存索引的實際物理實體。每個索引可以有多個儲存資料的主分片和副本分片。分片分佈在叢集的所有節點之間,並且在有節點失效或新節點加入時,可以從一個節點移動到另一節點
主分片和副本分片
- 索引檔案先儲存在主分片中,然後再儲存到相應的副本分片中。預設情況下,每個索引的主分片數量是5,當然我們也可以根據需要自行配置
- 副本分片通常與主分片駐留在不同的節點上,以便於滿足多個請求情況下的故障轉移和負載均衡
叢集
- 儲存索引資料的節點集合。將資料儲存在叢集中來提供水平擴充套件能力。每個叢集都有一個叢集名稱來表示,以便不同的節點辨識連線。叢集名稱在
elasticsearch.yml
配置檔案中名為cluster.name
的屬性配置,預設為Elasticsearch: cluster.name: elasticsearch
節點
- 是一個單一的
Elasticsearch
執行例項,屬於某個叢集。節點可以扮演三種角色
資料節點:用於索引文件,以及對這些文件執行搜尋操作。如果要提升效能或者擴充套件叢集,通常建議新增更多的資料節點。在elasticsearch.yml配置檔案設定節點屬性就可以將節點變成資料節點
node.master = false
node.data = true
主節點:負責叢集的管理。對於大叢集,建議有三個專用的主節點(一主兩備),它們只作為主節點,不儲存索引或執行搜尋。配置如下
node.master = true
node.data = false
路由節點或負載均衡節點:既不作為主節點也不擔當資料節點角色。只用於負載均衡,或路由搜尋請求,又或將文件索引到適當的節點。這對於高負荷的搜尋或索引操作非常有用
node.master = false
node.data = false
探索Elasticsearch API
- 查詢叢集
API
常見語法
curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>/<OPERATION_NAME>?<QUERY_STRING>' -d '<BODY>'
VERB:請求方法型別,包括GET/POST/PUT/DELETE/HEAD
PROTOCOL:協議型別,http/https
HOST:叢集中主機名
PORT:es例項執行的埠,預設是9200
PATH:索引名、型別和要查詢的文件ID,例如:/index/type/id
OPERATION_NAME:執行操作的名稱,例如:_search,_count等
QUERY_STRING:查詢引數中指定可選引數。如?pretty用於完美輸出json文件
BODY:用於請求正文文字
curl -XGET 'http://localhost:9200/logstash-2020.08.08/_search?pretty'
列出所有可用索引
- 顯示儲存在叢集的節點所有索引、索引相關資訊,如健康值 、索引名稱、大小、文件的數量、主分片的數量等等
curl -XGET 'localhost:9200/_cat/indices?v'
列出叢集中的所有節點
curl -XGET 'http://localhost:9200/_cat/nodes?v'
檢查叢集的健康狀態
curl -XGET 'http://localhost:9200/_cluster/health?pretty'
- 從叢集層面、分片層面,或者索引層面來檢查健康狀態,使用類似如下的
URL
即可
curl -XGET 'http://localhost:9200/_cluster/health?level=cluster&pretty=true'
curl -XGET 'http://localhost:9200/_cluster/health?level=shareds&pretty=true'
curl -XGET 'http://localhost:9200/_cluster/health?level=indices&pretty=true'
叢集的健康狀態由三個參數列示
- 紅色:部分或全部的主分片尚未準備好提供服務
- 黃色:所有的主分片已成功分配,但部分或全部的分片尚未分配。一般情況下,單節點叢集始終是黃色的健康狀態,因為沒有副本分片節點
- 綠色:所有的主分片和副本分片分配成功,並且叢集正常動作
建立索引
- 在
ELK
中,索引是根據在Logstash
的es
輸出外掛中提供的索引名稱自動建立的。儘管如此,還是來看一下如何手工建立索引
curl -XPUT 'http://localhost:9200/<index_name>?pretty'
- 假如要建立一個名為
packtpub
的索引,可以執行以下命令
curl -XPUT 'http://localhost:9200/packtpub?pretty'
- 還可以在往索引內寫入文件的同時,直接建立索引
curl -XPUT 'http://localhost:9200/packtpub/elk/1?pretty' -d '
{
book_name : "learning elk"
}'
- 執行命令後的返回結果如下
{
"_index" : "packtpub",
"_type" : "elk",
"_id" : "1",
"_version" : 1,
"created" : true
}
檢索文件
curl -XGET 'http://localhost:9200/packtpub/elk/1?pretty'
- 執行以上命令後的返回結果如下
{
"_index" : "packtpub",
"_type" : "elk",
"_id" : "1",
"_version" : 1,
"found" : true,
"_source" : {
book_name : "learning elk"
}
}
- _
source
欄位包含了完整的文件
刪除文件
curl -XDELETE 'http://localhost:9200/packtpub/elk/1?pretty'
- 返回如下
{
"acknowledged" : true
}
Elasticsearch Query DSL
es
查詢語句的強大之處在於,其是一個基於json
的領域特定語言,稱為Query DSL
。Kibana
為了得到特定格式的結果,廣泛使用了Query DSL
curl -XPOST 'http://localhost:9200/logstash-*/_search' -d '
{
"query" : { "match_all" : {} },
"size" : 3
}'
- 如果按照某個欄位進行排序的話,可以如下處理
curl -XPOST 'http://localhost:9200/logstash-*/_search' -d '
{
"query" : { "match_all" : {} },
"sort" : { "open" : { "order" : "desc" } },
"size" : 3
}'
更詳細的Query DSL相關資料請參考官方文件
Elasticsearch
外掛
Bigdesk
外掛
- 藉助於實時圖表和
JVM
、CPU
、OS
、主分片以及副本分片相關的各種統計資訊,有助於分析叢集節點資訊
Elastic-Hammer
外掛
- 可作為
es
的前端介面。可用於查詢叢集,並在輸入查詢語句時提供語法檢查
Head
外掛
- 能夠生成叢集的統計資料,並提供瀏覽器查詢,同時還能對
es
索引進行結構化查詢
本作品採用《CC 協議》,轉載必須註明作者和本文連結