Kafka的操作
主題相關操作命令格式
# 格式
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-topics.sh --zookeeper xiaoer:2181,yangqi1:2181,yangqi2:2181/kafka --操作 [--options]
主題幫助命令
# 主題幫助命令
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-topics.sh --help
列出所有主題
# 列出所有主題
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-topics.sh --list --zookeeper xiaoer:2181,yangqi1:2181,yangqi2:2181/kafka
創建主題
# 創建主題
# 創建主題會在zk中的brokers目錄下創建對應的znode節點,同時也在消息存儲目錄下創建對應的"topic-分區編號"的目錄
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-topics.sh --create --zookeeper xiaoer:2181,yangqi1:2181,yangqi2:2181/kafka --replication-factor 1 --partitions 1 --topic test
查看創建的主題:
查看消息存儲目錄下的 topic 目錄:
查看主題
--describe 查看出來的信息,第一行是所有分區的總記錄、配置等信息。之後的每一行代表一個分區信息。
"leader" node節點是負責給定分區的所有讀和寫操作. Each node will be the leader for a randomly selected portion of the partitions。他後面跟的數字n就是broker的唯一id。
"replicas" 是複製此分區的日誌的節點列表,而不管這些節點是leader節點還是當前活動節點。後續跟的數字也是broker的唯一id。
"isr" 是一系列“在同步”的副本。這是副本列表的子集,該列表當前處於活動狀態並與leader節點保持聯繫。它後續跟的數字任然是broker的唯一id。
# 查看主題
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-topics.sh --describe --zookeeper xiaoer:2181,yangqi1:2181,yangqi2:2181/kafka --topic test
主題修改
可以修改主題分區和配置屬性等信息,不能修改副本因子,同時也不能將分區數越改越小
# 刪除 test 主題的 flush.ms 配置,如果沒有該屬性將會顯示已經更新
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-topics.sh --alter --zookeeper xiaoer:2181,yangqi1:2181,yangqi2:2181/kafka --topic test --delete-config flush.ms
# 修改增加配置
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-topics.sh --alter --zookeeper xiaoer:2181,yangqi1:2181,yangqi2:2181/kafka --topic test --config flush.ms=1000
# 刪除增加的配置
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-topics.sh --alter --zookeeper xiaoer:2181,yangqi1:2181,yangqi2:2181/kafka --topic test --delete-config flush.ms
# 修改分區數量,注意不能修改分區因子(--replication-factor),同時不能修改成相同的分區數
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-topics.sh --alter --zookeeper xiaoer:2181,yangqi1:2181,yangqi2:2181/kafka --partitions 3 --topic test
刪除主題
刪除主題時,需要停止該刪除topic
相關的生產和消費者,否則會有意想不到的問題。同時如果delete.topic.enable
的設置不是true
,則是標記刪除,也就不是真正的刪除,可以使用list
查看出來。而將delete.topic.enable
設置爲true
時,所創建的信息都會給刪除,即zookeeper
中的topics
的znode
節點刪除,刪除對應的分區目錄。
# 創建 test1 主題,設置副本數爲2,分區數爲3
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-topics.sh --create --zookeeper xiaoer:2181,yangqi1:2181,yangqi2:2181/kafka --replication-factor 2 --partitions 3 --topic test1
# 列出主題
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-topics.sh --list --zookeeper xiaoer:2181,yangqi1:2181,yangqi2:2181/kafka
# 查看主題
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-topics.sh --describe --zookeeper xiaoer:2181,yangqi1:2181,yangqi2:2181/kafka --topic test1
# 刪除主題
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-topics.sh --delete --zookeeper xiaoer:2181,yangqi1:2181,yangqi2:2181/kafka --topic test1
# 列出主題
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-topics.sh --list --zookeeper xiaoer:2181,yangqi1:2181,yangqi2:2181/kafka
如果刪除後並沒有直接刪除,需要在server.properties
設置delete.topic.enable=true
。在進行刪除之前,一定要注意將需要被刪除topic
的produce
和consume
停止。如果有程序正在生產或者消費該topic
,則該topic
的offset
信息會一直在broker
更新。調用kafka delete
命令無法刪除該topic
。同時,需要設置auto.create.topics.enable=false
,默認值爲true
,如果設置爲true
,則produce
或者fetch
不存在的topic
時也會自動創建該topic
,所以刪除之前一定要將auto.create.topics.enable
設置爲false
,而且要認真停止該topic
的生產和消費程序。
如果此時還有一些可能會有信息殘留在zookeeper
中,可以手動刪除zookeeper
中的相關信息。
# 找一個安裝了 zookeeper 集羣的機器
[yangqi@xiaoer kafka-2.3.1]$ zkCli.sh -server xiaoer:2181,yangqi1:2181,yangqi2:2181
# 刪除該 topic 的信息
[zk: xiaoer:2181,yangqi1:2181,yangqi2:2181(CONNECTED) 0] rm /kafka/brokers/topics/test1
生產消息
# 查看生產消息腳本的幫助
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-console-producer.sh
# 生產消息
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-console-producer.sh --broker-list xiaoer:9092,yangqi1:9092,yangqi2:9092 --topic test
>my test message is 1
>my test message is 2
>my test message is 3
>this is ok
消費消息
# 查看消費消息腳本的幫助
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-console-consumer.sh
# 消費消息
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-console-consumer.sh --bootstrap-server xiaoer:9092,yangqi1:9092,yangqi2:9092 --from-beginning --topic test
創建消費者組
命令不可創建消費者組,當使用 API 創建時,不存在則會自動創建
消費者組列表
每一個消費者都屬於一個消費者組,如果沒有指定,則將會生成一個。查看consumer group
列表有新、舊兩種命令,分別查看新版(信息保存在broker
中)consumer
列表和老版(信息保存在zookeeper
中)consumer
列表,因而需要區分指定bootstrap-server
和zookeeper
參數。
# 新版命令
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-consumer-groups.sh --bootstrap-server xiaoer:9092,yangqi1:9092,yangqi2:9092 --list
# 老版命令(很多版本已經不兼容)
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-consumer-groups.sh --list --zookeeper xiaoer:2181,yangqi1:2181,yangqi2:2181/kafka
刪除消費者組
# 新版命令
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-consumer-groups.sh --delete --bootstrap-server xiaoer:9092,yangqi1:9092,yangqi2:9092 --group group-test
# 老版命令(要求在 zookeeper 中要存在)
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-consumer-groups.sh --delete --zookeeper xiaoer:2181,yangqi1:2181,yangqi2:2181/kafka --group group-test
查看消費位置
# 查看消費位置(0.9.x 版本)
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --bootstrap-server xiaoer:9092,yangqi1:9092,yangqi2:9092 --topic test
# 隨便開啓一個消費者,找到其 id,即消費組。查看其消費的位置信息。如果消費者組沒被啓用,將不會顯示 CONSUMER-ID 及以後的信息
# 消費消息(在 xiaoer 機器上)
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-console-consumer.sh --bootstrap-server xiaoer:9092,yangqi1:9092,yangqi2:9092 --from-beginning --topic test
# 消費者組列表(在 yangqi1 機器上)
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-consumer-groups.sh --bootstrap-server xiaoer:9092,yangqi1:9092,yangqi2:9092 --list
# 查看消費者組(在 yangqi1 機器上)
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-consumer-groups.sh --bootstrap-server xiaoer:9092,yangqi1:9092,yangqi2:9092 --describe --group console-consumer-37253
平衡leaderd
當一個broker
停止或者崩潰時,這個broker
中所有分區的leader
將轉移給其他副本。這意味着在默認情況下,當這個broker
重啓之後,它的所有分區都將僅作爲follower
,不再用於客戶端的讀寫操作。不過,在Kafka
中有一個副本被稱爲優先副本(preferred replicas)的概念。如果一個分區有3個副本,且這3個副本的優先級分別爲1,5,9,根據優先副本的概念,第一個副本1會作爲5和9副本的leader
。爲了使Kafka
集羣恢復默認的leader
,可以選擇手動和自動另種平衡方式。
# 手動平衡 leader 命令
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-preferred-replica-election.sh --zookeeper xiaoer:2181,yangqi1:2181,yangqi2:2181/kafka
# 自動平衡 leader 操作
# Kafka 爲我們提供了一個參數,可以使得 Kafka 集羣自動平衡 leader,只需要在 server.properties 文件中配置如下配置:
auto.leader.rebalance.enable=true
# 這個值是默認開啓的
Kafka
壓測命令
測試意義:驗證每臺服務器上Kafka
寫入消息和消費消息的能力,根據測試結果評估當前Kafka
集羣模式是否滿足上億級別的消息處理能力。
測試方法:在服務器上使用Kafka
自帶的測試腳本,分別模擬10w
、100w
和1000w
的消息寫入請求,查看Kafka
處理不同數量級的消息數時的處理能力,包括每秒生成消息數、吞吐量、消息延遲時間。Kafka
消息創建topic
命名爲test-pref
,使用命令發起消費該topic
的請求,查看Kafka
消費不同數量級別的消息時的處理能力。
# 創建主題
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-topics.sh --create --zookeeper xiaoer:2181,yangqi1:2181,yangqi2:2181/kafka --replication-factor 1 --partitions 3 --topic test-pref
# 列出所有主題
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-topics.sh --list --zookeeper xiaoer:2181,yangqi1:2181,yangqi2:2181/kafka
10w
條數據壓力測試
# 寫入 10w 條消息
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-producer-perf-test.sh --topic test-pref --num-records 100000 --record-size 1000 --throughput 2000 --producer-props bootstrap.servers=xiaoer:9092,yangqi1:9092,yangqi2:9092
# 消費 10w 條消息
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-consumer-perf-test.sh --broker-list xiaoer:9092,yangqi:9092,yangqi2:9092 --topic test-pref --fetch-size 1048576 --messages 100000 --threads 1
100w
條數據壓力測試
# 寫入 100w 條消息
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-producer-perf-test.sh --topic test-pref --num-records 1000000 --record-size 2000 --throughput 5000 --producer-props bootstrap.servers=xiaoer:9092,yangqi1:9092,yangqi2:9092
# 消費 100w 條消息
[yangqi@xiaoer kafka-2.3.1]$ ./bin/kafka-consumer-perf-test.sh --broker-list xiaoer:9092,yangqi1:9092,yangqi2:9092 --topic test-pref --fetch-size 1048576 --messages 1000000 --threads 1
副本管理
# default.replication.factor
每個 Partition 有幾個副本,默認是 1,即只有 1 個副本(即不做備份)。創建時可以指定,但是創建後不能通過 alter 進行修改。