Kafka broker 调优

2018-09-28  本文已影响2729人  背锅填坑交给我

这些优化可以去官网看,官网有说明

Kafka 的架构这里就不多做介绍了,直接步入正题。

这里主要是 Kafka 集群基本配置的相关内容。

硬件要求

Kafka 集群基本硬件的保证

集群规模 内存 CPU 存储
Kafka Brokers 3+ 24GB+(小规模);64GB+(大规模) 多核(12CPU+),并允许超线程 6+ 1TB 的专属磁盘(RAID 或 JBOD)
Zookeeper 3(小规模);5(大规模) 8GB+(小规模);24GB+(大规模) 2核+ SSD 用于中间的日志传输

OS 调优

可能不需要太多操作系统级别的调优,但有一些重要的操作系统级别配置:

broker_java_opts -server -XX:MetaspaceSize=96m -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M -XX:MinMetaspaceFreeRatio=50 -XX:MaxMetaspaceFreeRatio=80 -Djava.awt.headless=true

mirror_maker_max_heap_size 8G
broker_max_heap_size 6G

Kafka 磁盘存储

Broker 配置

Broker 级别有几个比较重要的配置,一般需要根据实际情况进行相应配置的:

num.io.threads: 8 // 集群用作处理磁盘io的线程数,默认为8,建议cpu的2倍
num.recovery.threads.per.data.dir: 1 //默认值为1,建议调整为log.dirs中目录的个数?每个数据目录的线程数,被用作集群启动恢复数据,集群停止事刷新数据

默认日志留存策略是delete留存策略,可以按时间、空间、偏移量三个维度delete

log.retention.hours: 168 //日志保留时间,过期删除 默认7天
log.retention.check.interval.ms: 300000 //检查日志是否需要清除,是否过期, 默认5分钟

log.segment.bytes: 1073741824 //单个日志文件的最大值 默认1G
log.dirs: /data/1/kafka,/data/2/kafka,/data/3/kafka,/data/4/kafka,/data/5/kafka,/data/6/kafka //日志存放目录

auto.leader.rebalance.enable: true // 默认true,如果设为true,复制控制器会周期性的自动尝试,为所有的broker的每个partition平衡leadership,为更优先(preferred)的replica分配leadership。

leader.imbalance.per.broker.percentage: 10 // 默认值10 每个broker允许的不平衡的leader的百分比, 即leader均匀的分配在每个broker上 。如果每个broker超过了这个百分比,复制控制器会重新平衡leadership。

leader.imbalance.check.interval.seconds: 300 // 默认5分钟 检查leader不平衡的时间间隔。

Kafka replica 相关配置及监控

Under Replicated Partitions

当发现 replica 的配置与集群的不同时,一般情况都是集群上的 replica 少于配置数时,可以从以下几个角度来排查问题:

Controller

Unclean leader 选举

允许不在 isr 中 replica 被选举为 leader。

不严格的leader选举,有助于集群健壮,但是存在数据丢失风险。
如果关闭,leader只能从ISR中选举;如果开启,在ISR集合为空时,选择任一副本作为leader,这样做可能会导致数据丢失。

Kafka 相关资源的评估

集群评估

kafka集群服务器监控

Kafka 集群需要监控的一些指标,这些指标反应了集群的健康度。

Broker 监控

Topic 评估

合理地设置 partition

关于 Partition 的设置可以参考这篇文章How to choose the number of topics/partitions in a Kafka cluster?,这里简单讲述一下,Partition 的增加将会带来以下几个优点和缺点:

  1. 增加吞吐量:对于 consumer 来说,一个 partition 只能被一个 consumer 线程所消费,适当增加 partition 数,可以增加 consumer 的并发,进而增加系统的吞吐量;
  2. 需要更多的 fd:对于每一个 segment,在 broker 都会有一个对应的 index 和实际数据文件,而对于 Kafka Broker,它将会对于每个 segment 每个 index 和数据文件都会打开相应的 file handle(可以理解为 fd),因此,partition 越多,将会带来更多的 fd;
  3. 可能会增加数据不可用性(主要是指增加不可用时间):主要是指 broker 宕机的情况,越多的 partition 将会意味着越多的 partition 需要 leader 选举(leader 在宕机这台 broker 的 partition 需要重新选举),特别是如果刚好 controller 宕机,重新选举的 controller 将会首先读取所有 partition 的 metadata,然后才进行相应的 leader 选举,这将会带来更大不可用时间;
  4. 可能增加 End-to-end 延迟:一条消息只有其被同步到 isr 的所有 broker 上后,才能被消费,partition 越多,不同节点之间同步就越多,这可能会带来毫秒级甚至数十毫秒级的延迟;
  5. Client 将会需要更多的内存:Producer 和 Consumer 都会按照 partition 去缓存数据,每个 partition 都会带来数十 KB 的消耗,partition 越多, Client 将会占用更多的内存。

Producer 的相关配置、性能调优及监控

Quotas

Kafka Producer

性能调优

Prodcuer 监控

Kafka Consumer 配置、性能调优及监控

Kafka Consumer

Consumer 配置

Consumer 监控

consumer 是否跟得上数据的发送速度。

上一篇下一篇

猜你喜欢

热点阅读