一. kafka安裝
1. 安裝前提
- 安裝Jdk、javac驗證是否安裝成功
- 安裝zookeeper 見鏈接教程
2. 到官網下載
3. 將下載好的文件上傳到Linux服務器
4. 解壓
tar -zxvf kafka_2.13-3.2.1.gz
cd kafka_2.13-3.2.1/config
vi server.properties
# The id of the broker. This must be set to a unique integer for each broker.
#集羣節點編號 默認爲0 broker.id在集羣中必須是唯一的
broker.id=0
#kafka所在主機的ip地址 和 指定的開發端口號
listeners=PLAINTEXT://10.1.48.214:9092
#kafka日誌路徑
log.dirs=/home/hcx/kafka/kafka_2.13-3.2.1/kafka-logs
#zookeeper集羣連接地址
zookeeper.connect=localhost:2181
5. 啓動kafka
./kafka-server-start.sh -daemon ../config/server.properties
6. 創建topics
#通過kafka想zk中創建一個主題
./kafka-topics.sh --bootstrap-server 10.1.48.214:9092 --create --topic test --partitions 2 --replication-factor 1
#查看所有的topic
./kafka-topics.sh --list --bootstrap-server 10.1.48.214:9092
二. kafka發送與消費
1. 發送消息
#在bin目錄下自帶kafka-console-producer.sh
./kafka-console-producer.sh --broker-list 10.1.48.214:9092 --topic heima
2. 消費消息
#模式1:從最後一條消息的偏移量+1開始消費,即實時消費,發送消息立馬同步到消費消息
./kafka-console-consumer.sh --bootstrap-server 10.1.48.214:9092 --topic heima
#模式2:從頭開始消費,即接受發送消息的所有歷史消息
./kafka-console-consumer.sh --bootstrap-server 10.1.48.214:9092 --from-beginning --topic heima
3. 注意點
- 消息會被存儲
- 消息是順序存儲
- 消息是有偏移量offset
- 消費時可以指明偏移量進行消費
3. kafka單播與多博
1. 單播消息
同一個消費組中,只有一個消費者可以收到訂閱的topic中的消息。
./kafka-console-consumer.sh --bootstrap-server 10.1.48.214:9092 --consumer-property group.id=testGroup01 --topic heima
2. 多播消息
不同的消費組訂閱同一個topic,那麼不同的消費組中均只有一個消費者能夠收到消息。也就代表多個消費組中多個消費者收到了同一個topic的消息
#消費組testGroup01
./kafka-console-consumer.sh --bootstrap-server 10.1.48.214:9092 --consumer-property group.id=testGroup01 --topic heima
#消費組testGroup02
./kafka-console-consumer.sh --bootstrap-server 10.1.48.214:9092 --consumer-property group.id=testGroup02 --topic heima
3. 查看消費組的詳細消息
#查看當前有多少組
./kafka-consumer-groups.sh --bootstrap-server 10.1.48.214:9092 --list
#查看指定消費組(testGroup01)的詳細信息
./kafka-consumer-groups.sh --bootstrap-server 10.1.48.214:9092 --describe --group testGroup01
參數 | 含義 |
---|---|
PARTITION | 表示話題分區 |
CURRENT-OFFSET | 表示最後被消費的消息偏移量 |
LOG-END-OFFSET | 消息總量(最後一條消息的偏移量) |
LAG | 剩餘未被消費的消息量 |
四. kafka主題和分區的概念
1). 主題Topic
主題-topic在kafka中是一個邏輯的概念,kafka通過topic將消息進行分類。不同的topic會被訂閱該topic的消費者消費。
但是有一個問題,如果說這個topic中的消息非常非常多,多到需要幾T來存,因爲消息是會被保存到log日誌文件中的。爲了解決這個文件過大的問題,kafka提出了Partition分區的概念
2). 分區Partition
1. 概念
通過Partition將一個topic中的消息分區來存儲。其好處如下:
-
分區存儲,可以解決統一存儲文件過大的問題
-
提高了讀寫的吞吐量:讀和寫可以同時在多個分區中進行
2. 創建多分區的topic
./kafka-topics.sh --bootstrap-server 10.1.48.214:9092 --create --topic test --partitions 2 --replication-factor 1
3. kafka中消息日誌文件保存的內容解析
文件名 | 含義 |
---|---|
00000000000000000000.log | 保存的就是topic的消息 |
00000000000000000000.inde | 偏移量索引文件 |
00000000000000000000.timeindex | 時間戳索引文件 |
leader-epoch-checkpoint | 保存了每一任leader開始寫入消息時的offset, 會定時更新 |
__consumer_offsets-49 | kafka內部自己創建了_consumer_offsets主題包含了50個分區。這個主題用來存放消費者消費某個主題的偏移量。因爲每個消費者都會自己維護着消費的主題的偏移量,也就是說每個消費者會把消費的主題的偏移量自主上報給kafka中的默認主題:consumer_offsets。因此kafka爲了提升這個主題的併發性,默認設置了50個分區。 |
注意:文件中保存的消息默認是7天。7天到後自動刪除。
五. Kafka集羣操作
1. 集羣搭建
-
創建三個server.properties 【位於config目錄下】
#1. copy兩份server.properties cp server.properties server1.properties cp server.properties server2.properties #2. 修改.properties配置文件中的三個參數broker.id listeners log.dirs #集羣節點編號 默認爲0 broker.id在集羣中必須是唯一的 broker.id=2 #kafka所在主機的ip地址 和 指定的開發端口號 listeners=PLAINTEXT://10.1.48.214:9094 #kafka日誌路徑 log.dirs=/home/hcx/kafka/kafka_2.13-3.2.1/kafka-logs-2
-
啓動三臺broker
#關閉之前的kafka (之前未啓動過kafka可忽略) ps aux | grep server.properties kill pid #啓動命令 ./kafka-server-start.sh -daemon ../config/server.properties ./kafka-server-start.sh -daemon ../config/server1.properties ./kafka-server-start.sh -daemon ../config/server2.properties
-
校驗是否啓動成功
#進入zookeeper查看/brokers/ids中是否有三個znode[0,1,2] cd /home/hcx/zookeeper/apache-zookeeper-3.8.0-bin/bin ./zkCli.sh ls /brokers/ids
2. 什麼是副本
當我們創建topic的時候,除了定義分區外,還指明瞭副本數。
./kafka-topics.sh --bootstrap-server 10.1.48.214:9092 --create --partitions 2 --replication-factor 1 --topic my-replicated-topic
-
replication-factor :副本數
-
概念:副本是爲了主題中的分區創建多個備份,多個副本在kafka集羣的多個broker中,會有一個副本作爲leader,其他的都是fllower
-
查看topic情況
./kafka-topics.sh --describe --bootstrap-server 10.1.48.214:9092 --topic my-replicated-topic
參數 | 含義 |
---|---|
Replicas | 當前副本存在的broker節點 |
Leader | 每個partition都有一個broker作爲leader。消息發送方要把消息發給哪個broker?就看副本的leader是在哪個broker上面。副本里的leader專⻔用來接收消息。當leader掛了,經過主從選舉,從Follower中選舉產生一個新的Leader |
Follower | 接收Leader的同步數據 |
Isr | 可以同步的broker節點和已同步的broker節點,存放在isr集合中。如果isr中的節點性能較差,會被踢出isr集合。 |
3. 集羣消費
1)向集羣發送消息
./kafka-console-producer.sh --broker-list 10.1.48.214:9092,10.1.48.214:9093,10.1.48.214:9094 --topic my-replicated-topic
2)從集羣中消費消息
./kafka-console-consumer.sh --bootstrap-server 10.1.48.214:9092,10.1.48.214:9093,10.1.48.214:9094 --from-beginning --topic my-replicated-topic
3)指定消費組來消費消息
./kafka-console-consumer.sh --bootstrap-server 10.1.48.214:9092,10.1.48.214:9093,10.1.48.214:9094 --from-beginning --consumer-property group.id=testGroup1 --topic my-replicated-topic
4)分區消費組消費者的細節
- 爲了保證消費的順序性,一個partition只能被一個消費組中的一個消費者消費。
- Kafka只在partition的範圍內保證消息消費的局部順序性,不能在同一個topic中的多個partition中保證總的消費順序性。
- 一個消費者可以消費多個partition。【如果消費者刮來了,那麼會出發Reblance機制,會讓其他消費者來消費該分區】