broker的高可用及高伸縮——kafka源碼探究之二

高可用

高可用機制

Kafka在0.8之前的版本,並不提供高可用機制,一旦一個broker宕機,則宕機期間該broke上的全部partition均不可用。從0.8版本開始,kafka開始提供高可用機制。
Kafka的高可用是經過多副本機制保證的。每一個topic下的partition都有主分區以及多個follower(該值可在建立topic時設置,也可後續動態修改),但replica數量不能大於broker數量。好比有3個broker,建立topic的replica必須小於等於3.
kafka的多副本機制是partition級別的,每一個partition及其副本統稱爲replica,replica包括leader和follower,生產者和消費者都只和leader交互,其餘副本只負責從leader處複製消息,leader宕機後由controller選舉一個新的leader。(這一點和elasticsearch很類似)算法

broker宕機後controller處理流程

如下詳細闡述某個broker宕機後kafka的處理流程:json

  1. controller在zk的broker節點上註冊了watch,一旦有broker宕機,對應的zk節點將被刪除,controller得到回調通知(BrokerChangeListener),調用方法controller.onBrokerFailure.
  2. Controller得到宕機broker中做爲leader的partition,置爲OfflinePartition狀態
  3. 選舉宕機broker中做爲leader partition的新leader,PartitionStateMachine#electLeaderForPartition,默認取ISR列表中的第一個replica。選舉出新的leader後,更新zk以及controller緩存,最後構造leaderAndIsrRequest,rpc調用其餘broker發送變更leader和isr的變更通知。其中leader選舉算法以下:判斷當前partition的ISR列表是否爲空,若是不爲空,選舉ISR列表第一位replica做爲leader;若是爲空,判斷配置是否容許選舉非ISR列表的replica,不容許則直接拋出異常;容許則判斷存活broker中非ISR的replica是否爲空,爲空直接拋出異常,不爲空選舉存活broker中replica的第一位做爲leader
  4. 刪除宕機broker中非laeder的partition,若是刪除該replica後無leader,則把leader置爲-1,更新zk,更新controller緩存,同時rpc通知其餘broker

圖片描述

高伸縮

高伸縮機制

kafka的高伸縮指的是broker的高伸縮,broker的高伸縮由自己的無狀態保證。kafka中的broker集羣可任意添加,並在下一次建立topic時分配partition,也可經過kafka提供的腳本手動調整原有topic的分區狀況,下降原有broker的負載。
新增長broker對生產者和消費者是無感知的,對現有topic的分區和分片也無影響,不會自動作partition的rebalance。只有新的topic加入時纔會用到。若是須要手動rebalance,可使用kafka提供的腳本實現。命令以下:
./kafka-reassign-partitions.sh --zookeeper 192.168.2.231:2181 --topics-to-move-json-file topic.json --broker-list "0,1,2" --generate
./kafka-reassign-partitions.sh --zookeeper 192.168.2.231:2181 --topics-to-move-json-file topic.json --broker-list "0,1,2" --executesegmentfault

新增broker(該broker上無partition)流程

  1. 新增broker啓動後會自動在zookeeper上註冊臨時節點
  2. controller監聽到zk節點發生變化,獲取到新增broker的信息。給全部的broker發送新的broker metadata信息

新增broker(宕機後重啓)流程

  1. 前面兩步和broker上無partition的流程一致
  2. 得到新增broker的全部partition,並判斷是否要從新選舉這些partition的leader,假設須要從新選舉,把新的leaderAndIsr信息發送到各broker

建立topic——kafka源碼探究之一
https://segmentfault.com/a/11...緩存

消息生產與消息存儲——kafka源碼探究之三
https://segmentfault.com/a/11...elasticsearch

相關文章
相關標籤/搜索