Kafka 單機及集羣安裝

Kafka 2.5.0

1. 簡介

Kafka是一個實時數據處理系統,可以橫向擴展、高可靠,而且還很快,已經被很多公司使用。

實時數據處理系統就是數據一旦產生,就要能快速進行處理的系統。
對於實時數據處理,我們最常見的,就是消息中間件了,叫MQ(Message Queue,消息隊列),也有叫Message Broker的。

消息中間件指利用高效可靠的消息傳遞機制進行平臺無關的數據交流,主要有兩點作用:

  1. 解耦消息的生產和消費。
  2. 緩衝。

2. 基本概念

消息
Kafka的數據單元被稱爲消息。可以把消息看成是數據庫裏的一個“數據行”或一條“記錄”。消息由字節數組組成,所以對於Kafka 來說,消息裏的數據沒有特別的格式或含義。

批次
批次就是一組消息,這些消息屬於同一個主題和分區。如果每一個消息都單獨穿行於網絡,會導致大量的網絡開銷,把消息分成批次傳輸可以減少網絡開銷。

模式
對於Kafka來說,消息不過是晦澀難懂的字節數組,所以有人建議用一些額外的結構來定義消息內容,讓它們更易於理解。根據應用程序的需求,消息模式(schema)有許多可用的選項。像JSON 和XML這些簡單的系統,不僅易用,而且可讀性好。不過,它們缺乏強類型處理能力,不同版本之間的兼容性也不是很好。
Kafka的許多開發者喜歡使用Apache Avro,它最初是爲Hadoop開發的一款序列化框架。Avro提供了一種緊湊的序列化格式,模式和消息體是分開的,當模式發生變化時,不需要重新生成代碼。

主題
Kafka的消息通過主題進行分類。主題可以被分爲若干個分區,一個分區就是一個提交日誌。消息以追加的方式寫入分區,然後以先入先出的順序讀取。由於一個主題一般包含幾個分區,因此無法在整個主題範圍內保證消息的順序,但可以保證消息在單個分區內的順序。

下圖中所示的主題有4個分區,消息被追加寫入每個分區的尾部。Kafka通過分區來實現數據冗餘和伸縮性。
分區可以分佈在不同的服務器上,也就是說,一個主題可以橫跨多個服務器,以此來提供比單個服務器更強大的性能。
主題解釋

分區
每個Topic由多個分區組成,每個分區內部的數據保證了有序性,即是按照時間序列,append到分區的尾部。分區是有固定大小的,容量不夠時,會創建新的分區。Kafka在一定時間內會定期清理過期的文件。
這種連續性的文件存儲,一方面有效的利用磁盤的線性存取;另一方面減輕了內存的壓力。

生產者
生產者創建消息。一般情況下,一個消息會被髮布到一個特定的主題上。
生產者在默認情況下把消息均衡地分佈到主題的所有分區上,而並不關心特定消息會被寫到哪個分區。
不過,在某些情況下,生產者會把消息直接寫到指定的分區。這通常是通過消息鍵和分區器來實現的,分區器爲鍵生成一個散列值,並將其映射到指定的分區上。這樣可以保證包含同一個鍵的消息會被寫到同一個分區上。
生產者也可以使用自定義的分區器,根據不同的業務規則將消息映射到分區。

消費者
消費者讀取消息。消費者訂閱一個或多個主題,並按照消息生成的順序讀取它們。
消費者通過檢查消息的偏移盤來區分已經讀取過的消息。偏移量是另一種元數據,它是一個不斷遞增的整數值,在創建消息時,Kafka會把它添加到消息裏。在給定的分區裏,每個消息的偏移量都是唯一的。消費者把每個分區最後讀取的消息偏移量保存在Zookeeper或Kafka 上,如果消費者關閉或重啓,它的讀取狀態不會丟失。

消費者是消費者羣組的一部分,會有一個或多個消費者共同讀取一個主題。羣組保證每個分區只能被一個消費者使用。

下圖中,有3個消費者同時讀取一個主題。其中的兩個消費者各自讀取一個分區,另外一個消費者讀取其他兩個分區。

消費者與分區之間的映射通常被稱爲消費者對分區的所有權關係。通過這種方式,消費者可以消費包含大量消息的主題。而且,如果一個消費者失效,羣組裏的其他消費者可以接管失效消費者的工作。
消費者

Broker
一個獨立的Kafka服務器被稱爲Broker。
Broker接收來自生產者的消息,爲消息設置偏移量,並提交消息到磁盤保存。
Broker爲消費者提供服務,對讀取分區的請求作出響應,返回已經提交到磁盤上的消息。
根據特定的硬件及其性能特徵,單個Broker可以輕鬆處理數千個分區以及每秒百萬級的消息量。
Broker是集羣的組成部分。每個集羣都有一個Broker同時充當了集羣控制器的角色(自動從集羣的活躍成員中選舉出來)。控制器負責管理工作,包括將分區分配給Broker和監控Broker。

