赞
踩
Kafka可以将主题划分为多个分区(Partition),会根据分区规则选择把消息存储到哪个分区中,只要如果分区规则设置的合理,那么所有的消息将会被均匀的分布到不同的分区中,这样就实现了负载均衡和水平扩展。
kafka的生产者和消费者都可以多线程地并行操作,而每个线程处理的是一个分区的数据。因此分区实际上是调优Kafka并行度的最小单元。
对于producer而言,它实际上是用多个线程并发地向不同分区所在的broker发起Socket连接同时给这些分区发送消息;
而consumer呢,同一个消费组内的所有consumer线程都被指定topic的某一个分区进行消费;
如果一个topic分区越多,理论上整个集群所能达到的吞吐量就越大。 但是分区是不是越多越好呢?显然不是,因为没个分区都有自己的资源占用开销,分区多了,资源占用同样也多了,反而更占资源了。
分区数,限制了consumer的并行度,即限制了并行consumer消息的线程数不能大于分区数;
分区数,限制了producer发送消息是指定的分区(如创建topic时分区设置为1,producer发送消息时通过自定义的分区方法指定分区为2或以上的数都会出错的);
一组(类)消息通常由某个topic来归类,我们可以把这组消息"分发"给若干个分区(partition),每个分区的消息各不相同;
每个分区都维护着他自己的偏移量(Offset),记录着该分区的消息此时被消费的位置;
一个消费线程可以对应若干个分区,但一个分区只能被具体某一个消费线程消费;
group.id用于标记某一个消费组,每一个消费组都会被记录他在某一个分区的Offset,即不同consumer group针对同一个分区,都有"各自"的偏移量。
kafka中的topic在消费时,整体上是无序的,而每个分区的内部消费是有顺序的,如果想要全局有序,可以设置一个分区,但是这样的话丢失了很多的性能。
分区数限制了上下游的线程数,可以理解整体的并行度。
分区数是为了实现负载均衡。
分区设计需要考虑各角色的资源占用,副本数,文件句柄数等等
一个topic分区的个数不是随意来来设置的,需要有些衡量的指标。
可以使用如下方法进行测试: *(1)、创建只有一个分区数的topic *(2)、然后测试这个topic的producer和consumer吞吐量 *(3)、假设它们的值分别为Tp和Tc,单位可以是MB/s *(4)、然后假设总的目标吞吐量是Tt,那么分区数 = Tt / max(Tp, Tc)
Tp表示producer的吞吐量。测试producer通常是很容易的,因为它的逻辑非常简单,就是直接发送消息到Kafka就好了。Tp=10m
Tc表示consumer的吞吐量。测试Tc通常与应用的关系更大, 因为Tc的值取决于你拿到消息之后执行什么操作,因此Tc的测试通常也要麻烦一些。Tc=5m
总的目标吞吐量是Tt,可以理解为说业务数据每秒实际产生的数据量 100M
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。