【Elasticsearch學習】之基礎概念
- 2020 年 5 月 3 日
- 筆記
- ElasticSeach, Elasticsearch學習, 分片, 概念, 索引, 節點, 集群
Elasticsearch是一個近實時的分佈式搜索引起,其底層基於開源全文搜索庫Lucene;Elasticsearch對Lucene進行分裝,對外提供REST API 的操作接口。基於 ES,可以快速的搭建全文搜索引擎;除了搜索功能, ES還可以對數據進行分析:如日誌分析、指標分析,同時還提供了機器學習功能。同時Elasticsearch有一個完整的生態圈,Elastic提供了數據可視化組件:kibana,數據抓取組件:logstash,filebeat。
ES相關概念
1.ES集群
Elasticsearch是一個分佈式系統,具有高可用性及可擴展性,當集群中有節點停止或丟失時不會影響集群的服務以及數據的丟失;同時當訪問量或數據量增加時可用採用橫向擴展的方式,增加節點,將請求或數據分散到集群的各個節點上。不同的集群通過不同的名字來區分,集群默認的名字為「elasticsearch「,如果節點的集群名稱一樣,則這些節點組成為一個集群。
集群名的設置方式:
1).es配置文件中設置cluster.name:elasticsearch集群名
2).節點啟動命令中指定集群名:-E cluster.name:elasticsearch集群名
2.ES節點
一個節點是一個ElasticSearch的實例,本質上是一個Java進程。
ES節點類型列表:
節點類型 |
節點作用 |
節點配置參數 |
默認值 |
Master Node |
處理創建、刪除索引等操作,決定分片被分配到哪個節點,負責索引的創建刪除,維護並更新集群狀態。 |
node.master |
true |
Data Node |
可以保存數據的節點,處理與數據相關的操作,如索引的CRUD、搜索和聚合,數據節點的操作屬於I/O、內存和CPU密集型操作。 |
node.data |
true |
Ingest Node |
提取節點,具有數據預處理的能力,可攔截Index或Bulk Api的請求,可對數據進行轉換,並重新返回Index或Bulk Api,默認配置下,所有節點都是Ingest Node。 |
node.ingest |
true |
Coordinating Node |
協調節點,負責接受客戶端的請求,並將請求分發到合適的節點,並將各節點返回的數據匯聚到一起。每個節點都默認是Coordinating Node。 |
無 |
設置master、data、ingest全為false |
Maching Learning Node |
機器學習節點,用於運行作業和處理機器學習API請求。 |
node.ml |
true,需要enablex-pack |
默認情況下一個節點承擔了所有的節點角色。但是在生產環境中,建議根據數據量,寫入及查詢的吞吐量,選擇合適的部署方式,最好將節點設置為單一角色。
單一角色節點配置方式:
節點類型 |
單一角色配置 |
機器配置 |
Master Node |
node.master: true node.data: false node.ingest: false |
低配置CPU、RAM、磁盤 |
Data Node |
node.master: false node.data: true node.ingest: false |
高配置CPU、RAM、磁盤 |
Ingest Node |
node.master: false node.data: false node.ingest: true |
低配置CPU、中等配置RAM、低配置磁盤 |
Coordinating Node |
node.master: false node.data: false node.ingest: false |
中高配置CPU、中高配置RAM、低配置磁盤 |
Master eligible Node(主節點候選節點)選主過程:
Master eligible Node互ping對方,節點Id小的會被選舉為Master節點,其他節點加入集群時,不會承擔Master節點的角色;當集群中選舉出的Master節點丟失,會重新進行選舉。
選主過程腦裂問題:
腦裂問題是分佈式系統集群環境中必然會遇到的問題,會引起集群存在多個主節點,如當出現網絡問題,一個節點和其他節點無法連接時,會發生腦裂問題。
避免發送腦裂問題的方法:
1.限定集群節點的選舉條件,設置quorum(仲裁),只有在Master eligible節點數大於quorum時,才能進行選舉。
設置discovery.zen.minimum_master_nodes(默認為1):官方的推薦值是(N/2)+1,其中N是master eligible節點的數量。
2.設置discovery.zen.ping_timeout(默認值為3秒):默認情況下,如果master節點在3秒之內沒有應答,則認為該節點宕掉,增加等待節點響應的時間,一定程度上會減少誤判,降低腦裂發生的概率。
3.ES文檔
文檔是ES的最小單位,通常用JSON方式的數據結構表示,類似於數據庫中的一條記錄。文檔具有以下特徵:
1.自我包含,一篇文檔同時包含字段和它們的取值。
2.層次型結構,文檔中可以包含新的文檔。
3.靈活的結構,不依賴於預先定義的模式,文檔是無模式的,並非所有的文檔都需要擁有相同的字段。
文檔的元數據:_index:文檔所屬的索引名;_type:文檔所屬的類型名;_id文檔的唯一id,_source:文檔的原始json數據,_version文檔的版本信 息,_score:文檔的相關性打分。
4.ES類型
類型是文檔的邏輯容器,類似於數據庫中的表,類型在 Elasticsearch中表示一類相似的文檔,每個類型中字段的定義稱為映射。ES7.x已經將類型移除,7.x中一個索引只能有一個類型,默認為_doc。
5.ES映射
mapping映射, 就像數據庫中的 schema ,定義索引中字段的名稱,定義字段的數據類型(如 string, integer 或 date),設置字段倒排索引的相關配置。當 Elasticsearch 遇到文檔中以前未遇到的字段,會使用dynamic mapping 來確定字段的數據類型,並自動把新的字段添加到類型映射。在實際生產中一般或禁用dynamic mapping,避免過多的字段導致cluster state佔用過多,同時禁止自動創建索引的功能,創建索引時必須提供Mapping信息或者通過Index Template創建。
6.ES索引
索引是映射類型的容器,類似於數據庫。
7.ES分片
一個分片是一個運行的Lucene的實例,是一個包含倒排索引的文件目錄。一個ES索引由一個或多個主分片以及零個或多個副本分片組成,主分片數在索引創建是指定,後續不允許修改;副本分片主要用於解決數據高可用的問題,是主分片的拷貝,一定程度上提高服務的可讀性。
分片的設定:生產環境中主分片數的設定,需要提前做好容量規劃,因為主分片的數量是不可修改的。
分片數設置過小:無法通過增加節點實現水平擴展,單個分片的數據量太大,導致數據重新分片耗時;分片數設置過大:影響搜索結果的相關性打分,浪費資源,同時影響性能。