深入理解Kafka(九) 吞吐量相关参数
下面我们来介绍下Kafka怎么调优吞吐量相关的参数,首先我们需要确定当我们想要调优kafka的时候,我们需要从哪些方面开始呢,一般来说,我们需要从性能,可用性和持久性来做集群的调优配置,下面就来解释一下这几个方面:
1.性能,主要包括吞吐量和延时
吞吐量:broker或client每秒能处理多少字节
延时:通常指producer发送消息到broker端持久化保存消息之间的时间间隔,也可以指producer发送一条消息到consumer接受这条消息的时间间隔。
2.可用性
在某段时间内,系统或组件正常运行的概率或在时间上的比率。
3.持久性
确保了已提交操作所产生的效果会被永久地保持,即使系统出现崩溃。对于kafka来说,持久性通常意味着已提交的消息需要被持久化到broker底层的文件系统而不能发生丢失。
知道了需要从哪些方面做调优之后,下面在来看看如何调优kafka的吞吐量。首先就是确定broker端的分区数,我们知道,kafka的topic是被放到不同的partitiion,在producer端可以同时对多个分区发送消息,而这些消息也可以被写入到多个broker中由多个consumer同时消费。因此,如何设置分区数成为了调优吞吐量的重点,下面给出一个基本公式,但是需要注意的是,具体情况需要具体分析,还是以实际生产环境数据为依据比较好,一般来说,可以先创建单分区的topic,然后在生产机器上分别测试producer和consumer的tps,分别为t1和t2,假设目标tps为t3,那么分区数则可以确定为t3/max(t1,t2)。值得注意的是,在测试producer端tps通常是很容易的,因为逻辑比较简单,直接发送消息给broker即可,但测试consumer端tps时,应该尽量使用真实的消息处理逻辑,这样测试的结果才能准确的反映线上环境的数据。
在确定了分区数后,我们将从producer,broker,consumer这3个方面来讨论如何调优tps的参数。
首先broker端:
应该适当增加num.replica.fetchers,这个参数代表了broker的follower replica从leader拉取消息的最大线程数,默认值为1,表示follower raplica只使用一个线程从leader拉取消息。对于设置了asks=all的producer来说,主要延时可能都在follower与leader同步消息的过程,因此增加该值通常能够减少同步消息的时间间隔,从而可以提高producer端的tps。所以需要设置该参数来保证更好的性能。
对于producer端:
1.应当适当增加batch.size,比如说增加到100-512kb,我们知道,producer是批量发送消息的,它会将消息放到队列中,然后在一个发送请求中统一发送消息。更大的batch.size可以使一个请求发送更多的消息,所以可以提高tps,还有另一个参数linger.ms,是等待发送消息的延时,提高linger.ms也会让一个请求发送更多的消息,从而提高tps,当然这样就会降低延时,所以需要根据具体的情况选择参数值。
2.可以设置消息压缩,compression.type为kafka的消息压缩类型,对消息进行压缩可以减少网络传输量,从而提高tps。可以考虑设置消息压缩来提高发送消息的效率。
3.acks设置为0或1,我们知道,当producer发送消息给broker时,默认情况下,producer会等待leader返回发送结果,这时才能知道这条消息是否发送成功,consumer端也只能消息那些已经成功发送的消息。因此,调整acks参数是必要的,默认值为1表示leader把消息写入文件系统就返回,无需等待follower的ack。也可以将acks设置为0,则表示producer端不需要broker端返回结果就可以开始发送下一条消息。这种方式可以提高tps,但是会影响消息的持久化,因此需要根据实际情况去选择。
4.当acks不是0时,一旦消息发送失败,producer会根据retries参数设置的值进行重试。如果应用可以忍受消息丢失,可以将retries设置为0,这样就可以提高tps。但是需要注意的是,一旦消息发送失败,producer将不会尝试再次发送消息,应用需要自己catch异常并处理异常信息。
5.当分区数很多时,需要考虑增加buffer.memory参数。
对于consumer端:
1.可以考虑采用多consumer实例。使用多个consumer实例共同消费分区的数据,能够提高tps。最好是启动与消费的分区数相同的实例数,以保证每个实例都能分配一个具体的分区进行消费。
2.可以增加fetch.min.bytes参数,对于consumer来说,用户可以调整leader broker每次返回的最小数据量来影响tps,这就是fetch.min.bytes的作用,该参数控制了leader每次返回的最小字节数。通过增加该参数值,每次拉取消息的response会返回更多的数据,从而可以提高tp。当然在提高tps的同时也会增加延时,因此需要根据实际的调优目标确定具体的参数值。
到这里,我们就介绍了kafka吞吐量相关的参数,kafka吞吐量相关的参数就介绍到这里了。