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索引由一個或多個主分片以及零個或多個副本分片組成,主分片數在索引建立是指定,後續不允許修改;副本分片主要用於解決資料高可用的問題,是主分片的拷貝,一定程度上提高服務的可讀性。
分片的設定:生產環境中主分片數的設定,需要提前做好容量規劃,因為主分片的數量是不可修改的。
分片數設定過小:無法通過增加節點實現水平擴充套件,單個分片的資料量太大,導致資料重新分片耗時;分片數設定過大:影響搜尋結果的相關性打分,浪費資源,同時影響效能。