總結/朱季謙
接觸kafka開發已經兩年多,也看過關於kafka的一些書,但一直沒有怎么對它做總結,借着最近正好在看《Apache Kafka實戰》一書,同時自己又搭建了三台kafka服務器,正好可以做一些總結記錄。
本文主要是記錄如何在kafka集群服務器上創建topic,查看topic列表、分區、副本詳情,刪除topic,測試topic發送與消費,算是最基礎的操作了,當然,不同版本其實指令是有所差異的,本文只針對kafka 2.x版本。雖然這些指令都很簡單,但久不用了,很容易就會忘記,所謂好記性不如爛筆頭,記錄下來會更好。
主要寫給一些剛接觸kafka的小白,大神請自行繞路。
最后,推薦兩本寫kafka的書,我覺得挺不錯的,一本是關於原理的《深入理解kafka:核心設計與實踐原理》,一本就是我現在在看的,比較偏實際開發工作的《Apache Kafka實戰》。這兩本我覺得比較容易看懂,當然,我是先看的第一本,當時記錄了一堆筆記,筆記目前放在我的GitHub上:https://github.com/z924931408/Learning-Notes-document
我會一步一步記錄,從簡到原理。
1、創建一個名為test-topic的topic,該topic有3個分區,每個分區分配3個副本——
./kafka-topics.sh --zookeeper zk1:2181,zk2:2181,zk3:2181 --create --topic test-topic --partitions 3 --replication-factor 3
創建成功時,會提示:Created topic test-topic.
2、查看kafka集群已有topic列表——
./kafka-topics.sh --zookeeper zk1:2181,zk2:2181,zk3:2181 -list
查詢情況會顯示出所有的topic名——
3、查看topic的分區與備份詳細情況——
./kafka-topics.sh --zookeeper zk1:2181,zk2:2181,zk3:2181 --describe --topic test-topic
例如,我在虛擬機上查看如下
PartitionCount:表示總共有3個分區;
ReplicationFactor:表示每個分區有3個副本備份;
該kafka集群分布部署在三台機器上,三個節點的id分別為0,1,2。截圖當中,顯示有0,1,2的字樣,即分別代表了三台節點服務器,說明該test-topic三個分區各自均勻分配在三台機器上,分區的leader副本與三個follower副本同樣均勻在三台機器上,這能起到防止數據丟失的作用。
最后,還有一個ISR,該參數全稱,in-sync replica,它維護了一個集合,例如截圖里的2,0,1,代表2,0,1副本保存的消息日志與leader 副本是保持一致的,只有保持一致的副本(包括所有副本),才會被維護在ISR集合里,當出現一定程度的不同步時,就會將該對應已經不一致的副本移出ISR集合,但是,這種移出並非永久的,一旦被移出的副本慢慢又恢復與leader一樣時,那么,又會被加回isr集合當中。注意一點,只有在這個ISR里的副本服務器,才能在leader出現問題時有機會被選舉為新的leader。
4、刪除topic——
./kafka-topics.sh --zookeeper zk1:2181,zk2:2181,zk3:2181 --delete --topic test-topic
執行該語句后,會顯示以下信息——
Topic test-topic is marked for deletion.
Note: This will have no impact if delete.topic.enable is not set to true.
翻譯過來,就是說,主題test-topic標記為刪除,但如果delete.topic.enable未設置為true,這將沒有影響。
也就是說,如果delete.topic.enable未設置為true,即使執行了該語句,但也不會被刪除,只會被標記一個刪除狀態而已,該delete.topic.enable參數在1.0.0版本后都是默認true,可以通過./kafka-topics.sh --zookeeper zk1:2181,zk2:2181,zk3:2181 -list指令查看,發現確實已經被刪除了,當刪除topic時,會將topic分區及備份所有數據都刪除完,注意一點,這種刪除是異步的。
5、驗證集群消息發送與消費
kafka默認提供了兩個腳本:kafka-console-producer.sh與kafka-console-consumer.sh。
可以直接使用這兩個腳本驗證集群是否能正常發送消息與消費消息。
開啟一個生產者——
./kafka-console-producer.sh --broker-list kafka1:9092, kafka2:9092, kafka3:9092 --topic test-topic2
在其他兩台機器上分別開啟兩個消費者——
./kafka-console-consumer.sh --bootstrap-server kafka1:9092, kafka2:9092, kafka3:9092 --topic test-topic2 --from-beginning
大概效果如下——
生產者:
消費者: