Kafka Topic 體系結構 – 複製 故障轉移 並行處理

  • 2019 年 12 月 25 日
  • 筆記

本文介紹了 Kafka Topic 的體系結構,並討論了如何使用分區進行故障轉移和並行處理。

1. Kafka Topic, Log, Partition

Kafka Topic(主題) 是一個有名字的記錄流,Kafka 把 Record(記錄)存儲在 log 日誌文件中。

一個主題被分解為多個 Partition(分區)

Kafka 把 log 的多個分區分散到多個服務器中。

把一個 Topic 分解為多個分區,是為了速度、擴展性、存儲量。

Topic 是天生的發佈/訂閱類型的消息傳遞方式,一個 Topic 可以有 0 個或者多個訂閱者(consumer group 消費者組)。

Kafka Topic Partitions

一個 Topic 包含多個 Partition,一個 Partition 裏面包含多條記錄。

一條記錄具體存儲在那個分區呢?

如果記錄有 key,那麼就會根據 key 指定分區。

如果記錄沒有 key,默認使用輪詢的方式指定分區。

Kafka 通過多分區的方式,使主題具有了擴展性,可以跨多個服務器,這樣 producer 的寫性能就提升了,多分區同樣也提升了 consumer 的消費性能,因為可以並行消費,並行的上限就是分區的數量。

每個分區裏面的記錄是保證順序的,如果是根據 key 指定分區的,那麼相同 key 的記錄都在同一個分區里,對於需要回放日誌的場景非常有用。

Kafka 會對每個分區都進行複製,以保證高可用,便於做故障轉移。

Kafka 記錄的順序

Kafka 只保證分區內的記錄是有序的,不保證主題內的記錄有序。

分區是一個有序的、不可變的記錄序列。

Kafka 把分區作為一個結構化的提交日誌,持續向分區中追加記錄。

分區中每條記錄都被指定一個序號,叫做 「offset」,offset 指定了每條記錄在分區中的位置。

主題分區使 Kafka 日誌可以擴展到超出單個服務器的大小。

分區必須適合其所在的服務器,但主題可以有多個分區,所以主題就可以跨越多個服務器。

一個分區是一個並行單元,一個分區一次只能由消費者組中的一個消費者操作。

如果消費者組中的一個消費者停止了,Kafka 會把其對應的分區再分配給組內其他消費者。

Kafka 主題分區複製

Kafka 可以對分區進行跨服務器複製,複製幾份是可以配置的,複製分區是用於容錯。

每個分區複製了多份,其中有一個是 leader,其他為 follower,leader 負責此分區的所有讀寫請求。

follower 從 leader 複製記錄,並關注 leader 的存活狀態。

2. 複製:分區的 Leader, Follower, and ISR

Kafka 通過 ZooKeeper 從多個分區中選舉出一個 leader。

分區 leader 所在的服務器負責處理此分區的所有讀寫請求,寫請求會從 leader 複製到 follower。

在所有 follower 當中,與 leader 保持同步複製的,稱為 ISR(in-sync replica),如果 leader 故障了,會從 ISR 中選舉出一個新的 leader。

被所有 ISR 都複製完成的記錄才是 「committed 已提交」 的,只有已提交的記錄才能被消費者讀取。

3. 常見問題

ISR 是什麼?

一個 ISR 是一個同步複製 leader 的 follower。

如果 leader 故障了,只有 ISR 有資格競選 leader。

消費者與分區的對應關係

一個消費者可以對應多個分區,但一個分區一次只能被一個消費者組中的一個消費者使用。

如果一個主題只有一個分區,那麼就只能有一個消費者。

Leader Follower 是什麼?

leader 處理本分區的所有讀寫請求,follower 複製 leader。

kafka 如何做消費者的故障轉移?

消費者組的一個消費者如果故障了,那麼之前分配給這個消費者的分區會被重新分配給組內的其他消費者。

kafka 如何做 broker 的故障轉移?

如果一個 broker 故障了,kafka 會將其持有的分區領導權重新分配給其他 broker。

內容翻譯整理自:

https://dzone.com/articles/kafka-topic-architecture-replication-failover-and