一. windows下環境配置
必須提前安裝好jdk
下面步驟按照官方文檔操作
解壓目錄不應該有空格。
\kafka_2.12-2.3.0\bin
目錄下的.sh
文件就是kafka的shell腳本,
我們會發現,bin目錄下還有一個windows文件夾,裏面包含很多.bat文件,這些是windows批處理命令,
也就是說我們下載的這個包可以在Linux和windows平臺運行。在Windows平臺上使用bin\windows\
代替bin/
,
並將腳本擴展名更改爲.bat
。下面的示例都是基於windows平臺
目錄結構說明
kafka_2.12-2.3.0
|--bin (Linux平臺使用的.sh腳本)
|--windows (windows平臺批處理文件.bat)
|--config(程序運行配置文件,在後期自定義使用kafka的時候需要修改配置文件內容)
|--libs(運行時jar包)
|--logs(記錄一些日誌文件)
|--site-docs(文檔)
二. kafka命令
命令行初試
# 步驟1
# cmd啓動命令行,進入解壓目錄(注意一定要進入該目錄,而不是下面的bin或者bin\windows目錄,否則有些命令中使用配置文件找不到)
D:\IDE\kafka_2.12-2.3.0>
# 步驟2:啓動ZooKeeper.Kafka需要使用ZooKeeper,如果我們沒有安裝並啓動ZooKeeper服務器,可以使用Kafka隨附的便利腳本獲取一個簡陋的單節點ZooKeeper實例
# 在啓動之前,我們需要修改config\zookeeper.properties配置文件,將dataDir目錄重新指定一下,可以自行創建文件夾比如dataDir=D:/IDE/kafka_2.12-2.3.0/dataDir/zookeeper
>bin\windows\zookeeper-server-start.bat config\zookeeper.properties
# 步驟3:(新終端窗口)啓動Kafka服務器,需要重新打開一個命令窗口(因爲上一個窗口啓動ZooKeeper後處於執行等待狀態,不能關閉ZooKeeper)
# 啓動前修改config\server.properties中log.dirs=D:/IDE/kafka_2.12-2.3.0/dataDir/kafka/broker
>bin\windows\kafka-server-start.bat config\server.properties
# 步驟4:(新終端窗口)創建主題,
>bin\windows\kafka-topics.bat --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test
# 查看主題
>bin\windows\kafka-topics.bat --list --bootstrap-server localhost:9092
# 步驟5:發送消息
>bin\windows\kafka-console-producer.bat --broker-list localhost:9092 --topic test
# 步驟6:(新終端窗口)啓動消費者
>bin\windows\kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test --from-beginning
上述示例中總共要打開四個終端窗口,運行截圖如下
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-blqBrwdo-1574736898694)(pic/kafka/01kafka_step.jpg)]
建立多broker集羣
一個獨立的Kafka服務器被稱爲broker。broker接收來自生產者的消息,爲消息設置偏移量,
並提交消息到磁盤保存。broker爲消費者提供服務,對讀取分區的請求作出響應,返回已經
提交到磁盤上的消息。根據特定的硬件及其性能特徵,單個broker可以輕鬆處理數千個分區
以及每秒百萬級的消息量。
broker是集羣的組成部分,每個集羣都有一個broker同時充當了集羣控制器的角色(自動
從集羣的活躍成員中選舉出來)。控制器負責管理工作,包括將分區分配給 broker和監控broker。
在集羣中,一個分區從屬於一個broker, broker被稱爲分區的首領。一個分可以分配給多個
broke,這個時候會發生分區複製。這種複製機制爲分區提供了消息冗餘,如果有一個broker失效,
其他 broker 可以接管領導權。不過,相關的消費者和生產者都要重新連接到新的首領。
在上面的示例中,我們一直在單一的broker上跑,對於kafka來說,單個broker只是一個大小爲1的集羣,
接下來我們將集羣擴展到三個節點。
1. 爲每個broker創建一個配置文件
將config目錄下的server.properties
文件複製兩份,命名server1.properties
、server2.properties
。
修改配置文件內容如下:
# config/server-1.properties:
# 設置broker id,每個broker id必須是唯一的Integer
broker.id=1
# 設置端口
listeners=PLAINTEXT://:9093
# 設置文件夾
log.dirs=D:/IDE/kafka_2.12-2.3.0/dataDir/kafka/broker1
# config/server-2.properties:
broker.id=2
listeners=PLAINTEXT://:9094
log.dirs=D:/IDE/kafka_2.12-2.3.0/dataDir/kafka/broker2
2. 啓動多個broker
在上述示例中我們已經啓動了ZooKeeper,並且啓動了單個broker。然後分別在三個終端窗口啓動這三個broker:
# 窗口1
>bin\windows\kafka-server-start.bat config\server.properties
# 窗口2
>bin\windows\kafka-server-start.bat config\server1.properties
# 窗口3
>bin\windows\kafka-server-start.bat config\server2.properties
如果出現錯誤:
D:\IDE\kafka_2.12-2.3.0>bin\windows\kafka-server-start.bat config\server2.properties
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error='頁面文件太小,無法完成操作。' (DOS error/errno=1455)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 1073741824 bytes for Failed to commit area from 0x00000000c0000000 to 0x0000000100000000 of length 1073741824.
# An error report file with more information is saved as:
# D:\IDE\kafka_2.12-2.3.0\hs_err_pid434684.log
原因是每開啓一個broker就會佔用一些內存,默認64位系統是每個broker佔用1G,我們打開3個broker就會導致內存不足,
這個可以根據自己需求配置,由於我們只做測試,對內存要求不高,可以改爲256M。
用編輯文件打開D:\IDE\kafka_2.12-2.3.0\bin\windows\kafka-server-start.bat
,
按照下面註釋修改後重新啓動broker(如果還報錯,那就關閉之前開啓的broker全部重新開啓):
SetLocal
IF ["%KAFKA_LOG4J_OPTS%"] EQU [""] (
set KAFKA_LOG4J_OPTS=-Dlog4j.configuration=file:%~dp0../../config/log4j.properties
)
IF ["%KAFKA_HEAP_OPTS%"] EQU [""] (
rem detect OS architecture
wmic os get osarchitecture | find /i "32-bit" >nul 2>&1
IF NOT ERRORLEVEL 1 (
rem 32-bit OS
set KAFKA_HEAP_OPTS=-Xmx512M -Xms512M
) ELSE (
rem 64-bit OS //64位系統默認-Xmx1G -Xms1G,修改爲-Xmx256M -Xms256M
//set KAFKA_HEAP_OPTS=-Xmx1G -Xms1G
set KAFKA_HEAP_OPTS=-Xmx256M -Xms256M
)
)
3. 創建主題
# 新窗口中:創建主題
>bin\windows\kafka-topics.bat --create --bootstrap-server localhost:9092 --replication-factor 2 --partitions 3 --topic openxu_topic
上面的命令執行成功之後,我們可以去config/server.properties
配置文件中配置的目錄下查看有些什麼東西:
--kafka
|--broker # broker id = 0的節點
|--openxu_topic-0 # ★分區0首領副本(leader)
|--openxu_topic-2 # 分區2跟隨着副本(follower)
|--broker1 # broker id = 1的節點
|--openxu_topic-1 # 分區1跟隨着副本(follower)
|--openxu_topic-2 # ★分區2首領副本(leader)
|--broker2 # broker id = 2的節點
|--openxu_topic-0 # 分區0跟隨着副本(follower)
|--openxu_topic-1 # ★分區1首領副本(leader)
爲什麼會產生這樣的目錄結構?我們分析上面命令代表什麼意思,更多參數可執行bin\windows\kafka-topics.bat
查看:
kafka-topics.bat
: 是執行批處理文件,也就是命令--create
:參數, 表示創建主題--bootstrap-server localhost:9092
: 參數, 設置要連接的kafka服務器,後面緊跟服務器地址和端口。--zookeeper
參數過時了,使用–bootstrap-server代替--partitions 3
: 參數,設置分區,爲該主題設置3個分區,主題的分區會均勻的分佈在每個broker上,三個分區正好每個broker分佈一個分區。
但是爲什麼每個broker下有兩個分區目錄呢?這就是下面複製因子的作用--replication-factor 2
: 參數, 設置複製因子,意思是每個分區需要複製幾個副本(理解爲每個分區在整個集羣的數量),這裏設置2表示每個分區出了首領副本(均勻分佈)外,還需要複製1份跟隨着副本,這
些跟隨着副本也會均勻的分佈在每個broker節點上,至於是怎麼分佈,是kafka控制器決定的。--topic openxu_topic
: 參數,設置主題名稱
4. 查看主題描述
上面我們創建了具有3個分區,複製因子爲2的名爲openxu_topic的主題,也對着broker目錄分析了相關參數的作用,我們還可以
通過--describe
查看主題相關信息。輸出數據的含義已經在每一行都標記出來了,這正好和上面kafka配置目錄中分區的分佈結構
對應上:
>bin\windows\kafka-topics.bat --describe --bootstrap-server localhost:9092 --topic openxu_topic
# 輸出如下
# 第一行:給出了Topic的摘要,包括主題名稱openxu_topic、該主題有3個分區、複製因子爲2
Topic:openxu_topic PartitionCount:3 ReplicationFactor:2 Configs:segment.bytes=1073741824
# 第二行:Partition-給出分區0的相關信息,
# Leader-分區0的首領副本位於broker id爲0的節點中
# Replicas-分區0的兩個副本分別位於broker id爲0、2的節點中
# Isr-是“同步”副本的集合,這是副本列表Replicas的子集
Topic: openxu_topic Partition: 0 Leader: 0 Replicas: 0,2 Isr: 0,2
# 第三行:Partition-給出分區1的相關信息,
# Leader-分區1的首領副本位於broker id爲2的節點中
# Replicas-分區1的兩個副本分別位於broker id爲2、1的節點中
# Isr-是“同步”副本的集合,這是副本列表Replicas的子集
Topic: openxu_topic Partition: 1 Leader: 2 Replicas: 2,1 Isr: 2,1
# 第三行:Partition-給出分區2的相關信息,
# Leader-分區2的首領副本位於broker id爲1的節點中
# Replicas-分區2的兩個副本分別位於broker id爲1、0的節點中
# Isr-是“同步”副本的集合,這是副本列表Replicas的子集
Topic: openxu_topic Partition: 2 Leader: 1 Replicas: 1,0 Isr: 1,0
5. 向主題發佈和消費消息
開啓兩個命令終端,分別執行下面的命令,一個發佈消息,一個消費消息:
# 消費消息
>bin\windows\kafka-console-consumer.bat --bootstrap-server localhost:9092 --from-beginning --topic openxu_topic
# 發佈消息
>bin\windows\kafka-console-producer.bat --broker-list localhost:9092 --topic openxu_topic
6. 關閉節點
- 關閉節點0
分區0首領副本斷開,分區2跟隨副本也沒有了,但是很快broker2成了分區0的首領。現在broker1是分區2的首領,
broker2是分區0和分區1的首領
- 繼續關閉節點2
這會導致分區0和分區1首領副本斷開,broker1中還有分區1的副本,所以,broker1成爲分區1的新首領,同時他還是分區2的首領,但是分區0沒有首領了。
發佈消息和消費消息的窗口開始不斷報錯。
- 開啓節點2
發佈和消費消息正常