在集羣中,一個分區從屬於一個Broker,該Broker被稱爲分區的首領;一個分區可以分配給多個Broker,這個時候會發生分區複製。這種複製機制爲分區提供了消息冗餘,如果有一個Broker失效,其他Broker可以接管領導權。不過,相關的消費者和生產者都要重新連接到新的首領。
broker

3. 安裝

Zookeeper 單機及集羣安裝
啓動Zookeeper。Kafka雖有自帶Zookeeper,這裏並沒有使用。

3.1 單機

修改 conf/server.properties
配置Zookeeper
配置zookeeper
修改目錄路徑log.dirs,需要先創建該日誌文件夾
修改日誌路徑
前臺啓動

bin/kafka-server-start.sh config/server.properties

後臺啓動

bin/kafka-server-start.sh -daemon config/server.properties 

測試
創建主題
用一個分區和一個副本創建一個名爲 test 的主題

bin/kafka-topics.sh --create \
--bootstrap-server localhost:9092 \
--replication-factor 1 \
--partitions 1 \
--topic test

--replication-factor:每一個分區的副本數量
--partition:分區數

查看所有主題

bin/kafka-topics.sh --list --bootstrap-server localhost:9092

查看所有主題
啓動生產者
Kafka帶有一個命令行客戶端,它將從文件或標準輸入中獲取輸入,並將其作爲消息發送到Kafka集羣。默認情況下,每行將作爲單獨的消息發送。啓動生產者,然後在控制檯中鍵入一些消息以發送到服務器。

bin/kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test

發送消息
啓動消費者

bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning

--from-beginning:從頭消費
啓動消費者
查看主題描述

bin/kafka-topics.sh -describe --bootstrap-server localhost:9092 --topic test

查看主題描述
刪除主題

bin/kafka-topics.sh --bootstrap-server localhost:9092 --delete --topic test

停止

bin/kafka-server-stop.sh

2.2 集羣

僞集羣,創建kafka-cluster文件夾,在一臺虛擬機上啓動3個kafka實例,組成集羣。

複製單機版安裝包,修改 config/server.properties

修改broker.id
修改broker.id
修改監聽端口listeners
修改listeners
topic的分區數和分區複製改成3
topic的分區數和分區複製改成3
修改目錄路徑log.dirs,然後清空logs文件夾。
修改log.dirs
再複製修改kafka-2,kakfa-3,修改broker.id爲2和3,監聽端口爲9093和9094。

新增啓動腳本

vi start-all.sh
cd kafka-1
./bin/kafka-server-start.sh -daemon ./config/server.properties
cd ..
cd kafka-2
./bin/kafka-server-start.sh -daemon ./config/server.properties
cd ..
cd kafka-3
./bin/kafka-server-start.sh -daemon ./config/server.properties
chmod u+x start-all.sh

新增停止腳本

vi stop-all.sh
cd kafka-1
./bin/kafka-server-stop.sh
cd ..
cd kafka-2
./bin/kafka-server-stop.sh
cd ..
cd kafka-3
./bin/kafka-server-stop.sh
chmod u+x stop-all.sh

由於啓動過上面單機的Kafka,並且和集羣Kafka用的同一個Zookeeper,所以要清空Zookeeper中Kafka創建的目錄。

測試
創建topic

bin/kafka-topics.sh --create --bootstrap-server 192.168.110.40:9092 --topic test-3

查看主題描述

bin/kafka-topics.sh -describe --bootstrap-server 192.168.110.40:9092 --topic test-3

查看主題描述
該主題有3個分區,3個分區複製。
Leader:負責給定分區的所有讀取和寫入的節點,每個節點將成爲分區的隨機選擇部分的領導者。
Replicas:爲該分區複製日誌的節點列表,無論它們是引導者還是當前處於活動狀態。
Isr:是“同步”副本的集合。這是副本列表的子集,當前仍處於活動狀態並追隨Leader。

啓動生產者

bin/kafka-console-producer.sh --bootstrap-server 192.168.110.40:9092 --topic test-3

在這裏插入圖片描述
啓動兩個消費者

bin/kafka-console-consumer.sh --bootstrap-server 192.168.110.40:9093 --topic test-3 --from-beginning

bin/kafka-console-consumer.sh --bootstrap-server 192.168.110.40:9094 --topic test-3 --from-beginning

兩個消費者都會消費生產者的消息
啓動兩個消費者
啓動兩個消費者
啓動分組的消費者

bin/kafka-console-consumer.sh --bootstrap-server 192.168.110.40:9093 --topic test-3 --from-beginning --group test-3-group

bin/kafka-console-consumer.sh --bootstrap-server 192.168.110.40:9094 --topic test-3 --from-beginning --group test-3-group

--group:消費組爲 test-3-group
啓動生產者
兩個消費者一個組,消息只會消費一次。
啓動分組的消費者
啓動分組的消費者
測試高可用
kill掉分區0的Leader
kill掉分區0的Leader
分區0的Leader變成2
分區0的Leader變成2

參考:
Kafka 官方快速開始
Kafka 權威指南
Kafka 簡明教程
搭建kafka及zookeeper集羣

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章