Elasticsearch叢集的概念
叢集的作用
高可用
高可用(High Availability)是分布式系統架構設計中必須考慮的因素之一,它通常是指,通過設計減少系統不能提供服務的時間。如果系統每運作100個時間機關,會有1個時間機關無法提供服務,我們說系統的可 用性是99%。
負載均衡
将流量均衡的分布在不同的節點上,每個節點都可以處理一部分負載,并且可以在節點之間動态配置設定負載,以實作平衡。
高性能
将流量分發到不同機器,充分利用多機器多CPU,從串行計算到并行計算提高系統性能。
Elasticsearch叢集的組成
叢集(Cluster)
一個 Elasticsearch 叢集由一個或多個節點(Node)組成,每個叢集都有一個共同的叢集名稱作為辨別。
節點(Node)
一個Elasticsearch執行個體即一個Node,雖然一台機器可以有多個執行個體,但正常使用下每個執行個體應該會部署在不同的機器上。預設情況下一個節點會加入一個名稱為“elasticsearch”的叢集。此時不修改配置的情況下,如果直接啟動一堆節點,那麼它們會自動組成一個elasticsearch叢集。
分片
單台機器無法存儲大量資料,Elasticsearch會将一個索引中的資料切分到多個分片中。這樣就可以提高Elasticsearch的橫向擴充能力,提供資料的存儲數量。讓搜尋和分析等操作分布到多台伺服器上去執行,提升吞吐量和性能。
主分片(shard)和複制分片(replica)
每個分片又主分片和複制分片組成。複制分片是主分片的拷貝。replica可以在shard故障時提供備用服務,保證資料不丢失,多個replica還可以提升搜尋操作的吞吐量和性能。主分片建立索引時候需要進行設定且不能修改,但是一個索引的複制分片的數量可以動态地調整,而索引建立時候預設為10個shard,5個主分片以及5個複制分片。
關于Elasticsearch的主分片
- 一個索引包含多個分片,在多個伺服器叢集部署的情況下,一個索引的資料會存在多個不同的伺服器上。
- 每一條資料(document)隻會存在于某一個主分片以及其所屬的複制分片中。
- 複制分片除了負責主分片的容錯保證,還承擔了讀請求處理的負載任務。
- 在索引建立的時候主分片的數量就被固定下來了,後續無法進行修改。而主分片對應複制分片數是可以在後續調整的。
- 一個索引預設建立十個分片,其中5個主分片、5個複制分片。
- 一個複制分片不能和自己的主分片放在一個伺服器上,是以要實作高可用,正常至少需要2台服務。
Elasticsearch叢集的節點
多個節點組成了Elasticsearch叢集,而Elasticsearch對于節點通過不同的配置可以使節點實作不同的業務場景。關于節點的配置主要有兩個屬性
node.master:false
node.data:false
node.master
屬性控制此節點是否可以成為主節點。
node.data
屬性控制此節點是否可以存儲資料。
主節點
主節點主要負責叢集的協調工作,配置成為主節點的節點并不一定是主節點,此配置主要是表明此節點可以競選成為主節點。
主節點的作用主要是下面内容:
- 索引的建立和删除。
- 跟蹤叢集中節點資訊。
- 負責為節點配置設定分片。
主節點的配置主要用下面兩種:
node.master:true
node.data:true
這種配置下的主節點隻存在協調作用,無法存儲資料
node.master:true
node.data:false
資料節點
資料節點隻負責叢集資料的存儲,不參與主節點的競争也不負責叢集協調工作。
當節點為資料節點的時候,其負責:
- 存儲索引資料。
- 負責對文檔進行增删查改以及聚合操作。
資料節點的配置是下面内容
node.master:false
node.data:true
用戶端節點
用戶端節點,既無法存儲資料也不能競選為主節點,其主要負責的内容是下面:
- 處理路由請求
- 處理搜尋
- 分發索引
部落節點
部落節點主要實作了跨叢集的操作。部落節點需要配置的多個叢集的資訊,可以在多個叢集中實作讀寫操作,但是當叢集名稱重複的時候,部落節點隻能連接配接其中一個節點,
部落節點參數配置
tribe:
{連接配接叢集的别名A}:
cluster.name: {叢集A}
{連接配接叢集的别名B}:
cluster.name: {叢集B}
攝取節點(Ingest節點)
攝取節點更類似一種資料過濾器。在批量請求或索引操作之前,Ingest節點攔截請求,并對文檔進行處理。常見的用途是解析字元串中的日期,字元串和整數的轉換。
器配置需要下面内容
node.ingest:true
叢集環境下寫資料的過程
- 用戶端選擇一個協調節點(coordinating node)發送請求。
- 此節點對docment進行路由,然後将請求轉發給對應的node。
- 接收請求的節點對應的主分片進行處理請求然後将資料同步到對應的複制分片,完成資料處理後,傳回請求給用戶端。
其主要流程
graph TD
資料互動-->用戶端節點
用戶端節點-->|路由|目标節點
目标節點-->主分片
主分片-->|處理請求完畢後同步資料|複制分片
防止叢集出現“腦裂”
7.X以下的版本
預設情況下
discovery.zen.minimum_master_nodes
屬性被設定為1。此屬性定義了為了形成叢集,必須要有多少個具備主節點資格并互相連接配接的節點的最小數量。
在使用預設資料的情況下
當我們使用三個節點的叢集時候,當有一個節點和另外兩個節點無法互通的時候,此叢集将會形成兩個獨立的叢集運作。這個時候可能出現資料的錯誤或者丢失。
這個時候設定
discovery.zen.minimum_master_nodes
屬性為2的後。當存在一個節點無法互通的時候,另外兩個節點依然會保持叢集運作。但另外一個節點因為不滿足兩個主節點的限制則不會成為一個新的叢集。當斷開連接配接的節點恢複通訊後,會重新加入叢集中。
是以為了防止出現上面的情況,elasticsearch叢集中主節點的數量需要大于等于3。并且
discovery.zen.minimum_master_nodes
屬性的值應該為:主節點數量/2 + 1;
7.X版本
在最新的版本中elasticsearch已經移除了discovery.zen.minimum_master_nodes參數。Elasticsearch 自己選擇可以形成仲裁的節點。從7.0開始,如果想要啟動一個全新的叢集,并且叢集在多台主機上都有節點,就必須指定該叢集在第一次選舉中應該使用的一組符合主節點條件的節點作為選舉配置。也就是叢集引導,已經加入叢集的節點将選舉配置存儲在它們的資料檔案夾中,并在重新啟動後重用這些配置,而正在加入現有叢集的新節點可以從叢集的目前主節點接收這些資訊。
可以通過為 cluster.initial_master_nodes參數設定一系列符合主節點條件的節點的主機名或 IP 位址來引導啟動叢集。
關于節點的内容可以檢視:https://www.elastic.co/guide/en/elasticsearch/reference/6.6/modules-node.html
個人水準有限,上面的内容可能存在沒有描述清楚或者錯誤的地方,假如開發同學發現了,請及時告知,我會第一時間修改相關内容。假如我的這篇内容對你有任何幫助的話,麻煩給我點一個贊。你的點贊就是我前進的動力。