Apache Kafka 版本演進及特性介紹
- 2020 年 3 月 11 日
- 筆記
前段時間有一個同事問到:Kafka 0.8.2 只能使用Zookeeper連接嗎?雖然仍有一部分Kafka的老用戶在使用 0.8.x 版本,但 Kafka 0.8.x 確實是比較老的版本了。如果不是對Kafka非常熟悉,很容易忽略各個版本之間的差異,也不會清楚某個版本的特點及使用方式。本文我們就一起學習下Kafka的歷史版本演進,增加我們對Kafka的了解,對於Kafka的技術選型也具有指導意義。
一、Kafka概述
Kafka是目前主流的分散式消息引擎及流處理平台,經常用做企業的消息匯流排、實時數據管道,有的還把它當做存儲系統來使用。早期Kafka的定位是一個高吞吐的分散式消息系統,但隨著版本的不斷迭代,目前已經發展成為一個分散式流處理平台了。
Kafka遵循生產者消費者模式,生產者發送消息到Broker中某一個Topic的具體分區里,消費者從一個或多個分區中拉取數據進行消費。目前Kafka主要提供了四套核心的API,Producer API、Consumer API、Streams API與Connector API。隨著Kafka不同版本的發布,API的支援也有所不同,具體也可參考下面的介紹。
二、Kafka版本規則
在Kafka 1.0.0之前基本遵循4位版本號,比如Kafka 0.8.2.0、Kafka 0.11.0.3等。而從1.0.0開始Kafka就告別了4位版本號,遵循 Major.Minor.Patch 的版本規則,其中Major表示大版本,通常是一些重大改變,因此彼此之間功能可能會不兼容;Minor表示小版本,通常是一些新功能的增加;最後Patch表示修訂版,主要為修復一些重點Bug而發布的版本。比如Kafka 2.1.1,大版本就是2,小版本是1,Patch版本為1,是為修復Bug發布的第1個版本。
三、Kafka版本演進
Kafka總共發布了7個大版本,分別是0.7.x、0.8.x、0.9.x、0.10.x、0.11.x、1.x及2.x版本。截止目前,最新版本是Kafka 2.4.0,也是最新穩定版本。
0.7.x版本
這是很老的Kafka版本,它只有基本的消息隊列功能,連消息副本機制都沒有,不建議使用。
0.8.x版本
兩個重要特性,一個是Kafka 0.8.0增加了副本機制,另一個是Kafka 0.8.2.0引入了新版本Producer API。新舊版本Producer API如下:
//舊版本Producer kafka.javaapi.producer.Producer<K,V> //新版本Producer org.apache.kafka.clients.producer.KafkaProducer<K,V>
與舊版本相比,新版本Producer API有點不同,一是連接Kafka方式上,舊版本的生產者及消費者API連接的是Zookeeper,而新版本則連接的是Broker;二是新版Producer採用非同步方式發送消息,比之前同步發送消息的性能有所提升。但此時的新版Producer API尚不穩定,不建議生產使用。
0.9.x版本
Kafka 0.9 是一個重大的版本迭代,增加了非常多的新特性,主要體現在三個方面:
- 安全方面:在0.9.0之前,Kafka安全方面的考慮幾乎為0。Kafka 0.9.0 在安全認證、授權管理、數據加密等方面都得到了支援,包括支援Kerberos等。
- 新版本Consumer API:Kafka 0.9.0 重寫並提供了新版消費端API,使用方式也是從連接Zookeeper切到了連接Broker,但是此時新版Consumer API也不太穩定、存在不少Bug,生產使用可能會比較痛苦;而0.9.0版本的Producer API已經比較穩定了,生產使用問題不大。
- Kafka Connect:Kafka 0.9.0 引入了新的組件 Kafka Connect ,用於實現Kafka與其他外部系統之間的數據抽取。
0.10.x版本
Kafka 0.10 是一個重要的大版本,因為Kafka 0.10.0.0 引入了 Kafka Streams,使得Kafka不再僅是一個消息引擎,而是往一個分散式流處理平台方向發展。0.10 大版本包含兩個小版本:0.10.1 和 0.10.2,它們的主要功能變更都是在 Kafka Streams 組件上。
值得一提的是,自 0.10.2.2 版本起,新版本 Consumer API 已經比較穩定了,而且 Producer API 的性能也得到了提升,因此對於使用 0.10.x 大版本的用戶,建議使用或升級到 Kafka 0.10.2.2 版本。
0.11.x版本
Kafka 0.11 是一個里程碑式的大版本,主要有兩個大的變更,一是Kafka從這個版本開始支援 Exactly-Once 語義即精準一次語義,主要是實現了Producer端的消息冪等性,以及事務特性,這對於Kafka流式處理具有非常大的意義。
另一個重大變更是Kafka消息格式的重構,Kafka 0.11主要為了實現Producer冪等性與事務特性,重構了投遞消息的數據結構。這一點非常值得關注,因為Kafka 0.11之後的消息格式發生了變化,所以我們要特別注意Kafka不同版本間消息格式不兼容的問題。
1.x版本
Kafka 1.x 更多的是Kafka Streams方面的改進,以及Kafka Connect的改進與功能完善等。但仍有兩個重要特性,一是Kafka 1.0.0實現了磁碟的故障轉移,當Broker的某一塊磁碟損壞時數據會自動轉移到其他正常的磁碟上,Broker還會正常工作,這在之前版本中則會直接導致Broker宕機,因此Kafka的可用性與可靠性得到了提升;
二是Kafka 1.1.0開始支援副本跨路徑遷移,分區副本可以在同一Broker不同磁碟目錄間進行移動,這對於磁碟的負載均衡非常有意義。
2.x版本:
Kafka 2.x 更多的也是Kafka Streams、Connect方面的性能提升與功能完善,以及安全方面的增強等。一個使用特性,Kafka 2.1.0開始支援ZStandard的壓縮方式,提升了消息的壓縮比,顯著減少了磁碟空間與網路io消耗。
四、Kafka版本建議
- 遵循一個基本原則,Kafka客戶端版本和服務端版本應該保持一致,否則可能會遇到一些問題。
- 根據是否用到了Kafka的一些新特性來選擇,假如要用到Kafka生產端的消息冪等性,那麼建議選擇Kafka 0.11 或之後的版本。
- 選擇一個自己熟悉且穩定的版本,如果說沒有比較熟悉的版本,建議選擇一個較新且穩定、使用比較廣泛的版本。
主要參考:
1. https://www.cnblogs.com/huxi2b/
2. http://kafka.apache.org/downloads及相關的Release記錄
本文重點總結了Kafka的各版本演進,及關鍵特性,希望對Kafka使用者有比較好的參考意義。