1. 程式人生 > >【Elasticsearch學習】之基礎概念

【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索引由一個或多個主分片以及零個或多個副本分片組成,主分片數在索引建立是指定,後續不允許修改;副本分片主要用於解決資料高可用的問題,是主分片的拷貝,一定程度上提高服務的可讀性。

  分片的設定:生產環境中主分片數的設定,需要提前做好容量規劃,因為主分片的數量是不可修改的。

  分片數設定過小:無法通過增加節點實現水平擴充套件,單個分片的資料量太大,導致資料重新分片耗時;分片數設定過大:影響搜尋結果的相關性打分,浪費資源,同時影響性