天天看點

分布式服務必問,Kafka分區Leader選舉過程

作者:一燈架構

上篇文章講了Kafka Controller的選舉過程,Controller的選舉是為了保證整個Kafka叢集的高可用。

今天講一下Kafka Leader Replica(上司者副本)的選舉過程, Leader Replica選舉的目的是為了保證資料在分區副本之間的可靠傳輸和一緻性。

1. Leader Replica簡介

先溫習一下Leader Replica的知識:

  1. 一個Kafka叢集包含多個Broker節點,一個Broker節點相當于一台伺服器。
  2. 一個Topic(主題)包含多個Partition(分區),Topic是邏輯概念,而Partition是實體分組。
  3. 一個Partition又包含多個Replica(副本),Replica之間是一主多從的關系,有兩種類型Leader Replica(上司者副本)和Follower Replica(跟随者副本),同一個Partition的Replica分布在不同的Broker節點上。
  4. Leader Replica負責處理讀寫請求,Follower Replica隻負責同步Leader Replica資料,不對外提供服務。
  5. 一個Partition的所有Replica集合統稱為AR(Assigned Replicas,已配置設定的副本),與Leader Replica保持同步的Replica集合稱為ISR(In-Sync Replicas,同步副本),與Leader Replica保持失去同步的Replica集合稱為OSR(Out-of-Sync Replicas,失去同步的副本),AR = ISR + OSR。
  6. Leader Replica将消息寫入磁盤前,需要等ISR中的所有副本同步完成。如果ISR中某個Follower Replica同步資料落後Leader Replica過多,會被轉移到OSR中。如果OSR中的某個Follower Replica同步資料追上了Leader Replica,會被轉移到ISR中。當Leader Replica發生故障的時候,隻會從ISR中選舉出新的Leader Replica。

了解了Leader Replica的基本概念之後,再講一下什麼情況下會觸發Leader Replica選舉。

分布式服務必問,Kafka分區Leader選舉過程

2.Leader Replica選舉觸發時機

常見的有以下幾種情況會觸發Partition的Leader Replica選舉:

  1. Leader Replica 失效:當 Leader Replica 出現故障或者失去連接配接時,Kafka 會觸發 Leader Replica 選舉。
  2. Broker 當機:當 Leader Replica 所在的 Broker 節點發生故障或者當機時,Kafka 也會觸發 Leader Replica 選舉。
  3. 新增 Broker:當叢集中新增 Broker 節點時,Kafka 還會觸發 Leader Replica 選舉,以重新配置設定 Partition 的 Leader。
  4. 建立分區:當一個新的分區被建立時,需要選舉一個 Leader Replica。
  5. ISR 清單數量減少:當 Partition 的 ISR 清單數量減少時,可能會觸發 Leader Replica 選舉。當 ISR 清單中副本數量小于 Replication Factor(副本因子)時,為了保證資料的安全性,就會觸發 Leader Replica 選舉。
  6. 手動觸發:通過 Kafka 管理工具(kafka-preferred-replica-election.sh),可以手動觸發選舉,以平衡負載或實作叢集維護。

3. Leader Replica選舉政策

在 Kafka 叢集中,常見的 Leader Replica 選舉政策有以下三種:

  1. ISR 選舉政策:預設情況下,Kafka 隻會從 ISR 集合的副本中選舉出新的 Leader Replica,OSR 集合中的副本不具備參選資格。
  2. 首選副本選舉政策(Preferred Replica Election):首選副本選舉政策也是 Kafka 預設的選舉政策。在這種政策下,每個分區都有一個首選副本(Preferred Replica),通常是副本集合中的第一個副本。當觸發選舉時,控制器會優先選擇該首選副本作為新的 Leader Replica,隻有在首選副本不可用的情況下,才會考慮其他副本。當然,也可以使用指令手動指定每個分區的首選副本:

    bin/kafka-topics.sh --zookeeper localhost:2181 --topic my-topic-name --replica-assignment 0:1,1:2,2:0 --partitions 3

    意思是:my-topic-name有3個partition,partition0的首選副本是Broker1,partition1首選副本是Broker2,partition2的首選副本是Broker0。

  3. 不幹淨副本選舉政策(Unclean Leader Election):在某些情況下,ISR 選舉政策可能會失敗,例如當所有 ISR 副本都不可用時。在這種情況下,可以使用 Unclean Leader 選舉政策。Unclean Leader 選舉政策會從所有副本中(包含OSR集合)選擇一個副本作為新的 Leader 副本,即使這個副本與目前 Leader 副本不同步。這種選舉政策可能會導緻資料丢失,是以隻應在緊急情況下使用。修改下面的配置,可以開啟 Unclean Leader 選舉政策,預設關閉。unclean.leader.election.enable=true

4. Leader Replica選舉過程

當Leader Replica當機或失效時,就會觸發 Leader Replica 選舉,分為兩個階段,第一個階段是候選人的提名和投票階段,第二個階段是Leader的确認階段。具體過程如下:

  1. 候選人提名和投票階段在Leader Replica失效時,ISR集合中所有Follower Replica都可以成為新的Leader Replica候選人。每個Follower Replica會在選舉開始時向其他Follower Replica發送成為候選人的請求,并附帶自己的中繼資料資訊,包括自己的目前狀态和Lag值。而Preferred replica優先成為候選人。其他Follower Replica在收到候選人請求後,會根據請求中的中繼資料資訊,計算每個候選人的Lag值,并将自己的選票投給Lag最小的候選人。如果多個候選人的Lag值相同,則随機選擇一個候選人。
  2. Leader确認階段在第一階段結束後,所有的Follower Replica會重新計算每位候選人的Lag值,并投票給Lag值最小的候選人。此時,選舉的結果并不一定出現對候選人的全局共識。為了避免出現這種情況,Kafka中使用了ZooKeeper來實作分布式鎖,確定隻有一個候選人能夠成為新的Leader Replica。當ZooKeeper确認有一個候選人已經獲得了分布式鎖時,該候選人就成為了新的Leader Replica,并向所有的Follower Replica發送一個LeaderAndIsrRequest請求,更新Partition的中繼資料資訊。其他Follower Replica接收到請求後,會更新自己的Partition中繼資料資訊,将新的Leader Replica的ID添加到ISR清單中。

5. 總結

本文介紹了Kafka Leader Replica(上司者副本)的選舉過程,包括Leader Replica的基本概念、選舉觸發時機、選舉政策和選舉過程。Leader Replica選舉的目的是為了保證資料在分區副本之間的可靠傳輸和一緻性,常見的選舉觸發情況包括Leader Replica失效、Broker當機、新增Broker、建立分區、ISR清單數量減少和手動觸發。常見的選舉政策包括ISR選舉政策、首選副本選舉政策和不幹淨副本選舉政策。選舉過程分為候選人提名和投票階段和Leader确認階段,其中使用ZooKeeper來實作分布式鎖,確定隻有一個候選人能夠成為新的Leader Replica。