文章目錄
- 基本概念:文檔和索引
- JSON文檔
- 元數據
- 索引
- REST API
- 節點和集群
- 節點
- Master eligible節點和Master節點
- Data Node 和 Coordinating Node
- 其它節點
- 分片(Primary Shard & Replica Shard)
- 分片的設定
- 操作命令
基本概念:文檔和索引
Elasticsearch是面向文檔的,文檔是所有可搜索數據的最小單位。
- 文檔會被序列化成JSON格式,保存在Elasticsearch中。
- JSON對象由字段組成,每個字段都有對應的字段類型(字符串/數值/布爾/日期/二進制/范圍類型)。
- 每個文檔都有一個UniqueID,你可以自己指定ID,或者通過Elasticsearch自動生成。
JSON文檔
一篇文檔包含了一系列的字段,類似數據庫表中一條記錄,字段的類型可以指定或者通過Elasticsearch自動推算,支持數組,支持嵌套。
元數據
每一個文檔都有一個元數據,元數據是用于標注文檔的相關信息的。
- _index: 文檔所屬的索引名
- _type:文檔所屬的類型名
- _id:文檔唯一ld
- _source:文檔的原始Json數據
- _all:整合所有字段內容到該字段,7.0版本已被廢除
- _version:文檔的版本信息
- _score:相關性打分
索引
索引(Index)是文檔的容器,是一類文檔的結合。
- Index體現了邏輯空間的概念:每個索引都有自己的Mapping定義,用于定義包含的文檔的字段名和字段類型;
- Shard體現了物理空間的概念:索引中的數據分散在Shard上
- 索引的 Mapping定義文檔字段的類型,Setting定義不同的數據分布
{"settings": {"index": {"creation_date": "1690724511450","number_of_shards": "1","number_of_replicas": "1","uuid": "fl-Kf7M9TiiEpFPfAT6Iew","version": {"created": "7010099"},"provided_name": "movies"}}
REST API
補充:kibana顯示中文界面,打開 kibana/config/kibana.yml,最后一行寫入 i18n.locale: “zh-CN”,然后重新啟動kibana
進入Kibana頁面–>開發工具–>console:
//查看索引信息
GET kibana_sample_data_ecommerce//查看索引的文檔總數
GET kibana_sample_data_ecommerce/_count//_cat相關
//根據索引名稱關鍵詞通配符查詢
GET /_cat/indices/kibana*?&s=index//按照文檔個數排序
GET /_cat/indices?v&s=docs.count:desc//查看狀態為green的索引
GET /_cat/indices?v&health=green//查看每個索引占用的內存
GET /_cat/indices?v&h=i,tm&s=tm:desc
節點和集群
Elasticsearch分布式系統的高可用性和可擴展性:
- 服務可用性-允許有節點停止服務
- 數據可用性-部分節點丟失,不會丟失數據
- 請求量提升/數據的不斷增長(將數據分布到所有節點上)
Elasticsearch分布式架構的特點
- 存儲的水平擴容
- 提高系統的可用性,部分節點停止服務,整個集群的服務不受影響
- 不同的集群通過不同的名字來區分,默認名字“elasticsearch”,也可以通過配置文件修改,或者在命令行中-E cluster.name=geektime進行設定
- 一個集群可以有一個或者多個節點
節點
- 節點是一個 Elasticsearch的實例,其本質上就是一個 JAVA進程,一臺機器 上可以運行多個Elasticsearch進程,但是生產環境一般建議一臺機器上只運行一個Elasticsearch實例;
- 每一個節點都有名字, 通過配置文件配置,或者啟動時候 -E node.name=node1 指定。每一個節點在啟動之后,會分配一個UID,保存在data目錄下。
Master eligible節點和Master節點
- 每個節點啟動后,默認就是一個Master eligible節點(可以通過設置node.master: false 禁止)
- Master-eligible節點可以參加選主流程,成為Master 節點;當第一個節點啟動時候,它會將自己選舉成Master節點。
- 每個節點上都保存了集群的狀態,只有Master節點才能修改集群的狀態信息。
- 集群狀態(Cluster State) 維護了一個集群中必要的信息,包括:所有的節點信息、所有的索引和其相關的Mapping與Setting 信息、分片的路由信息。任意節點都能修改信息會導致數據的不一致性。
Data Node 和 Coordinating Node
- 可以保存數據的節點,叫做Data Node,負責保存分片數據,在數據擴展上起到了至關重要的作用。
- Coordinating Node:負責接受Client的請求,將請求分發到合適的節點,最終把結果匯集到一起;每個節點默認都起到了Coordinating Node的職責。
其它節點
- Hot & Warm Node:不同硬件配置的Data Node, 用來實現Hot & Warm架構,降低集群部署的成本
- Machine L earning Node:負責跑機器學習的Job,用來做異常檢測
*Tribe Node:(5.3開始使用Cross Cluster Serarch) Tribe Node連接到不同的Elasticsearch集群,并且支持將這些集群當成一個單獨的集群處理
分片(Primary Shard & Replica Shard)
- 主分片,用以解決數據水平擴展的問題。通過主分片,可以將數據分布到集群內的所有節點之上。一個分片是一個運行的Lucene的實例。主分片數在索引|創建時指定,后續不允許修改,除非Reindex。
- 副本用以解決數據高可用的問題。分片是主分片的拷貝副本分片數,可以動態地調整。增加副本數,還可以在一定程度上提高服務的可用性(讀取的吞吐)
分片的設定
- 對于生產環境中分片的設定,需要提前做好容量規劃。如果分片數設置過小,導致后續無法增加節點實現水品擴展;如果單個分片的數據量太大,導致數據重新分配耗時。
- 分片數設置過大,7.0開始,默認主分片設置成1, 解決了over-sharding的問題,影響搜索結果的相關性打分,影響統計結果的準確性;單個節點上過多的分片,會導致資源浪費,同時也會影響性能。
操作命令
通過 GET _cluster/health
可以查看集群的健康度
其中 status的含義如下:
- Green- 主分片與副本都正常分配
- Yellow -主分片全部正常分配,有副本分片未能正常分配
- Red -有主分片未能分配例如,當服務器的磁盤容量超過85%時,去創建了一個新的索引
#查看健康度(按下Command+/可以跳轉到官網查看詳細用法)
GET _cluster/health#查看node信息
GET _cat/nodes #查看shards信息
GET _cat/shards