亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

elasticsearch的靈魂唯一master選舉機制原理分析

 更新時間:2022年04月21日 14:34:58   作者:zziawan  
這篇文章主要為大家介紹了elasticsearch的靈魂唯一master選舉機制原理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

master作為cluster的靈魂必須要有,還必須要唯一,否則集群就出大問題了。因此master選舉在cluster分析中尤為重要。對于這個問題我將分兩篇來分析。第一篇也就是本篇,首先會簡單說一說mater選舉的一些算法,及elasticsearch的選舉原理。第二篇也就是下一篇,會結(jié)合zenDiscovery代碼為仔細分析elasticsearch的master選舉的實現(xiàn)。

簡單來說master的作用跟單個jvm中的同步關(guān)鍵字synchronized相同,集群中多節(jié)點協(xié)調(diào)工作必須要保證數(shù)據(jù)的一致性,但是不同節(jié)點分布在不同的jvm中,不可能用jvm的同步機制。所以需要一個“鎖”,節(jié)點操作集群中的資源時都通過它來解決一致性問題,這就是master。關(guān)于分布式系統(tǒng)的master選舉算法有很多,最有名的當(dāng)然要數(shù)paxos算法,在它的基礎(chǔ)上出現(xiàn)了非常多的變體算法。關(guān)于這個算法請參考相關(guān)網(wǎng)頁和資料,不是一兩句話能說清楚的,這里不再祥述。但是paxos的功能遠遠超出了master選舉,一致性向才是它的目標(biāo),任何需要實現(xiàn)一致性的問題都可以使用該算法,因此zookeeper功能遠遠不止master選舉。

還有一種比較簡單的算法就是Bully,它通過一定的直接給每個節(jié)點賦予一唯一的ID,這些ID是可以排序的,每次master選舉都會選舉ID最大的節(jié)點。這種實現(xiàn)非常簡單。但是會存在一些問題,在master負(fù)載過重時它會假死,于是第二大節(jié)點就成為了master節(jié)點。因此假死m(xù)aster節(jié)點因負(fù)載減輕又活了過來,于是他又被選為master,然后又假死……,這種情況可能一直存在導(dǎo)致系統(tǒng)不穩(wěn)定。

集群還有一個問題就是brain split:一個集群因為網(wǎng)絡(luò)問題導(dǎo)致多個master選舉出來而分裂。這也是master選舉必須要解決的問題。elasticsearch的master選舉原理我覺得是在bully的基礎(chǔ)上做了改進。相比于paxos實現(xiàn)的zookeeper它完美的解決了master選舉問題,但不如zookeeper強大,因為zookeeper功能遠遠超出了master選舉,它的master選舉卻不需要這么多功能。它原理如下:

  • 對所有可以成為master的節(jié)點根據(jù)nodeId排序,每次選舉每個節(jié)點都把自己所知道節(jié)點排一次序,然后選出第一個(第0位)節(jié)點,暫且認(rèn)為它是master節(jié)點。
  • 如果對某個節(jié)點的投票數(shù)達到一定的值(可以成為master節(jié)點數(shù)n/2+1)并且該節(jié)點自己也選舉自己,那這個節(jié)點就是master。否則重新選舉。
  • 對于brain split問題,需要把候選master節(jié)點最小值設(shè)置為可以成為master節(jié)點數(shù)n/2+1(quorum )

以上就是master選舉的三條原則,其實第三天包含在第二條之中,為了說明brain split問題這里單獨拿出來說一下。下面看一下ElectMasterService的相關(guān)代碼,來補充說明一下一上的文字描述:

public DiscoveryNode electMaster(Iterable<DiscoveryNode> nodes) {
        List<DiscoveryNode> sortedNodes = sortedMasterNodes(nodes);
        if (sortedNodes == null || sortedNodes.isEmpty()) {
            return null;
        }
        return sortedNodes.get(0);
    }

上面就是選舉master的方法,可以看到,它的做法就是對候選節(jié)點排序然后直接將第一個返回。當(dāng)然這只是上面所說的第一條。其實只有這個是不能夠保證maser選舉順利的,之前也看到一些文章分析elasticsearch的master選舉,只提到了這個點和這一部分代碼,應(yīng)該是作者沒有仔細研究Discovery代碼而導(dǎo)致的疏忽。如果每個節(jié)點都只是選舉自己排序后的節(jié)點的第一個肯定會導(dǎo)致brain split和選舉不一致。master比較的方法也比較簡單如下所示:

private static class NodeComparator implements Comparator<DiscoveryNode> {

        @Override
        public int compare(DiscoveryNode o1, DiscoveryNode o2) {
            if (o1.masterNode() && !o2.masterNode()) {
                return -1;
            }
            if (!o1.masterNode() && o2.masterNode()) {
                return 1;
            }
            return o1.id().compareTo(o2.id());
        }
    }

以上是節(jié)點排序比較器,可以看到它只是比較了nodeId,因此是按nodeId排序。從這兩兩段代碼來看很像是bully算法的實現(xiàn)。為了解決brain split問題開發(fā)者加入了master候選數(shù)據(jù)量限制,代碼如下:

public boolean hasEnoughMasterNodes(Iterable<DiscoveryNode> nodes) {
        if (minimumMasterNodes < 1) {
            return true;
        }
        int count = 0;
        for (DiscoveryNode node : nodes) {
            if (node.masterNode()) {
                count++;
            }
        }
        return count >= minimumMasterNodes;
    }

通過比較節(jié)點能“看到”的候選master數(shù)量和配置的最小值來確定是否可以進行選舉,如果數(shù)量不夠會導(dǎo)致選舉不能進行,這樣就可以保證集群不會被分裂。下面以一個圖(圖片來自于elasticsearch官網(wǎng))來說明:

假設(shè)之前選舉了A節(jié)點為master,兩個switch之間突然斷線了,這樣就分詞了兩部分。CDE和AB,因為 minimumMasterNodes的數(shù)目為3(集群中5個節(jié)點都可以成為master,3=5/2+1),因此cde會可以進行選舉假設(shè)C成為master。AB兩個節(jié)點因為少于3所以無法選舉,只能一直尋求加入集群,要么線路連通加入到CDE中要么就一直處于尋找集群狀態(tài),這樣就保證了集群不分裂。

總結(jié)一下,本篇介紹了master選舉的兩種算法和elasticsearch的選舉原理,并分析了它原理中的兩條,第二條將在下一篇discovery中接下分析。

以上就是elasticsearch的靈魂唯一master選舉機制原理分析的詳細內(nèi)容,更多關(guān)于elasticsearch唯一master選舉機制的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java中Object轉(zhuǎn)換為List類型的實現(xiàn)方法

    Java中Object轉(zhuǎn)換為List類型的實現(xiàn)方法

    這篇文章主要介紹了Java中Object轉(zhuǎn)換為List類型的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Java中的StackOverflowError錯誤問題及解決方法

    Java中的StackOverflowError錯誤問題及解決方法

    這篇文章主要介紹了Java中的StackOverflowError錯誤,在本文中,我們仔細研究了StackOverflower錯誤,包括Java代碼如何導(dǎo)致它,以及我們?nèi)绾卧\斷和修復(fù)它,需要的朋友可以參考下
    2022-07-07
  • Java 實現(xiàn)隨機驗證碼功能簡單實例

    Java 實現(xiàn)隨機驗證碼功能簡單實例

    這篇文章主要介紹了Java 實現(xiàn)隨機驗證碼功能簡單實例的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • sqlserver的jdbc配置方法

    sqlserver的jdbc配置方法

    這篇文章主要介紹了sqlserver的jdbc配置方法,需要的朋友可以參考下
    2014-04-04
  • springboot下mybatis-plus開啟打印sql日志的配置指南

    springboot下mybatis-plus開啟打印sql日志的配置指南

    這篇文章主要給大家介紹了關(guān)于springboot下mybatis-plus開啟打印sql日志的配置指南的相關(guān)資料,還介紹了關(guān)閉打印的方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-03-03
  • mybatis源碼解讀之executor包語句處理功能

    mybatis源碼解讀之executor包語句處理功能

    這篇文章主要介紹了executor包語句處理功能,mybatis中支持三種語句類型,不同語句類型支持的變量符號不同,下文詳細內(nèi)容,需要的小伙伴可以參考一下
    2022-02-02
  • Eclipse引用XSD實現(xiàn)XML配置文件提示標(biāo)簽的方法

    Eclipse引用XSD實現(xiàn)XML配置文件提示標(biāo)簽的方法

    今天小編就為大家分享一篇關(guān)于Eclipse引用XSD實現(xiàn)XML配置文件提示標(biāo)簽的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Java版本的回文字算法(java版本)

    Java版本的回文字算法(java版本)

    本文給大家分享一段java代碼關(guān)于回文字算法的實例代碼,代碼簡單易懂,需要的朋友一起看看吧
    2016-10-10
  • 如何巧用HashMap一行代碼統(tǒng)計單詞出現(xiàn)次數(shù)詳解

    如何巧用HashMap一行代碼統(tǒng)計單詞出現(xiàn)次數(shù)詳解

    這篇文章主要給大家介紹了關(guān)于如何巧用HashMap一行代碼統(tǒng)計單詞出現(xiàn)次數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 一文搞懂Java SPI機制的原理與使用

    一文搞懂Java SPI機制的原理與使用

    Java 程序員在日常工作中經(jīng)常會聽到 SPI,而且很多框架都使用了 SPI 的技術(shù),那么問題來了,到底什么是 SPI 呢?今天小編就帶大家好好了解一下 SPI
    2022-10-10

最新評論