<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Kafka選舉機制原理

          共 2305字,需瀏覽 5分鐘

           ·

          2020-12-10 00:50


          ? 點擊上方“JavaEdge”,關(guān)注公眾號

          設為“星標”,好文章不錯過!

          1 大數(shù)據(jù)常用的選主機制


          Leader選舉算法非常多,大數(shù)據(jù)領(lǐng)域常用的有以下兩種:



          1.1 Zab(zookeeper使用)


          Zab協(xié)議有四個階段

          • Leader election

          • Discovery (E#epoch establish)

          • Synchronization (5X#sync with followers)

          • Broadcast

          比如3個節(jié)點選舉leader:編號為1、2、3。1先啟動,選擇自己為leader,然后2啟動
          首先也選擇自己為leader,由于1,2都沒過半,選擇編號大的為leader,所以1、2都
          選擇2為leader,然后3啟動發(fā)現(xiàn)1,2已經(jīng)協(xié)商好且數(shù)量過半,于是3也選擇2為leader,leader選舉結(jié)束。



          1.2 Raft


          類似美國大選。
          在Raft中,任何時候一個服務器可以扮演下面角色之一:

          • Leader
            處理所有客戶端交互,日志復制等,一般只有一個Leader

          • Follower

            類似選民,完全被動

          • Candidate候選人

            可被選為一個新的領(lǐng)導人

          啟動時在集群中指定一些機器為Candidate,然后Candidate開始向其他機器(尤
          其是Follower)拉票,當某個Candidate的票數(shù)超過半數(shù),它就成為leader。

          都是 paoxs 算法的變種。

          由于Kafka集群依賴zookeeper集群,所以最簡單最直觀的方案是,所有Follower
          都在ZooKeeper上設置一個Watch,一旦Leader宕機,其對應的ephemeral
          znode會自動刪除,此時所有Follower都嘗試創(chuàng)建該節(jié)點,而創(chuàng)建成功者
          (ZooKeeper保證只有一個能創(chuàng)建成功)即是新的Leader,其它Replica即為
          Follower。

          2 常用選主機制的缺點





          2.1 split-brain (腦裂)


          這是由ZooKeeper的特性引起的,雖然ZooKeeper能保證所有Watch按順序觸發(fā),但是網(wǎng)絡延遲,并不能保證同一時刻所有Replica“看”到的狀態(tài)是一樣的,這就可能造成不同Replica的響應不一致,可能選出多個領(lǐng)導“大腦”,導致“腦裂”。



          2.2 herd effect (羊群效應)


          如果宕機的那個Broker上的Partition比較多, 會造成多個Watch被觸發(fā),造成集群內(nèi)大量的調(diào)整,導致大量網(wǎng)絡阻塞。



          2.3 ZooKeeper負載過重


          每個Replica都要為此在ZooKeeper上注冊一個Watch,當集群規(guī)模增加到幾千個Partition時ZooKeeper負載會過重。

          3 Kafka Partition選主機制




          3.1 優(yōu)勢


          Kafka的Leader Election方案解決了上述問題,它在所有broker中選出一個controller,所有Partition的Leader選舉都由controller決定。
          controller會將Leader的改變直接通過RPC的方式(比ZooKeeper Queue的方式更高效)通知需為此作為響應的Broker。

          沒有使用 zk,所以無 2.3 問題;也沒有注冊 watch無 2.2 問題
          leader 失敗了,就通過 controller 繼續(xù)重新選舉即可,所以克服所有問題。



          3.2 Kafka集群controller的選舉


          每個Broker都會在Controller Path (/controller)上注冊一個Watch。當前
          Controller失敗時,對應的Controller Path會自動消失(因為它是ephemeral
          Node),此時該Watch被fire,所有“活” 著的Broker都會去競選成為新的
          Controller (創(chuàng)建新的Controller Path),但是只會有一個競選成功(這點由
          Zookeeper保證)。競選成功者即為新的Leader,競選失敗者則重新在新的
          Controller Path上注冊Watch。因為Zookeeper的Watch是一次性的, 被fire一次
          之后即失效,所以需要重新注冊。



          3.3 Kafka partition leader的選舉


          由controller執(zhí)行:

          • 從Zookeeper中讀取當前分區(qū)的所有ISR(in-sync replicas)集合

          • 調(diào)用配置的分區(qū)選擇算法選擇分區(qū)的leader


          上面五種分區(qū)算法都是選擇PreferredReplica作為當前Partition的leader。區(qū)別僅
          僅是選擇leader之后的操作有所不同。

          所以,對于下圖partition 0先選擇broker2,之后選擇broker 0作カleader;對于
          partition 1先選擇broker 0,之后迭拝broker 1作カleader;partition 2先選擇
          broker1,之后選擇 broker2作為leader。




          往期推薦


          大廠如何解決數(shù)值精度/舍入/溢出問題

          大廠數(shù)據(jù)庫事務實踐-事務生效就能保證正確回滾?

          線上問題事跡(一)數(shù)據(jù)庫事務居然都沒生效?

          硬核干貨:HTTP超時、重復請求必見坑點及解決方案

          給大忙人們看的Java NIO教程之Channel





          目前交流群已有?800+人,旨在促進技術(shù)交流,可關(guān)注公眾號添加筆者微信邀請進群


          喜歡文章,點個“在看、點贊、分享”素質(zhì)三連支持一下~

          瀏覽 43
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久久一级毛片 | 激情五月天激情 | 日韩三级小说 | 五月天人妻 | 69免费视频网 |