Kafka-快速入門

一. windows下環境配置

必須提前安裝好jdk

kafka官方文檔

下面步驟按照官方文檔操作

下載2.3.0版本

解壓目錄不應該有空格\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.propertiesserver2.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

發佈和消費消息正常

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