總結/朱季謙
接觸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
大概效果如下——
生產者:
消費者: