Kafka调优之总体调优
1. Kafka参数说明
访问官网参数文档: https://kafka.apache.org/36/documentation.html#configuration 自Kafka1.1之后,Broker的一些参数配置支持动态更新, 参数更新
Update Mode
有三个选项:
- read-only: 配置生效需要重启Broker
- per-broker: 更改后可以立即生效
- cluster-wide: 集群中可以动态更新生效。
2. 关闭自动创建主题
如果Broker端配置参数auto.create.topics.enable
设置为true(默认值是true),那么当生产者向一个未创建的主题发送消息时,会自动创建一个分区数为 1、副本因子为1的主题。除此之外,当一个消费者开始从未知主题中读取消息时,或者当任意一个客户端向未知主题发送元数据请求时,都会自动创建一个相应主题。这种创建主题的方式是非预期的,增加了主题管理和维护的难度。
生产环境建议将该参数设置为false。
sh
[jack@hadoop105 config]$ vi /opt/module/kafka-3.6.1/config/kraft/server.properties
## 添加一行 auto.create.topics.enable
auto.create.topics.enable=false
3. 提升吞吐量
buffer.memory
:发送消息的缓冲区大小,默认值是32m,可以增加到64m。batch.size
:默认是16k。如果 batch设置太小,会导致频繁网络请求,吞吐量下降;如果 batch 太大,会导致一条消息需要等待很久才能被发送出去,增加网络延时。linger.ms
,这个值默认是0,意思就是消息必须立即被发送。一般设置5-100毫秒。如果linger.ms设置的太小,会导致频繁网络请求,吞吐量下降;如果 linger.ms 太长,会导致一条消息需要等待很久才能被发送出去,增加网络延时。compression.type
:默认是 none,不压缩,但是也可以使用 lz4 压缩,效率还是不错的,压缩之后可以减小数据量,提升吞吐量,但是会加大producer端的CPU开销。- 增加分区
- 消费者提高吞吐量: 调整
fetch.max.bytes
大小,默认是50m。调整max.poll.records
大小,默认是500条。 - 增加下游消费者处理能力
4. 数据精准一次
4.1 生产者角度
- acks 设置为-1 (acks=-1)。
- 幂等性(enable.idempotence = true) + 事务 。
4.2 broker 服务端角度
- 分区副本大于等于 2 (--replication-factor 2)。
- ISR 里应答的最小副本数量大于等于 2 (min.insync.replicas = 2)。
4.3 消费者
- 事务 + 手动提交 offset (enable.auto.commit = false)。
- 消费者输出的目的地必须支持事务(MySQL、Kafka)。
5. 合理设置分区数
- 创建一个只有 1 个分区的 topic。
- 测试这个 topic 的 producer 吞吐量和 consumer 吞吐量。
- 假设他们的值分别是 Tp 和 Tc,单位可以是 MB/s。
- 然后假设总的目标吞吐量是 Tt,那么分区数 = Tt / min(Tp,Tc)。
例如:producer 吞吐量 = 20m/s;consumer 吞吐量 = 50m/s,期望吞吐量 100m/s;
分区数 = 100 / 20 = 5 分区
分区数一般设置为:3-10 个
分区数不是越多越好,也不是越少越好,需要搭建完集群,进行压测,再灵活调整分区个数
6. 单条日志消息大于1M
如果单条日志消息大于1M,需要从以下参数进行调整:
参数名称 | 描述 |
---|---|
message.max.bytes | 默认 1m,broker 端接收每个批次消息最大值。 |
max.request.size | 默认 1m,生产者发往 broker 每个请求消息最大值。针对 topic级别设置消息体的大小。 |
replica.fetch.max.bytes | 默认 1m,副本同步数据,每个批次消息最大值。 |
fetch.max.bytes | 默认 Default: 52428800(50 m)。消费者获取服务器端一批消息最大的字节数。如果服务器端一批次的数据大于该值(50m)仍然可以拉取回来这批数据,因此,这不是一个绝对最大值。一批次的大小受 message.max.bytes (broker config)or max.message.bytes (topic config)影响。 |
7. 服务器宕机
在生产环境中,如果某个 Kafka 节点挂掉。正常处理办法:
(1)先尝试重新启动一下,如果能启动正常,那直接解决。
(2)如果重启不行,考虑增加内存、增加 CPU、网络带宽。
(3)如果将kafka整个节点误删除,如果副本数大于等于2, 可以按照服役新节点的方式重新服役一个新节点,并执行负载均衡。