本文来自于DataWorks Summit/Hadoop Summit上的《Apache Kafka最佳实践》分享,里面给出了很多关于Kafka的使用心得,非常值得一看,今推荐给大家。

硬件配置

JBOD: Just bunch of disks,就是普通的一堆磁盘组成的集群

OS调优

1 页缓存:尽量分配与所有日志的激活日志段大小相同的页缓存大小
2 文件描述符限制: 10万以上
3 禁掉swap
4 使用Java 8和G1,分配6~8GB的堆大小

磁盘调优

1 使用多块磁盘,专属分配给kafka
2 一般环境使用JBOD即可,但JBOD有一些固有的缺陷,比如磁盘失败将导致Kafka异常关闭,造成数据不一致,社区已经着手解决
3 使用EXT4或XFS
4 尽量使用SSD

基本监控

1 CPU负载
2 网络带宽
3 文件句柄数
4 磁盘空间
5 磁盘IO性能
6 垃圾回收
7 zookeeper监控

如何监控备份不足情况发生?

JMX指标:kafka.server:type=ReplicaManager,name=UnderReplicatedPartitions

可能原因
  • broker挂了
  • controller问题
  • zk问题
  • 网络问题
解决办法
  • 调整ISR参数,比如 min.insync.replica和replica.lag.time.max.ms, num.replica.fetchers
  • 增加broker数

controller问题

1 避免zk会话超时
  • ISR抖动
  • zk性能问题
  • Long GC
  • 网络问题
 2 监控controller
  • kafka.controller:type=KafkaController,name=ActiveControllerCount应该=1
  • 监控LeaderElectionRate

unclean leader选举

1 允许非ISR中的副本成为leader
2 监控JMX指标: kafka.controller:type=ControllerStats,name=UncleanLeaderElectionsPerSec

集群评估(sizing)

1 broker评估
  • 单broker上的分区数<2000
  • 控制分区大小,不要超过25GB
2 broker数评估:根据retention和流量进行评估
3 集群扩展
  • 磁盘使用率<60%
  • 网络使用率<75%
4 集群监控
  • 确保topic分区分布尽量均匀
  • 确保broker节点不会磁盘、带宽耗尽

broker监控

1 分区数: kafka.server:type=ReplicaManager,name=PartitionCount
2 leader副本数: kafka.server:type=ReplicaManager,name=LeaderCount
3 ISR扩容率/缩容率:kafka.server:type=ReplicaManager,name=IsrExpandsPerSec
4 入站消息/出站消息:Message in rate/Byte in rate/Byte out rate
5 broker网络请求处理平均空闲率: NetworkProcessorAvgIdlePercent
6 请求平均处理空闲率: RequestHandlerAvgIdlePercent

topic评估

1 分区数
  • 至少和最大的消费者组中consumer的数量一致
  • 分区不要太大,小于25GB
  • 要考虑未来业务的扩容
2 使用keyed消息,即指定key
3 为扩展分区确立阈值,即确定当分区大小达到阈值时增加topic分区数

选择分区

1 基于TPS需求大致确定分区数, 即目标TPS/min(Producer TPS, Consumer TPS)
2 更多分区意味着更多的文件句柄、消息处理延时和更多的内存使用

份额控制

1 避免恶意客户端并维护SLA
2 设定字节率阈值限制
3 监控throttle-rate,byte-rate
4 replica.fecth.response.max.bytes: 设置follower副本FETCH请求response大小
5 限制带宽: kafka-reassign-partitions.sh --throttle options...

Kafka producer

1 使用Java版本producer
2 使用kafka-producer-perf-test.sh测试
3 设置好内存、cpu、batch、压缩等参数
  • batch.size: 越大,TPS越大,延时也越大
  • linger.ms: 越大,TPS越大,延时也越大
  • max.in.flight.requests.per.connection: 增加TPS,关乎消息接收顺序
  • compression.type: 设置压缩类型,提升TPS
  • acks: 设置消息持久性级别
4 避免发送大消息(会使用更多内存,降低broker处理)

性能调优

1 如果TPS<网络带宽
  • 增加用户线程
  • 增加batch size
  • 使用多个producer实例
  • 添加分区
2 acks=-1时如何降低延时:增加num.replica.fetchers
3 跨数据中心的传输:增加Socket缓冲区设置,以及TCP缓存设置

监控指标

  • batch-size-avg
  • compression-rate-avg
  • waiting-threads
  • buffer-available-bytes
  • record-queue-time-max
  • record-send-rate
  • records-per-request-avg

Kafka Consumer

1 使用kafka-consumer-perf.test.sh测试
2 TPS问题
  • 分区数不够
  • OS缓存命中太低,分配更多页缓存
  • 处理逻辑过重
3 位移管理: 异步提交+手动提交
4 重要参数
  • fetch.min.bytes、fetch.max.wait.ms
  • max.poll.interval.ms
  • max.poll.records
  • session.timeout.ms

监控

1 consumer lag
2 JMX指标: records-lag-max
3 bin/kafka-consumer-groups.sh
4 如何减少lag
  • 分析consumer,是GC问题还是consumer hang住了
  • 增加consumer instances
  • 增加分区数

无数据丢失配置

1 producer端
  • retries = MAX
  • acks=all
  • max.in.flight.requests.per.connection = 1
  • 关闭producer
 2 broker端
  • replication factor >= 3
  • min.insync.replicas = 2
  • 关闭unclean leader选举
 3 consumer端
  • 关闭auto.offset.commit
  • 消息被处理后提交位移

【译】Kafka最佳实践 / Kafka Best Practices的更多相关文章

  1. Kafka最佳实践

    一.硬件考量 1.1.内存 不建议为kafka分配超过5g的heap,因为会消耗28-30g的文件系统缓存,而是考虑为kafka的读写预留充足的buffer.Buffer大小的快速计算方法是平均磁盘写 ...

  2. window下Kafka最佳实践

    Kafka的介绍和入门请看这里kafka入门:简介.使用场景.设计原理.主要配置及集群搭建(转) 当前文章从实践的角度为大家规避window下使用的坑. 1.要求: java 6+ 2.下载kafka ...

  3. 【iOS10 SpeechRecognition】语音识别 现说现译的最佳实践

    首先想强调一下“语音识别”四个字字面意义上的需求:用户说话然后马上把用户说的话转成文字显示!,这才是开发者真正需要的功能. 做需求之前其实是先谷歌百度一下看有没有造好的轮子直接用,结果真的很呵呵,都是 ...

  4. 【转】优化Web程序的最佳实践

    自动排版有点乱,看着蛋疼,建议下载中文PDF版阅读或阅读英文原文. Yahoo!的Exceptional Performance团队为改善Web性能带来最佳实践.他们为此进行了 一系列的实验.开发了各 ...

  5. 大规模使用 Apache Kafka 的20个最佳实践

    必读 | 大规模使用 Apache Kafka 的20个最佳实践 配图来源:书籍<深入理解Kafka> Apache Kafka是一款流行的分布式数据流平台,它已经广泛地被诸如New Re ...

  6. Apache Kafka: 优化部署的10个最佳实践

    原文作者:Ben Bromhead      译者:江玮 原文地址:https://www.infoq.com/articles/apache-kafka-best-practices-to-opti ...

  7. Kafka在大型应用中的 20 项最佳实践

    原标题:Kafka如何做到1秒处理1500万条消息? Apache Kafka 是一款流行的分布式数据流平台,它已经广泛地被诸如 New Relic(数据智能平台).Uber.Square(移动支付公 ...

  8. Spring Boot 自定义kafka 消费者配置 ContainerFactory最佳实践

    Spring Boot 自定义kafka 消费者配置 ContainerFactory最佳实践 本篇博文主要提供一个在 SpringBoot 中自定义 kafka配置的实践,想象这样一个场景:你的系统 ...

  9. JavaScript初学者应知的24条最佳实践(译)

    原文:24 JavaScript Best Practices for Beginners 译者:youngsterxyf (注:阅读原文的时候没有注意发布日期,觉得不错就翻译了,翻译到JSON.pa ...

随机推荐

  1. 【Python】Python加lxml实现图片解析下载功能

    1.下载网页:OpenHtml.py import urllib.request from urllib.parse import quote class HtmlLoader(object): de ...

  2. android O 蓝牙设备默认名称更改

    安卓系统会首先读取BTM_DEF_LOCAL_NAME的值,如果为空,就使用"ro.product.model"作为蓝牙设备名. system/bt/btif/src/btif_d ...

  3. 切图psd to html页面制作技术学习与总结

    切图流程和注意事项 切图的正确流程做法是: 1 写框架.拿到psd后,先不要做别的,直接在文本编辑器中将网页的框架写出来,不要假设这块将来css要去怎么渲染,完全自然化的标签,不加任何的css. 2 ...

  4. nodejs基础 -- 多进程

    Node.js 多进程 我们都知道 Node.js 是以单线程的模式运行的,但它使用的是事件驱动来处理并发,这样有助于我们在多核 cpu 的系统上创建多个子进程,从而提高性能. 每个子进程总是带有三个 ...

  5. tracert

    TRACERT命令 编辑 Tracert(跟踪路由)是路由跟踪实用程序,用于确定 IP数据包访问目标所采取的路径.Tracert 命令使用用 IP 生存时间 (TTL) 字段和 ICMP 错误消息来确 ...

  6. This kernel requires an x86-64 CPU, but only detected an i686 CPU.

    为了运行一款软件,我也是拼了.彻底的玩了一次,因为A需要B,我去下载B,结果B又需要C,我去下载C,结果……怎一个艰难了得.最关键的是,目前还没有达到目的!!! 先记录下过程,有时间再来一遍,也许我已 ...

  7. 7款效果惊人的HTML5/CSS3应用

    今天是周末,我为大家收集7个比较经典的HTML5/CSS3应用,每一个都提供源代码,效果非常惊人. 1.CSS3/jQuery创意盒子动画菜单 作为前端开发者,各种各样的jQuery菜单见过不少,这款 ...

  8. u3d加载外部视屏

    u3d的外部加载视屏,采用www方式,可以使用gui播放,也可以绑定到gameobject上作为动态材质使用,不过目前只支持.ogg格式,需要转... using UnityEngine;using ...

  9. 设置时间同步(Linux,Solaris)

    经过网上各种搜索,将LINUX平台及solaris平台的时间同步整理如下: 主机情况:应用:2台LINUX服务器 redhat 5.5 内网数据库:2台Solaris服务器 Solaris 10 内网 ...

  10. 避免使用jQuery的html方法来替换标签,而是使用replaceWith方法

    tblCostSplit.html内容: <nobr title="">只想显示里面内容,去掉nobr标签</nobr> <nobr title=&q ...