kafka分区

Posted WaveVector

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kafka分区相关的知识,希望对你有一定的参考价值。

# kafka分区数的确定

## 1、kafka分区

* Kafka可以将主题划分为多个分区(Partition),会根据分区规则选择把消息存储到哪个分区中,只要如果分区规则设置的合理,那么所有的消息将会被均匀的分布到不同的分区中,这样就实现了负载均衡和水平扩展。

## 2、各角色对分区的操作

* kafka的生产者和消费者都可以多线程地并行操作,而每个线程处理的是一个分区的数据。因此分区实际上是调优Kafka并行度的最小单元。

* 对于producer而言,它实际上是用多个线程并发地向不同分区所在的broker发起Socket连接同时给这些分区发送消息;

* 而consumer呢,同一个消费组内的所有consumer线程都被指定topic的某一个分区进行消费;

* 如果一个topic分区越多,理论上整个集群所能达到的吞吐量就越大。

但是分区是不是越多越好呢?显然不是,因为没个分区都有自己的资源占用开销,分区多了,资源占用同样也多了,反而更占资源了。


## 3、分区的几个限制地方

* 分区数,限制了consumer的并行度,即限制了并行consumer消息的线程数不能大于分区数;

* 分区数,限制了producer发送消息是指定的分区(如创建topic时分区设置为1,producer发送消息时通过自定义的分区方法指定分区为2或以上的数都会出错的);


## 4、分区与偏移量(Offset)、消费线程、消费者组(group.id)的关系

* 一组(类)消息通常由某个topic来归类,我们可以把这组消息"分发"给若干个分区(partition),每个分区的消息各不相同;

* 每个分区都维护着他自己的偏移量(Offset),记录着该分区的消息此时被消费的位置;

* 一个消费线程可以对应若干个分区,但一个分区只能被具体某一个消费线程消费;

* group.id用于标记某一个消费组,每一个消费组都会被记录他在某一个分区的Offset,即不同consumer group针对同一个分区,都有"各自"的偏移量。

* kafka中的topic在消费时,整体上是无序的,而每个分区的内部消费是有顺序的,如果想要全局有序,可以设置一个分区,但是这样的话丢失了很多的性能。


## 5、分区简单总结

* 分区数限制了上下游的线程数,可以理解整体的并行度。

* 分区数是为了实现负载均衡。

* 分区设计需要考虑各角色的资源占用,副本数,文件句柄数等等


## 6、如何合理的设置分区数

* 一个topic分区的个数不是随意来来设置的,需要有些衡量的指标。

* 可以使用如下方法进行测试:

*(1)、创建只有一个分区数的topic

*(2)、然后测试这个topic的producer和consumer吞吐量

*(3)、假设它们的值分别为Tp和Tc,单位可以是MB/s

*(4)、然后假设总的目标吞吐量是Tt,那么分区数 = Tt / max(Tp, Tc)

* 注意:

* Tp表示producer的吞吐量。测试producer通常是很容易的,因为它的逻辑非常简单,就是直接发送消息到Kafka就好了。

* Tc表示consumer的吞吐量。测试Tc通常与应用的关系更大, 因为Tc的值取决于你拿到消息之后执行什么操作,因此Tc的测试通常也要麻烦一些。

* 总的目标吞吐量是Tt,可以理解为说业务数据每秒实际产生的数据量


以上是关于kafka分区的主要内容,如果未能解决你的问题,请参考以下文章

2、kafka如何选定分区数量

kafka可以修改分区不

Kafka-分区分配策略

kafka分区分布

kafka分区

kafka出现若干分区不消费的现象