【Kafka】|?總結/Edison Zhou
1新的KRaft架構
在Kafka 2.8之前,Kafka重度依賴于Zookeeper集群做元數據管理和集群的高可用(即所謂的共識服務)。
在Kafka 2.8之后,引入了基于Raft協議的KRaft模式,支持取消對Zookeeper的依賴。在此模式下,一部分Kafka Broker被指定為Controller,另一部分則為Broker。這些Controller的作用就是以前由Zookeeper提供的共識服務,并且所有的元數據都將存儲在Kafka主題中并在內部進行管理。
總體而言,使用KRaft的好處如下:
Kafka不用再依賴外部框架,能夠做到獨立運行。類似于Redis的Sentinel,它的本質仍然是一個Kafka實例。
Controller管理集群時,不再需要從Zookeeper中先讀取數據,因此集群的性能得到一定的提升。
由于不再依賴Zookeeper,Kafka集群擴展時不用再受到Zookeeper讀寫能力的限制。
Controller不再動態選舉,而是由配置文件規定。這樣可以有針對性的加強Controller節點的配置,而不是像以前一樣對隨機Controller節點的高負載束手無策。
2KRaft架構部署實戰
本次我們采用物理宿主機部署,本集群三個Kafka實例均在一臺主機上。
下載Kafka安裝包
從Apache Kafka官方社區下載最新版3.2.0的安裝包(.tgz),然后將其拷貝到服務器上并解壓。
這里我使用一臺Linux主機,啟動三個Kafka實例,分別綁定9092,19092,29092端口來模擬三臺服務器的集群效果。
由于只有三個實例,因此它們既是Controller節點,也是Broker節點。
修改KRaft必要配置
和基于Zookeeper的模式不同,KRaft模式下的配置需要進入Kraft目錄,找到server.properties文件:
cd config/kraft
依次修改每個服務器下的kraft目錄下的server.properties文件:
(1)kafka01
process.roles=broker,controller
node.id=1
controller.quorum.voters=1@kafka01:9093,2@kafka02:19093,3@kafka03:29093
listeners=PLAINTEXT://:9092,CONTROLLER://:9093
advertised.listeners=PLAINTEXT://kakfa01:9092
log.dirs=/usr/local/modules/kakfa01/logs
(2)kafka02
process.roles=broker,controller
node.id=2
controller.quorum.voters=1@kafka01:9093,2@kafka02:19093,3@kafka03:29093
listeners=PLAINTEXT://:19092,CONTROLLER://:19093
advertised.listeners=PLAINTEXT://kakfa02:19092
log.dirs=/usr/local/modules/kakfa02/logs
(3)kafka03
process.roles=broker,controller
node.id=2
controller.quorum.voters=1@kafka01:9093,2@kafka02:19093,3@kafka03:29093
listeners=PLAINTEXT://:29092,CONTROLLER://:29093
advertised.listeners=PLAINTEXT://kakfa03:29092
log.dirs=/usr/local/modules/kakfa03/logs
初始化集群數據目錄
(1)生成存儲目錄唯一ID(UUID)
bin/kafka-storage.sh random-uuid
uTTIHcpoQSeiGlItgLau0A
(2)用這個唯一ID格式化Kafka存儲目錄
# kafka01
/usr/local/modules/kafka01/bin/kafka-storage.sh format -t uTTIHcpoQSeiGlItgLau0A -c /usr/local/modules/kafka01/config/kraft/server.properties
# kafka02
/usr/local/modules/kafka02/bin/kafka-storage.sh format -t uTTIHcpoQSeiGlItgLau0A -c /usr/local/modules/kafka02/config/kraft/server.properties
# kafka03
/usr/local/modules/kafka03/bin/kafka-storage.sh format -t uTTIHcpoQSeiGlItgLau0A -c /usr/local/modules/kafka03/config/kraft/server.properties
(3)啟動Kafka KRaft集群節點服務
# kafka01
/usr/local/modules/kafka01/bin/kafka-server-start.sh -daemon /usr/local/modules/kafka01/config/kraft/server.properties
# kakfa02
/usr/local/modules/kafka02/bin/kafka-server-start.sh -daemon /usr/local/modules/kafka02/config/kraft/server.properties
# kafka03
/usr/local/modules/kafka03/bin/kafka-server-start.sh -daemon /usr/local/modules/kafka03/config/kraft/server.properties
(4)驗證Kafka集群節點服務
# jps
1207 Kafka
2137 Jps
2013 Kafka
1614 Kafka
快速測試生產消費
(1)創建測試topic
kafka01/bin/kafka-topics.sh --create --bootstrap-server kafka01:9092,kafka02:19092,kafka03:29092 --replication-factor 2 --partitions 3 --topic test
Created topic test.
(2)模擬Producer
kafka01/bin/kafka-console-producer.sh --broker-list kafka01:9092,kafka02:19092,kafka03:29092 --topic test
>hello
>world
>edison
>zhou
(3)模擬Consumer
kafka02/bin/kafka-console-consumer.sh --bootstrap-server kafka01:9092,kafka02:19092,kafka03:29092 --from-beginning --topic test
hello
world
edison
zhou
可以看到,已經可以正常的生產和消費數據。
End總結
本文總結了Kafka KRaft模式的基本概念和優點,介紹了Kafka KRaft模式的部署過程。基于KRaft模式,我們不再需要依賴Zookeeper進行元數據管理和共識服務,在技術選型時不再需要引入額外的組件,對于Kafka來說,實在是個好消息。
至此,Kafka學習征途系列已經有了11篇推文,目前已經走到了結尾,總結這個系列既是我對自己學習的總結,也是系統地梳理所學知識,相信它對我有幫助,也一定對你有所幫助!
參考資料
深度感謝以下參考教程!
極客時間,胡夕《Kafka核心技術與實戰》
B站,尚硅谷《Kafka 3.x入門到精通教程》
年終總結:Edison的2021年終總結
數字化轉型:我在傳統企業做數字化轉型
C#刷題:C#刷劍指Offer算法題系列文章目錄
.NET面試:.NET開發面試知識體系
.NET大會:2020年中國.NET開發者大會PDF資料