天天看點

源碼分析Elasticsearch Master選舉過程

【轉自】https://www.sohu.com/a/123557397_465922

【ES入門教程】https://blog.csdn.net/weixin_43639512/article/details/86712958

關于es的選舉機制,相信大家都已經很熟悉了,不過今天看到一個解釋,覺得挺有意思的,準過來,各位不妨一看。注:原文中無圖

ES 有Master節點和Data節點,Master節點什麼意思呢? 就是主人節點,這個叢集的主人,就是皇帝。ES同一時刻隻有一個Master節點。小生一直看古裝走火入魔,所謂心裡有王朝,眼裡就有王朝,看啥啥是王朝。就用王朝解釋下叢集,皇帝比喻下Master。我們先來看2個配置項。

node.master: true 就是皇子,意思是有資格成為Master,成為皇帝的人選,這是天生的,是無字天書,在elasticsearch.yml裡寫好的。

discovery.zen.minimum_master_nodes: 1 就是幾個皇子在場的時候,才能選新皇帝,不然難以服衆,容易腦裂(brain split)是吧。

Master的職責

隻有皇帝才有資格釋出聖旨ClusterState(叢集狀态)。他維護着這個王朝的狀态,決定着這個王朝很多重要的大小事物。有一些事情必須皇帝才能執行,比如砍頭(删除索引)。但是ES作為P2P叢集,Master的職責,還是被弱化了一些。一張圖看一下皇帝的工作内容。

什麼時候選Master

隻有在皇帝駕崩,和王朝誕生的時候,才選舉Master皇帝,是吧,想讓皇帝禅位,除非他死了,或者王朝被推翻了(所有節點重新開機)

節點啟動,要加入一個叢集的時候

//ZenDiscoveryprivate void innterJoinCluster() { boolean retry = true; while (retry) { if (lifecycle.stoppedOrClosed()) { return; } retry = false; DiscoveryNode masterNode = findMaster(); //找一個節點出來當皇帝 if (masterNode == null) { logger.trace(“no masterNode returned”); retry = true; continue; } //… 或者節點關閉 Master Gone

private void handleMasterGone(final DiscoveryNode masterNode, final String reason) { if (lifecycleState() != Lifecycle.State.STARTED) { return; } if (master) { return; } logger.info(“master_left [{}], reason [{}]”, masterNode, reason); clusterService.submitStateUpdateTask(“zen-disco-master_failed (” + masterNode + “)”, Priority.HIGH, new ProcessedClusterStateUpdateTask() { @Override public ClusterState execute(ClusterState currentState) { if (!masterNode.id().equals(currentState.nodes().masterNodeId())) { return currentState; } DiscoveryNodes.Builder nodesBuilder = DiscoveryNodes.newNodesBuilder() .putAll(currentState.nodes()) .remove(masterNode.id()) .masterNodeId(null); if (!electMaster.hasEnoughMasterNodes(nodesBuilder.build())) { return rejoin(ClusterState.builder().state(currentState).nodes(nodesBuilder).build(), "not enough master nodes after master left (reason = " + reason + “)”); } final DiscoveryNode electedMaster = electMaster.electMaster(nodesBuilder.build()); // 選舉Master

Master選舉

首先必須是皇子(node.master: true),具體哪皇子成為皇帝呢? 看天意啊,最先啟動的那個節點。老臣認為。當立嫡長子為太子,成為皇帝啊,這樣江山社稷才能穩固啊,(一陣激動)省略上萬句。。。好了,演完戲了,看代碼。

ZenDiscovery子產品啟動的時候,要加入叢集。findMaster 方法裡,Ping一堆節點出來,Ping就是發現節點,這裡的Ping不是Linux的指令Ping,是向ES的9300端口發送資料的意思。Linux的Ping是可以禁止的,不能因為指令Ping不通機器,就認為互相不能發現節點。Ping有多點傳播MulticastZenPing和單點傳播UnicastZenPing 兩種。如果節點少,用單點傳播也可以。多點傳播在一些環境下可能無法互相發現節點,或者被安全軟體識别為惡意程式。節點清單确定後。交給 ElectMasterService 去選舉,快排後的第一個節點

//ElectMasterService public DiscoveryNode electMaster(Iterable nodes) { List sortedNodes = sortedMasterNodes(nodes); if (sortedNodes == null || sortedNodes.isEmpty()) { return null; } return sortedNodes.get(0); } private List sortedMasterNodes(Iterable nodes) { List possibleNodes = Lists.newArrayList(nodes); if (possibleNodes.isEmpty()) { return null; } // clean non master nodes for (Iterator it = possibleNodes.iterator(); it.hasNext(); ) { DiscoveryNode node = it.next(); if (!node.masterNode()) { it.remove(); } } CollectionUtil.quickSort(possibleNodes, nodeComparator); return possibleNodes; }

對了,皇帝上位以後,第一件事情是釋出聖旨,昭告天下,以後寡人就是皇帝了。

怎麼看,現在誰是皇帝呢?

curl http://localhost:9200/_cat/master?v

腦裂問題

關于brain split腦裂問題,可以看這個:

如何避免腦裂:

官方讨論:

最後,為了讓大家對皇帝有個感性的認識,贈圖一張,不謝!

繼續閱讀