爲什麼分區?
- 分區作用是提供負載均衡的能力,對數據分區是爲了實現系統的高伸縮性 (High Scalability).
- 不同的分區可放置在不同節點的機器上(同一個分區的副本可以分佈在不同的機器上),數據的訪問操作都是針對分區這個粒度進行的,這樣每個節點的機器都獨立執行各自分區的讀寫請求;
- 增加新的節點機器來增加整理的吞吐量;
分區策略是什麼?有哪些?
-
分區策略是指決定生產者將消息發送到哪個分區的算法
-
輪詢算法:Round-robin
- 一個主題下有三個分區Pa,Pb,Pc,消息1、4、7被分配到Pa…
- 優秀的負載均衡表現,保證消息最大限度地分配到所有分區上,默認情況下是最合理的分區策略。
-
隨機策略:Randomness
-
List partitions = cluster.partitionsForTopic(topic);
return ThreadLocalRandom.current().nextInt(partitions.size()); -
按消息鍵保存策略:Key-Ordering
-
List partitions = cluster.partitionsForTopic(topic);
return Math.abs(key.hashCode()) % partitions.size(); -
其他分區策略:基於地理位置的分區策略,針對大規模的 Kafka 集羣。根據 broker 所在的 IP 分區
-
List partitions = cluster.partitionsForTopic(topic);
return partitions.stream().filter(p -> isSouth(p.leader().host())).map(PartitionInfo::partition).findAny().get();
總結:
- Kafka 的消息組織方式實際上是三級架構:主題-分區-消息,主題下的消息會保存在某個分區下,不會在多個分區下保存多份。
- 分區機制是實現負載均衡和高吞吐的關鍵