Zookeeper
kafka用到了zookeeper,現在的kafka會自帶zookeeper,如果我們要自己安裝的話 也可以
zookeeper的下載地址爲:https://zookeeper.apache.org/releases.html#download
下載成功之後解壓,j進入bin目錄,然後通過下面的命令啓動zookeeper.
zkServer.cmd
在zookeeper使用時,可能會遇到一些錯誤,關於這些錯誤的問題可以參考博主的這篇博客:zookeeper安裝啓動的一些問題
Kafka
然後我們需要需要下載kafka,kafka的下載地址爲:http://kafka.apache.org/downloads
解壓並進入Kafka目錄,筆者:D:\Kafka\kafka_2.12-0.11.0.0
進入config目錄找到文件server.properties並打開
找到並編輯zookeeper.connect=localhost:2181
Kafka會按照默認,在9092端口上運行,並連接zookeeper的默認端口:2181
進入Kafka安裝目錄D:\Kafka\kafka_2.12-0.11.0.0,按下Shift+右鍵,選擇“打開命令窗口”選項,打開命令行,輸入:
bin\windows\kafka-server-start.bat config\server.properties
kafka有自帶的zookeeper,啓動自帶的zookeeper可以通過如下命令:
bin\windows\zookeeper-server-start.bat config\zookeeper.properties
如果在執行該命令時報錯:
The syntax of the command is incorrect.
則有可能是kafka安裝路徑中的橫槓導致的,這時候我們將kafka拷貝到一個沒有橫槓的路徑下即可。參考:https://stackoverflow.com/questions/20105735/error-the-syntax-of-the-command-is-incorrect-when-renaming-a-file
如果安裝沒有問題了,使用命令啓動單點集羣的kafka時,報錯:
Connection to node 0 (host.docker.internal/10.130.228.45:9092) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient
博主解決的辦法是打開,在kafka安裝路徑下的config/server.properties文件中,修改下面的配置爲:
listeners=PLAINTEXT://localhost:9092
創建一個topic
命令爲:
bin\windows\kafka-topics.bat --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test
測試該topic是否創建成功:
bin\windows\kafka-topics.sh --list --bootstrap-server localhost:9092
發送message
> bin/kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test
This is a message
This is another message
接收message
> bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
This is a message
This is another message
啓動kafka集羣
在本地拷貝兩個server.properties
> copy config\server.properties config\server-1.properties
> copy config\server.properties config/server-2.properties
更改下面的參數
config/server-1.properties:
broker.id=1
listeners=PLAINTEXT://XXX:9093
log.dirs=/tmp/kafka-logs-1
config/server-2.properties:
broker.id=2
listeners=PLAINTEXT://XXX:9094
log.dirs=/tmp/kafka-logs-2
broker.id屬性是集羣中每個節點的唯一且永久的名稱。 我們只需要覆蓋端口和日誌目錄,這是因爲我們都在同一臺計算機上運行它們,並且希望所有代理都不要試圖在同一端口上註冊或覆蓋彼此的數據。
我們有Zookeeper並啓動了單個節點,因此我們只需要啓動兩個新節點:
> bin\kafka-server-start.bat config\server-1.properties
...
> bin\kafka-server-start.bat config\server-2.properties
...
現在,創建一個具有三個複製factor的新topic:
bin\windows\kafka-topics.bat --create --bootstrap-server localhost:9092 --replication-factor 3 --partitions 1 --topic my-replicated-topic
好的,但是現在有了集羣,我們如何知道哪個broker在做什麼?我們需要運行“describe topics”命令:
bin\windows\kafka-topics.bat --describe --bootstrap-server localhost:9092 --topic my-replicated-topic
Topic: my-replicated-topic PartitionCount: 1 ReplicationFactor: 3 Configs: segment.bytes=1073741824
Topic: my-replicated-topic Partition: 0 Leader: 2 Replicas: 2,1,0 Isr: 2,1,0
第一行給出了所有分區的摘要,每一行都給出了有關一個分區的信息。 由於該主題只有一個分區,因此只有一行。
- “leader”是負責給定分區的所有讀取和寫入的節點。 每個節點將成爲分區的隨機選擇部分的領導者。
- “replics”是爲該分區複製日誌的節點列表,無論它們是引導者還是當前處於活動狀態。
- “ isr”是“同步”副本的集合。 這是副本列表的子集,當前仍處於活動狀態並追隨領導者。
請注意,在我的示例中,節點2是topic唯一分區的leader。我們可以在創建的之前的topic 上運行相同的命令,以查看其信息
kafka-topics.bat --describe --bootstrap-server localhost:9092 --topic test
Topic: test PartitionCount: 1 ReplicationFactor: 1 Configs: segment.bytes=1073741824
Topic: test Partition: 0 Leader: 0 Replicas: 0 Isr: 0
因此,如我們期待的一樣-之前的topic沒有replicas 副本,並且位於服務器0上,這是我們創建羣集時集羣中唯一的服務器。
讓我們向我們的新topic發佈一些消息:
kafka-console-producer.bat --bootstrap-server localhost:9092 --topic my-replicated-topic
>my test message 1
>my test message 2
>Terminate batch job (Y/N)? Y
然後consume這些message
kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic my-replicated-topic --from-beginning
my test message 1
my test message 2
Processed a total of 2 messages
Terminate batch job (Y/N)? Y
現在讓我們測試一下容錯能力。 broker 2扮演的是leader的角色,所以讓我們kill它:
wmic process where "caption = 'java.exe' and commandline like '%server-2.properties%'" get processid
ProcessId
8760
C:\Users\tools\kafka>taskkill /pid 8760 /f
SUCCESS: The process with PID 8760 has been terminated.
在kill之後,leader自動變爲了server 1
kafka-topics.bat --describe --bootstrap-server localhost:9092 --topic my-replicated-topic
Topic: my-replicated-topic PartitionCount: 1 ReplicationFactor: 3 Configs: segment.bytes=1073741824
Topic: my-replicated-topic Partition: 0 Leader: 1 Replicas: 2,1,0 Isr: 1,0
但是,即使最初進行寫操作的leader已經down掉了,message仍然可供使用:
kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic my-replicated-topic --from-beginning
my test message 1
my test message 2
原因在於,我們設置了備份。