背景知識
ElasticSearch(下文簡稱ES)集群中,每一臺服務器都有自己的角色,有一部分服務器可以設定為候選Master(至少是3臺),也就是說這些服務器已經(jīng)具備成為Master角色的能力,但是具體誰最終成為Master是要通過選舉才可以。
在ES配置文件里,有兩個參數(shù)來決定該節(jié)點是否是候選Master或者Data節(jié)點,如果想讓某個節(jié)點只作為Data節(jié)點,那么需要將node.master設置為false,而node.data設置為true:
node.master: true/false node.data: true/false
上圖是一個ES集群的示意圖,其中NodeA是當前集群的Master,NodeB和NodeC是Master的候選節(jié)點,其中NodeA和NodeB同時也是數(shù)據(jù)節(jié)點(DataNode),此外,NodeD是一個單純的數(shù)據(jù)節(jié)點,Node_E是一個proxy節(jié)點。每個Node會跟其他所有Node建立連接。
節(jié)點發(fā)現(xiàn)
ES服務啟動后,首先要通過節(jié)點發(fā)現(xiàn)功能加入集群。ZenDiscovery是ES自己實現(xiàn)的一套用于節(jié)點發(fā)現(xiàn)和選主等功能的模塊,沒有依賴Zookeeper等工具。 簡單來說,節(jié)點發(fā)現(xiàn)依賴以下配置:
discovery.seed_hosts: ["192.168.222.101", "192.168.222.102", "192.168.222.103"]這個配置可以看作是,在本節(jié)點到每個discovery.sedd_hosts中的節(jié)點建立一條關聯(lián)線,當整個集群所有的node形成一個聯(lián)通圖時,所有節(jié)點都可以知道集群中有哪些節(jié)點存在了。
Master選舉
上面提到,集群中可能會有多個候選Master節(jié)點,此時就要進行Master選舉,保證只有一個當選Master。如果有多個節(jié)點當選為Master,則集群會出現(xiàn)腦裂,腦裂會破壞數(shù)據(jù)的一致性,導致集群行為不可控,產(chǎn)生各種非預期的影響。
腦裂示意圖
為了避免產(chǎn)生腦裂,ES采用了常見的分布式系統(tǒng)思路,保證選舉出的master被多數(shù)派(quorum)的候選Master節(jié)點認可,以此來保證只有一個Master。這個quorum通過以下配置進行配置:
discovery.zen.minimum_master_nodes: 2這個配置對于整個集群非常重要。
誰發(fā)起Master選舉
Master選舉是由候選Master節(jié)點發(fā)起,當一個候選Master節(jié)點發(fā)現(xiàn)滿足以下條件時就會發(fā)起選舉:
該候選Master節(jié)點的當前狀態(tài)不是Master;
該候選Master節(jié)點通過ZenDiscovery模塊的ping操作詢問其已知的集群其他節(jié)點,沒有任何節(jié)點連接到Master;
包括本節(jié)點在內,當前已有超過minimum_master_nodes個節(jié)點沒有連接到Master。
簡單講,就是當一個候選Master節(jié)點發(fā)現(xiàn)包括自己在內的多數(shù)候選Master節(jié)點認為集群沒有Master時,就可以發(fā)起Master選舉。
如何選舉
ES Master選舉有一套自己的算法,該算法是基于一種稱為“狀態(tài)機復制”的機制。狀態(tài)機復制的基本原理是,在一個分布式系統(tǒng)中,每個節(jié)點都有一份當前的狀態(tài),并且每個節(jié)點都可以獨立決定自己是否被選舉為Master節(jié)點。在ES集群中,每個節(jié)點都會比較當前節(jié)點和其他節(jié)點的狀態(tài),如果當前節(jié)點的狀態(tài)最新,則當前節(jié)點將被選為Master節(jié)點。
ES的選舉工作流程大致如下:
① 首先,所有候選Master節(jié)點都會比較自己的狀態(tài),如果自己的狀態(tài)最新,則發(fā)起投票;
② 其他節(jié)點收到投票后,也會比較自己的狀態(tài),如果自己的狀態(tài)最新,則會再次發(fā)起投票;
③ 當某個節(jié)點收到來自其他節(jié)點的投票,且自己的狀態(tài)最新時,則會將自己的狀態(tài)發(fā)送給其他節(jié)點,并同意自己被選為Master節(jié)點;
④ 其他節(jié)點收到來自Master節(jié)點的狀態(tài)后,會將自己的狀態(tài)更新,同意將Master節(jié)點選為Master節(jié)點(有點繞口);
⑤ 一旦Master節(jié)點確定,其他節(jié)點就會向Master節(jié)點發(fā)送心跳包,以確保Master節(jié)點的活動狀態(tài);
⑥ 如果Master節(jié)點失去連接,則其他節(jié)點會開始新的投票,以確定新的Master節(jié)點。
按照上述流程,我們描述一個簡單的場景來幫助大家理解:
假如集群中有3個候選Master節(jié)點,分別為Node_A、 Node_B、 Node_C。三個節(jié)點都認為當前沒有Master,于是都各自發(fā)起選舉。
假如此時Node_A的狀態(tài)最新,所以選舉結果都為Node_A。于是Node_A開始等選票,Node_B、Node_C都向Node_A發(fā)起投票,當Node_A接收到第一次投票(假如是Node_B發(fā)起的)時,加上它自己的一票,就獲得了兩票了(超過半數(shù)),于是Node_A成為Master。
有一點要說明,對于ES集群來說,當Master節(jié)點確立時,它就會等待其它節(jié)點join自己成為一個集群了,當所有其它非Master節(jié)點全部join到Master時,集群才算徹底創(chuàng)建完成。
審核編輯:劉清
-
服務器
+關注
關注
12文章
9308瀏覽量
86072 -
MASTER
+關注
關注
0文章
104瀏覽量
11331
原文標題:你知道ElasticSearch是如何進行master選舉的嗎
文章出處:【微信號:aming_linux,微信公眾號:阿銘linux】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
linux安裝配置ElasticSearch之源碼安裝
分析一下MySQL數(shù)據(jù)庫與ElasticSearch的實際應用
Elasticsearch+Fluentd+Kafka數(shù)據(jù)的采集流程講述
用區(qū)塊鏈技術進行選舉投票是否能行?烏克蘭中央選舉委員會試運行區(qū)塊鏈選舉投票系統(tǒng)
ElasticSearch是什么?應用場景是什么?
Elasticsearch保姆級入門
![<b class='flag-5'>Elasticsearch</b>保姆級入門](https://file1.elecfans.com/web2/M00/A2/A9/wKgaomTxkkmAXaHeAABNlxc0RJE051.png)
SpringBoot 連接ElasticSearch的使用方式
在華為云上通過 Docker 容器部署 Elasticsearch 并進行性能評測
![在華為云上通過 Docker 容器部署 <b class='flag-5'>Elasticsearch</b> 并<b class='flag-5'>進行</b>性能評測](https://file1.elecfans.com//web3/M00/05/BF/wKgZPGeEpj-AelcxAAD9qW6gwBg855.png)
評論