前言
主題和分區是Kafka 的兩個核心概念,前面系列中講述的生產者和消費者的設計理念所針對的都是主題和分區層面的操做。主題做爲消息的歸類,能夠再細分爲一個或多個分區,分區也能夠看做對消息的二次歸類。分區的劃分不只爲Kafka提供了可伸縮性、水平擴展的功能,還經過多副本機制來爲Kafka提供數據冗餘以提升數據可靠性。apache
從Kafka的底層實現來講,主題和分區都是邏輯上的概念,分區能夠有一至多個副本,每一個副本對應一個日誌文件,每一個日誌文件對應一至多個日誌分段(LogSegment),每一個日誌分段還能夠細分爲索引文件、日誌存儲文件和快照文件等。不過對於使用Kafka進行消息收發的普通用戶而言,瞭解到分區這一層面足以應對大部分的使用場景,這裏暫時只說到主題和分區,更底層的內容會在後續這個系列持續講解~微信
主題的管理
主題的管理包括建立主題、查看主題信息、修改主題和刪除主題等操做。能夠經過 Kafka提供的 kafka-topics.sh腳原本執行這些操做,這個腳本位於$KAFKA_HOME/bin/目錄下,其核心代碼僅有一行,具體以下:app
exec $(dirname $0)/kafka-run-class.sh kafka.admin.TopicCommand "$@"
固然主題的管理並不是只有使用 kafka-topics.sh 腳本這一種方式,咱們還能夠經過KafkaAdminClient 的方式實現(這種方式實質上是經過發送 CreateTopicsRequest、DeleteTopicsRequest 等請求來實現的,甚至咱們還能夠經過直接操縱日誌文件和ZooKeeper節點來實現,這個後續我會單獨抽出來放在這個系列繼續講解~運維
•1 建立主題flex
若是broker端配置參數auto.create.topics.enable設置爲true(默認值就是true),那麼當生產者向一個還沒有建立的主題發送消息時,會自動建立一個分區數爲num.partitions (默認值爲1)、副本因子爲default.replication.factor(默認值爲1)的主題。不建議這樣操做,topic 未知難以維護,建議下面這種方式:spa
bin/kafka-topics.sh --create --zookeeper localhost:2181/kafka100 --topic topic-create --replication-factor 2 --partitions 4
上面的示例中建立了一個分區數爲 四、副本因子爲 2 的主題..net
三個broker節點一共建立了8個文件夾,這個數字8實質上是分區數4與副本因子2的乘積。每一個副本(或者更確切地說應該是日誌,副本與日誌一一對應)才真正對應了一個命名形式如<topic>-<partition>的文件夾。主題、分區、副本和 Log(日誌)的關係如圖所示設計
![null](http://static.javashuo.com/static/loading.gif)
同一個分區中的多個副本必須分佈在不一樣的broker中,這樣才能提供有效的數據冗餘。對於示例中的分區數爲四、副本因子爲二、broker數爲3的狀況下,按照二、三、3的分區副本個數分配給各個broker是最優的選擇。再好比在分區數爲三、副本因子爲3,而且broker數一樣爲3的狀況下,分配三、三、3的分區副本個數給各個broker是最優的選擇,也就是每一個broker中都擁有全部分區的一個副本。日誌
•2 分區副本的分配code
這裏的分區分配是指爲集羣制定建立主題時的分區副本分配方案,即在哪一個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 createTopics(Collection<NewTopic>newTopics)
•刪除主題:
DeleteTopicsResult deleteTopics(Collection<String>topics)。
•列出全部可用的主題:
ListTopicsResult listTopics()。
•查看主題的信息:
DescribeTopicsResult describeTopics(Collection<String>topicNames)
•查詢配置信息:
DescribeConfigsResult describeConfigs(Collection<ConfigResource>resources)
•修改配置信息:
AlterConfigsResult alterConfigs(Map<ConfigResource,Config>configs)
•增長分區:
CreatePartitionsResult createPartitions(Map<String,NewPartitions>newPartitions)
原創不易,若是以爲有點用的話,請絕不留情點個贊,轉發一下,這將是我持續輸出優質文章的最強動力。
本文分享自微信公衆號 - 小技術君(gh_2fd927ba125d)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。