Kafka 目錄裏的腳本那麼多,它們都是用來幹什麼的?

語言: CN / TW / HK

這是我參與11月更文挑戰的第26天,活動詳情查看:2021最後一次更文挑戰

相關:Apache Kafka 的本地部署

以下是 Apacke Kafka 2.13 安裝目錄中 bin/ 中的腳本文件列表:

``` ➜ tree -L 1 bin

bin ├── connect-distributed.sh ├── connect-mirror-maker.sh ├── connect-standalone.sh ├── kafka-acls.sh ├── kafka-broker-api-versions.sh ├── kafka-cluster.sh ├── kafka-configs.sh ├── kafka-console-consumer.sh ├── kafka-console-producer.sh ├── kafka-consumer-groups.sh ├── kafka-consumer-perf-test.sh ├── kafka-delegation-tokens.sh ├── kafka-delete-records.sh ├── kafka-dump-log.sh ├── kafka-features.sh ├── kafka-get-offsets.sh ├── kafka-leader-election.sh ├── kafka-log-dirs.sh ├── kafka-metadata-shell.sh ├── kafka-mirror-maker.sh ├── kafka-producer-perf-test.sh ├── kafka-reassign-partitions.sh ├── kafka-replica-verification.sh ├── kafka-run-class.sh ├── kafka-server-start.sh ├── kafka-server-stop.sh ├── kafka-storage.sh ├── kafka-streams-application-reset.sh ├── kafka-topics.sh ├── kafka-transactions.sh ├── kafka-verifiable-consumer.sh ├── kafka-verifiable-producer.sh ├── trogdor.sh ├── windows ├── zookeeper-security-migration.sh ├── zookeeper-server-start.sh ├── zookeeper-server-stop.sh └── zookeeper-shell.sh

1 directory, 37 files ```

其中有一個叫做 windows 的目錄,裏面是 Windows 系統下使用的 .bat 批處理文件,其餘都是 .sh 腳本文件,包含之前的文章介紹過的幾個腳本:

  • zookeeper-server-start.sh 用來啟動 ZooKeeper 服務
  • kafka-server-start.sh 用來啟動 Kafka Broker
  • kafka-topics.sh 用來操作 Topics
  • kafka-configs.sh 用來修改 Broker 端的動態配置等
  • kafka-consumer-groups 前面的文章中我們用它來重設消費者組的位移等

這些腳本中,zookeeper 開頭的幾個腳本是用來操作 ZooKeeper 的,connect 開頭的幾個腳本與 Kafka Connect 有關,其餘是大量的與 Kafka 相關的腳本。

這些腳本的文檔,都可以通過文件名加 --help 查詢到,比如:

``` ➜ bin/kafka-log-dirs.sh --help

This tool helps to query log directory usage on the specified brokers. Option Description ------ ----------- --bootstrap-server bootstrapping --broker-list The list of brokers to be queried in the form "0,1,2". All brokers in the cluster will be queried if no broker list is specified --command-config passed to Admin Client. --describe Describe the specified log directories on the specified brokers. --help Print usage information. --topic-list The list of topics to be queried in the form "topic1,topic2,topic3". All topics will be queried if no topic list is specified (default: ) --version Display Kafka version. ```

本文主要介紹這些腳本中常用的幾個

kafka-broker-api-versions

這個腳本用於驗證不同版本的 Broker 和 Consumer 之間的適配行。執行結果如下(控制枱輸出還有很多行,用省略號代替了):

``` ➜ bin/kafka-broker-api-versions.sh --bootstrap-server localhost:9092

192.168.1.21:9092 (id: 0 rack: null) -> ( Produce(0): 0 to 9 [usable: 9], Fetch(1): 0 to 12 [usable: 12], ListOffsets(2): 0 to 7 [usable: 7], ...... ```

這裏列出了各種請求的適配情況,我們以 Produce(0): 0 to 9 [usable: 9] 為例來詳細介紹。

  • Produce 表示 Produce 請求,生產者向 Broker 發送消息其實就是在發送 Produce 請求。
  • (0) 表示的是序號
  • 0 to 9 表示在當前的 Broker 中,支持 0 到 9 共 10 個版本的 Producer 請求。
  • [usable: 9] 表示當前的客户端使用的是版本序號為 9 的請求。這裏的客户端指的其實就是我們使用的 kafka-broker-api-versions 腳本。如果你使用不同版本 Kafka 中的 kafka-broker-api-versions 腳本驗證同一個 Broker 實例,這裏會得到不同的結果。

kafka-console-consumer 和 kafka-console-producer

