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