深入瞭解kafka系列-主題

前言

主題和分區是Kafka 的兩個核心概念,前面系列中講述的生產者和消費者的設計理念所針對的都是主題和分區層面的操作。主題作爲消息的歸類,可以再細分爲一個或多個分區,分區也可以看作對消息的二次歸類。分區的劃分不僅爲Kafka提供了可伸縮性、水平擴展的功能,還通過多副本機制來爲Kafka提供數據冗餘以提高數據可靠性。

從Kafka的底層實現來說,主題和分區都是邏輯上的概念,分區可以有一至多個副本,每個副本對應一個日誌文件,每個日誌文件對應一至多個日誌分段(LogSegment),每個日誌分段還可以細分爲索引文件、日誌存儲文件和快照文件等。不過對於使用Kafka進行消息收發的普通用戶而言,瞭解到分區這一層面足以應對大部分的使用場景,這裏暫時只說到主題和分區,更底層的內容會在後續這個系列持續講解~

主題的管理

主題的管理包括創建主題、查看主題信息、修改主題和刪除主題等操作。可以通過 Kafka提供的 kafka-topics.sh腳本來執行這些操作,這個腳本位於$KAFKA_HOME/bin/目錄下,其核心代碼僅有一行,具體如下:

exec $(dirname $0)/kafka-run-class.sh kafka.admin.TopicCommand "$@"

當然主題的管理並非只有使用 kafka-topics.sh 腳本這一種方式,我們還可以通過KafkaAdminClient 的方式實現(這種方式實質上是通過發送 CreateTopicsRequest、DeleteTopicsRequest 等請求來實現的,甚至我們還可以通過直接操縱日誌文件和ZooKeeper節點來實現,這個後續我會單獨抽出來放在這個系列繼續講解~

1 創建主題

如果broker端配置參數auto.create.topics.enable設置爲true(默認值就是true),那麼當生產者向一個尚未創建的主題發送消息時,會自動創建一個分區數爲num.partitions (默認值爲1)、副本因子爲default.replication.factor(默認值爲1)的主題。不建議這樣操作,topic 未知難以維護,建議下面這種方式:

 bin/kafka-topics.sh --create --zookeeper localhost:2181/kafka100 --topic topic-create --replication-factor 2 --partitions 4

上面的示例中創建了一個分區數爲 4、副本因子爲 2 的主題.

三個broker節點一共創建了8個文件夾,這個數字8實質上是分區數4與副本因子2的乘積。每個副本(或者更確切地說應該是日誌,副本與日誌一一對應)才真正對應了一個命名形式如<topic>-<partition>的文件夾。主題、分區、副本和 Log(日誌)的關係如圖所示

同一個分區中的多個副本必須分佈在不同的broker中,這樣才能提供有效的數據冗餘。對於示例中的分區數爲4、副本因子爲2、broker數爲3的情況下,按照2、3、3的分區副本個數分配給各個broker是最優的選擇。再比如在分區數爲3、副本因子爲3,並且broker數同樣爲3的情況下,分配3、3、3的分區副本個數給各個broker是最優的選擇,也就是每個broker中都擁有所有分區的一個副本。

2 分區副本的分配

這裏的分區分配是指爲集羣制定創建主題時的分區副本分配方案,即在哪個broker中創建哪些分區的副本 在創建主題時,如果使用了replica-assignment參數,那麼就按照指定的方案來進行分區副本的創建;如果沒有使用replica-assignment參數,那麼就需要按照內部的邏輯來計算分配方案了。使用kafka-topics.sh腳本創建主題時的內部分配邏輯按照機架信息劃分成兩種策略:未指定機架信息和指定機架信息。如果集羣中所有的 broker節點都沒有配置broker.rack參數,或者使用disable-rack-aware參數來創建主題,那麼採用的就是未指定機架信息的分配策略,否則採用的就是指定機架信息的分配策略

3 查看主題

kafka-topics.sh腳本有5種指令類型:create、list、describe、alter和delete。其中list和describe指令可以用來方便地查看主題信息,通過list指令可以查看當前所有可用的主題,示例如下:

 bin/kafka-topics.sh --zookeeper localhost:2181 --list

查看指定topic信息

 bin/kafka-topics.sh --zookeeper localhost:2181 --describe --topic topic-create

4 修改主題

當一個主題被創建之後,依然允許我們對其做一定的修改,比如修改分區個數、修改配置等,這個修改的功能就是由kafka-topics.sh腳本中的alter指令提供的。我們首先來看如何增加主題的分區數。以前面的主題topic-config爲例,當前分區數爲1,修改爲3,示例如下:

# bin/kafka-topics.sh --zookeeper localhost:2181/kafka --alter --topic topic-config --partitions 3WARNING: If partitions are increased for a topic that has a key, the partition logic or ordering of the messages will be affectedAdding partitions succeeded!
# bin/kafka-topics.sh --zookeeper localhost:2181/kafka --describe --topic topic-createTopic:topic-config PartitionCount:3 ReplicationFactor:1 Configs:Topic: topic-config Partition: 0 Leader: 2 Replicas: 2 Isr: 2Topic: topic-config Partition: 1 Leader: 0 Replicas: 0 Isr: 0Topic: topic-config Partition: 2 Leader: 1 Replicas: 1 Isr: 1

當主題中的消息包含key時(即key不爲null),根據key計算分區的行爲就會受到影響,對於基於key計算的主題而言,建議在一開始就設置好分區數量,避免以後對其進行調整。目前Kafka只支持增加分區數而不支持減少分區數.

5 刪除主題

如果確定不再使用一個主題,那麼最好的方式是將其刪除,這樣可以釋放一些資源,比如磁盤、文件句柄等。kafka-topics.sh腳本中的delete指令就可以用來刪除主題,比如刪除一個主題topic-delete.

初識KafkaAdminClient

一般情況下,我們都習慣使用kafka-topics.sh腳本來管理主題,但有時候我們希望將主題管理類的功能集成到公司內部的系統中,打造集管理、監控、運維、告警爲一體的生態平臺.

KafkaAdminClient繼承了org.apache.kafka.clients.admin.AdminClient抽象類,並提供了多種方法。篇幅限制,下面只列出與本章內容相關的一些方法。

創建主題:

CreateTopicsResult createTopicsCollectionNewTopicnewTopics

刪除主題:

DeleteTopicsResult deleteTopicsCollectionStringtopics)。

列出所有可用的主題:

ListTopicsResult listTopics()。

查看主題的信息:

DescribeTopicsResult describeTopicsCollectionStringtopicNames

查詢配置信息:

DescribeConfigsResult describeConfigsCollectionConfigResourceresources

修改配置信息:

AlterConfigsResult alterConfigsMapConfigResourceConfigconfigs

增加分區:

CreatePartitionsResult createPartitionsMapStringNewPartitionsnewPartitions

原創不易,如果覺得有點用的話,請毫不留情點個贊,轉發一下,這將是我持續輸出優質文章的最強動力。


本文分享自微信公衆號 - 小技術君(gh_2fd927ba125d)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

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