在之前的文章(Apache Kafka 的本地部署)中,曾經使用這兩個命令來驗證 Kafka 是否部署和運行成功。它們分別可以用來生產和消費消息。

使用一條簡單的指令就可以向 Kafka 提交消息(記得提前創建好 Topic):

➜ bin/kafka-console-producer.sh --topic hello-events --bootstrap-server localhost:9092

如果要提供多個 Broker 節點,可以將 --bootstrap-server 替換成 --broker-list,多個節點的地址用逗號隔開即可。

如果要消費一個主題的消息,可以使用如下方式:

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

執行後,消息會被打印到控制枱上。

這裏有一個 --from-beginning 參數,它代表從當前最早的位移開始消費消息,相當於使用了 Earliest 策略重設位移(參考:Kafka 消費者組位移重設的幾種方式

這兩個用於生產和消費消息的命令,一般很少用在實際的場景中,更多的是用來測試。

kafka-producer-perf-test 和 kafka-consumer-perf-test

這兩個命令也是生產者和消費者對應的命令成對出現的,用於對生產和消費消息的性能做測試。

比如下面的腳本:

bin/kafka-producer-perf-test.sh --topic hello-events --num-records 100000 --throughput -1 --record-size 1024 --producer-props bootstrap.servers=localhost:9092

向指定的 Topic 發送了十萬條消息(這個數量太少了,這裏僅做演示),每條 1024 個字節,得到如下結果:

100000 records sent, 65919.578115 records/sec (64.37 MB/sec), 2.89 ms avg latency, 253.00 ms max latency, 0 ms 50th, 20 ms 95th, 22 ms 99th, 23 ms 99.9th.

這裏展示了每秒發送的消息數、吞吐量、平均延時,以及幾個分位數,我們可以重點關注末尾的分位數,23 ms 99.9th 表示 99.9% 的消息延時都在 23ms 之內,這是性能判斷的重要依據。

消費端的性能測試命令會稍微簡單一些:

bin/kafka-consumer-perf-test.sh --broker-list localhost:9092 --messages 100000 --topic hello-events

結果如下:

start.time, end.time, data.consumed.in.MB, MB.sec, data.consumed.in.nMsg, nMsg.sec, rebalance.time.ms, fetch.time.ms, fetch.MB.sec, fetch.nMsg.sec 2021-11-26 16:31:12:691, 2021-11-26 16:31:17:028, 98.1396, 22.6285, 100495, 23171.5472, 3594, 743, 132.0857, 135255.7201

只有一些時間和吞吐量的數據,並沒有分位數的結果。

kafka-dump-log

用來查看消息文件的數據,或者讀取到一個文件中。

bin/kafka-dump-log.sh --files /tmp/kafka-logs/hello-events-0/00000000000000000000.log

使用這個腳本需要指定一個 .log 文件的路徑,讀取結果的內容都是一條條類似如下格式的內容:

baseOffset: 1035315 lastOffset: 1035329 count: 15 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 1073690676 CreateTime: 1637914980747 size: 15556 magic: 2 compresscodec: none crc: 4007605223 isvalid: true

包含了消息集合位移範圍、數量、創建時間、壓縮算法等信息。如果想看每一條的具體信息,可以通過在命令之後添加 --deep-iteration 查看。結果格式如下:

baseOffset: 182055 lastOffset: 182069 count: 15 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 188803172 CreateTime: 1637914971926 size: 15556 magic: 2 compresscodec: none crc: 2670957992 isvalid: true | offset: 182055 CreateTime: 1637914971926 keySize: -1 valueSize: 1024 sequence: -1 headerKeys: [] | offset: 182056 CreateTime: 1637914971926 keySize: -1 valueSize: 1024 sequence: -1 headerKeys: [] | offset: 182057 CreateTime: 1637914971926 keySize: -1 valueSize: 1024 sequence: -1 headerKeys: [] (省略部分類似的內容)

增加了每一條消息的具體信息,你甚至還可以通過加 --print-data-log 查看到消息的具體內容。

kafka-consumer-groups

kafka-consumer-groups 腳本除了之前介紹過的用途,還可以用來查看消費者組的位移,命令如下:

bin/kafka-consumer-groups.sh --describe --all-groups --bootstrap-server localhost:9092

執行後可以得到如下結果:

GROUP TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID perf-consumer-27937 hello-events 0 100495 3513680 3413185 - - -

這個命令會列出所有消費者組的信息,如果想要查看單個消費者組的信息,把其中的 --all-groups 替換成 --group <group_id> 即可。