为什么分区?
- 分区作用是提供负载均衡的能力,对数据分区是为了实现系统的高伸缩性 (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 的消息组织方式实际上是三级架构:主题-分区-消息,主题下的消息会保存在某个分区下,不会在多个分区下保存多份。
- 分区机制是实现负载均衡和高吞吐的关键