前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kafka精进 | Producer端核心参数及调优建议

Kafka精进 | Producer端核心参数及调优建议

作者头像
大数据技术架构
修改2020-04-22 19:55:11
5390
修改2020-04-22 19:55:11
举报

前言

在前面文章《Kafka精进 | 一文读懂Producer消息发送机制》中,我们从Kafka消息结构、序列化器、分区器及消息缓冲池等方面介绍了Producer端的原理,回顾示意图如下:

实际使用中,Producer端既要保证吞吐量,又要确保无消息丢失,一些核心参数的配置显得至关重要。本文我们就来看看生产端都有哪些重要的参数。

生产端核心参数

1. acks

参数说明:这是一个非常重要的参数,表示指定分区中成功写入消息的副本数量,这是Kafka生产端消息的持久性(durability)保证。只有当leader确认已成功写入消息的副本数后,才会给Producer发送响应,此时消息才可以认为“已提交”。该参数影响着消息的可靠性以及生产端的吞吐量,并且两者往往相向而驰,通常消息可靠性越高则生产端的吞吐量越低,反之亦然。acks有3个取值:

  • acks = 0:表示生产端发送消息后立即返回,不等待broker端的响应结果。通常此时生产端吞吐量最高,消息发送的可靠性最低。
  • acks = 1: 表示leader副本成功写入就会响应Producer,而无需等待ISR(同步副本)集合中的其他副本写入成功。这种方案提供了适当的持久性,保证了一定的吞吐量。默认值即是1。
  • acks = all或-1: 表示不仅要等leader副本成功写入,还要求ISR中的其他副本成功写入,才会响应Producer。这种方案提供了最高的持久性,但也提供了最差的吞吐量。

调优建议:建议根据实际情况设置,如果要严格保证消息不丢失,请设置为all或-1;如果允许存在丢失,建议设置为1;一般不建议设为0,除非无所谓消息丢不丢失。

2. max.request.size

参数说明:这个参数比较重要,表示生产端能够发送的最大消息大小,默认值为1048576,即1M。

调优建议:一般而言,这个配置有点小,为了避免因消息过大导致发送失败,建议适当调大,比如调到10485760即10M。

3. retries

参数说明:表示生产端消息发送失败时的重试次数,默认值为0,表示不进行重试。这个参数一般是为了解决因瞬时故障导致的消息发送失败,比如网络抖动、leader换主,其中瞬时的leader重选举是比较常见的。因此这个参数的设置显得非常重要。

另外为了避免频繁重试的影响,两次重试之间都会停顿一段时间,受参数retry.backoff.ms,默认为100ms,通常可以不调整。

调优建议:这里要尽量避免消息丢失,建议设置为一个大于0的值,比如3或者更大值。

4. compression.type

参数说明:表示生产端是否对消息进行压缩,默认值为none,即不压缩消息。压缩可以显著减少网络IO传输、磁盘IO以及磁盘空间,从而提升整体吞吐量,但也是以牺牲CPU开销为代价的。当前Kafka支持4种压缩方式,分别是gzip、snappy、lz4 及 zstd(Kafka 2.1.0开始支持)。

调优建议:出于提升吞吐量的考虑,建议在生产端对消息进行压缩。对于Kafka而已,综合考虑吞吐量与压缩比,建议选择lz4压缩。如果追求最高的压缩比则推荐zstd压缩。

5. buffer.memory

参数说明:表示生产端消息缓冲池或缓冲区的大小,默认值为33554432,即32M。这个参数基本可以认为是Producer程序所使用的内存大小。

当前版本中,如果生产消息的速度过快导致buffer满了的时候,将阻塞max.block.ms(默认60000即60s)配置的时间,超时将会抛TimeoutException异常。在Kafka 0.9.0及之前版本,建议设置另一个参数block.on.buffer.full为true,该参数表示当buffer填满时Producer处于阻塞状态并停止接收新消息而不是抛异常。

调优建议:通常我们应尽量保证生产端整体吞吐量,建议适当调大该参数,也意味着生产客户端会占用更多的内存。也可以选择不调整。

6. batch.size

参数说明:发送到缓冲区中的消息会被分为一个一个的batch,分批次的发送到broker 端,这个参数就表示batch批次大小,默认值为16384,即16KB。因此减小batch大小有利于降低消息延时,增加batch大小有利于提升吞吐量。

调优建议:通常合理调大该参数值,能够显著提升生产端吞吐量,比如可以调整到32KB,调大也意味着消息会有相对较大的延时。

7. linger.ms

参数说明:用来控制batch最大的空闲时间,超过该时间的batch也会被发送到broker端。这实际上是一种权衡,即吞吐量与延时之间的权衡。默认值为0,表示消息需要被立即发送,无需关系batch是否被填满。

调优建议:通常为了减少请求次数、提升整体吞吐量,建议设置一个大于0的值,比如设置为100,此时会在负载低的情况下带来100ms的延时。

8. request.timeout.ms

参数说明:这个参数表示生产端发送请求后等待broker端响应的最长时间,默认值为30000,即30s,超时生产端可能会选择重试(如果配置了retries)。

调优建议:该参数默认值一般够用了。如果生产端负载很大,可以适当调大以避免超时,比如可以调到60000。

9. max.in.fight.requests.per.connection

参数说明:这个参数非常重要,表示生产端与broker之间的每个连接最多缓存的请求数,默认值为5,即每个连接最多可以缓存5个未响应的请求。这个参数通常用来解决分区乱序的问题。

调优建议:为了避免消息乱序问题,建议将该参数设置为1,表示生产端在某个broker响应之前将无法再向该broker发送消息请求,这能够有效避免同一分区下的消息乱序问题。

无消息丢失配置

本文开始我们提到,Producer既要保证吞吐量,又要确保无消息丢失。结合上面的参数介绍,这里给出消息无丢失的配置列表,如下:

  • acks = all or -1
  • retries = 3
  • max.in.fight.requests.per.connection = 1
  • 使用带回调机制的send方法即send(record, callback)发送消息,并对失败消息进行处理
  • unclean.leader.election.enable = false
  • replication.factor = 3
  • min.insync.replicas = 2
  • enable.auto.commit = false

前3个参数本文已介绍。最后一个是消费端参数,表示禁用自动提交,后面我们再介绍。其他几个属于broker端的参数。

其中比较难理解的是min.insync.replicas,这个参数表示ISR集合中的最少副本数,默认值是1,并只有在acks=all或-1时才有效。acks与min.insync.replicas搭配使用,才能为消息提供最高的持久性保证。我们知道leader副本默认就包含在ISR中,如果ISR中只有1个副本,acks=all也就相当于acks=1了,引入min.insync.replicas的目的就是为了保证下限:不能只满足于ISR全部写入,还要保证ISR中的写入个数不少于min.insync.replicas。常见的场景是创建一个三副本(即replication.factor=3)的topic,最少同步副本数设为2(即min.insync.replicas=2),acks设为all,以保证最高的消息持久性。

总结

至此生产端重要的参数基本介绍完了。总结起来,本文首先介绍了Producer端的核心参数,说明参数含义的同时并给出了调优建议,最后给出了一份消息无丢失的参数配置列表供参考。更多生产端参数介绍可以参考Kafka官网http://kafka.apache.org/documentation/#producerconfigs。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据技术架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 生产端核心参数
    • 1. acks
      • 3. retries
        • 4. compression.type
          • 5. buffer.memory
            • 6. batch.size
              • 7. linger.ms
                • 8. request.timeout.ms
                • 无消息丢失配置
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档