Kafka分区分配策略

如题所述

第1个回答  2022-06-25
分区的原因

(1)方便在集群中扩展,每个Partition可以通过调整以适应它所在的机器,而一个topic又可以有多个Partition组成,因此整个集群就可以适应任意大小的数据了;

(2)可以提高并发,因为可以以Partition为单位读写了

(1)  指明 partition 的情况下,直接将指明的值直接作为 partiton 值;

(2)没有指明 partition 值但有 key 的情况下,将 key 的 hash 值与 topic 的 partition 数进行取余得到 partition 值;

(3) 既没有 partition 值又没有 key 值的情况下, kafka采用Sticky Partition(黏性分区器),会 随机选择一个分区,并尽可能一直使用该分区,待该分区的batch已满或者已完成,kafka再随机一个分区进行使用.(以前是一条条的轮询,现在是一批次的轮询)

在 Kafka内部存在两种默认的分区分配策略:Range和 RoundRobin,StickyAssignor。

Range是默认策略。Range是对每个Topic而言的(即一个Topic一个Topic分),首先对同一个Topic里面的分区按照序号进行排序,并对消费者按照字母顺序进行排序。然后用Partitions分区的个数除以消费者线程的总数来决定每个消费者线程消费几个分区。如果除不尽,那么前面几个消费者线程将会多消费一个分区。

例如:我们有10个分区,两个消费者(C1,C2),3个消费者线程,10 / 3 = 3而且除不尽。

C1-0 将消费 0, 1, 2, 3 分区

C2-0 将消费 4, 5, 6 分区

C2-1 将消费 7, 8, 9 分区

第一步:将所有主题分区组成TopicAndPartition列表,然后对TopicAndPartition列表按照hashCode进行排序,最后按照轮询的方式发给每一个消费线程。

我们再来看一下StickyAssignor策略,“sticky”这个单词可以翻译为“粘性的”,Kafka从0.11.x版本开始引入这种分配策略,它主要有两个目的:

分区的分配要尽可能的均匀,分配给消费者者的主题分区数最多相差一个;

分区的分配尽可能的与上次分配的保持相同。(遇到一个消费者挂掉的情况

,会把挂掉消费者上的分区再分配,而不是全部重新分配)

Kafka中生产消息时的三种分区分配策略
总结来说,Kafka中提供的三种分区分配策略各有优劣,开发者应根据实际需求和性能目标选择合适的策略。Sticky Partitioner和UnifromStickyPartitioner策略旨在优化延迟和消息处理效率,而RoundRobinPartitioner策略则侧重于负载均衡,确保资源的合理分配。

kafka的分区分配
消费者分区分配则涉及到消费组内的消费者如何分配主题的分区。Kafka默认策略是每个消费者在一个主题中独占一个分区,消费者可以根据RangeAssignor、RoundRobinAssignor或StickyAssignor等策略进行分配。而集群创建主题时,还会涉及副本分配,影响负载均衡。为了优化消费性能,可以采用批量消费模式,通过配置并发数来提...

Kafka分区策略
分区策略是消息发送到哪个分区的决策规则,Kafka提供了默认策略以及自定义选项。常见的策略有:轮询策略(Round-robin):默认策略,消息按照顺序分配到各个分区,保证负载均衡。对于大多数情况,这是最常用的策略。随机策略:消息随机分配到任一分区,虽然试图均匀分布,但不如轮询策略稳定。Key-Ordering策略:...

Kafka分区分配策略
在 Kafka内部存在两种默认的分区分配策略:Range和 RoundRobin,StickyAssignor。Range是默认策略。Range是对每个Topic而言的(即一个Topic一个Topic分),首先对同一个Topic里面的分区按照序号进行排序,并对消费者按照字母顺序进行排序。然后用Partitions分区的个数除以消费者线程的总数来决定每个消...

从零开始掌握Kafka Rebalance和分区分配
当Leader选举完成时,根据配置的RangeAssignor算法,进行消费方案的分配。RangeAssignor是Kafka默认的分区分配策略,其算法原理简单易懂。Kafka的Topic管理同样重要,支持增删改查操作。通过以下命令进行相关操作:创建Topic、删除Topic、修改Topic配置、显示Topic详细信息。创建Topic:`kafka-topics.sh --create --...

Kafka分区数量设置详解
默认的分区分配策略是range,优先级为消费者线程数量,分区按序号排序,消费者按字母顺序排序,每个消费者消费指定数量的分区。roundrobin策略需要所有消费者的num.streams相等且订阅主题相同,分区按hashCode排序后分配给消费者线程。增加分区数量能提高吞吐量,但也需考虑内存、线程、文件句柄和高可用性的影响。

Kafka 源码解析之 Consumer 两种 commit 机制和 partition 分配机制
consumer 提供的两种不同 partition 分配策略,可以通过 partition.assignment.strategy 参数进行配置,默认情况下使用的是 org.apache.kafka.clients.consumer.RangeAssignor,Kafka 中提供另一种 partition 的分配策略 org.apache.kafka.clients.consumer.RoundRobinAssignor 用户可以自定义相应的 partition 分配...

kafka重要知识点之消费组概念
Kafka提供三种分区分配策略:RangeAssignor、RoundRobinAssignor和StickyAssignor。RangeAssignor策略在分配分区时倾向于将分区平均分配给消费者,但可能导致某些消费者负载过高。RoundRobinAssignor策略更公平,它按照字典序将消费者与主题分区进行排序,确保分区负载均衡。StickyAssignor策略则在分配时保持分区的稳定,即使...

Kafka Consumer Group和Consumer Rebalance机制
默认情况下,Kafka提供了两种分配策略:Range和RoundRobin 。range策略的具体步骤如下:举个例子,比如有两个消费者C0和C1,两个topic(t0,t1),每个topic有三个分区p(0-2),那么采用Range策略,分配出的结果为:RoundRobin策略和Range策略类型,唯一的区别就是Range策略分配partition时,是按照topic逐次...

如何确定Kafka的分区数,key和consumer线程数
下面说说Kafka提供的两种分配策略: range和roundrobin,由参数partition.assignment.strategy指定,默认是range策略。本文只讨论range策略。所谓的range其实就是按照阶段平均分配。举个例子就明白了,假设你有10个分区,P0 ~ P9,consumer线程数是3, C0 ~ C2,那么每个线程都分配哪些分区呢?C0 消费分区 0...

相似回答
大家正在搜