一、基本概念
Kafka是一個高吞吐量的、分散式的發布/訂閱消息系統。在Kafka中,消息被組織為一個或多個主題,每個主題由一個或多個分區組成。分區是Kafka消息的最小單元,也是實現高吞吐量的基礎。
Partition是Kafka中的一種基本概念,它是一個有序且不可變的消息序列。消息被順序追加到Partition中,並且保證了一定的順序性和持久性。
每個Partition都有一個唯一的標識符(即Partition ID),這個標識符是由Kafka自動生成的,並且在創建Partition時被指定。每個Partition在集群中有一個或多個副本,這些副本被分布在不同的Broker上。
二、Partition的作用
Partition的設計是為了實現高吞吐量。在Kafka中,每個Partition都是一個有序、不可變的消息隊列,可以使所有的消息都以儘可能高的吞吐量被寫入和讀取。另外,Partition還有以下兩個作用:
1、水平擴展:通過將消息分布到多個Partition上,可以實現消息的水平擴展,從而提高Kafka的吞吐量和容量。
2、數據耐久性:由於消息被追加到Partition中並在多個Broker上進行備份,因此即使某些Broker宕機或數據丟失,消息也可以高效非同步地進行恢復。
三、Partition的同步和非同步複製
在Kafka中,Replica是Partition的副本,在集群中有多個Replica可以保障消息的高可用性。Replica可以分為同步複製和非同步複製兩種方式。
同步複製:同步複製是指當主Replica接收到消息並將其寫到本地磁碟之後,才會向所有副本(包括非同步副本和同步副本)發送確認消息。只有等到所有副本都寫入完畢之後,主Replica才會返回消息確認,再開啟下一輪消息的寫入流程。
非同步複製:非同步複製是指當主Replica接收到消息並將其寫到本地磁碟之後,即會立即返回確認消息並開啟下一個消息的寫入流程,在之後的某個時間,在非同步狀態下向副本發送消息並進行備份。
四、Partition的動態分配
在Kafka集群中,每個Broker都會負責一部分Partition,稱為該Broker的負責Partition集(Partition Ownership Set)。在某些情況下,可能需要對Partition的動態分配進行調整以滿足一些需求,比如:
1、增加Broker、減少Broker時需要重新平衡Partition。在向集群中添加或刪除Broker時,需要重新平衡Partition,以保證集群的整體負載均衡性。
2、手動分配Partition:當需要將某些Partition單獨分配給某些Broker時,可以使用手動分配的方式進行配置。
Kafka提供了Rebalance protocol來支持Partition的自動分配,它通過ZooKeeper或其他協調系統進行領導選舉,並按照一定的規則、策略對Partition進行重新分配。Rebalance可以分為兩個階段: 1、Partition的各個副本(role)和Broker(broker)的變化會觸發類Raft選主機制的Rebalance第一個階段,需要所有副本和broker都加入到Rebalance的候選列表,在"全部副本在broker上就位"時完成。這個過程中回涉及到broker上面的datalog策略(數量、時效等),機器選舉策略(保證分布均勻、性能優良、可靠)等設計。 2、當Rebalance Leader產生後,會將Rebalance操作下發給Follower broker,Follower broker接收到消息後,需要重新調整自己所負責的Partition,觸發Partition的選擇進行自我重新分配。
五、Partition的使用
Kafka中的Partition是實現高吞吐量的基礎。在使用Kafka時,我們通常需要進行以下步驟:
1、創建Topic: 在Kafka中創建Topic時需要指定其名稱、Partition數量、以及Replication Factor(副本數)。這裡Partition數量的選擇需要根據實際情況和需求來進行調整。
2、生產者往Topic中寫入數據:生產者負責將消息寫入到指定的Topic和Partition中。
3、消費者從Topic中讀取數據:消費者可以從指定的Partition中讀取數據,讀取的方式可以是順序讀取或隨機讀取。Partition副本的同步和非同步備份可以保障數據的可用性和持久性。
// 代碼示例:創建5個Partition和2個副本的Topic bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 2 --partitions 5 --topic my-test-topic
六、總結
Kafka Partition是Kafka消息隊列中的基本單位,每個Partition都是一個有序、不可變的消息序列。Partition可以實現水平擴展,提高Kafka的吞吐量和容量。同時,Partition還可以保障數據的可用性和持久性,保證高效非同步地進行恢復。Partition的動態分配可以通過Rebalance進行自動實現,也可以手動分配。
原創文章,作者:CPGD,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/148783.html