Kafka核心技术与实战
胡夕
人人贷计算平台部总监,Apache Kafka Contributor
立即订阅
8408 人已学习
课程目录
已完结 46 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 为什么要学习Kafka?
免费
Kafka入门 (5讲)
01 | 消息引擎系统ABC
02 | 一篇文章带你快速搞定Kafka术语
03 | Kafka只是消息引擎系统吗?
04 | 我应该选择哪种Kafka?
05 | 聊聊Kafka的版本号
Kafka的基本使用 (3讲)
06 | Kafka线上集群部署方案怎么做?
07 | 最最最重要的集群参数配置(上)
08 | 最最最重要的集群参数配置(下)
客户端实践及原理剖析 (14讲)
09 | 生产者消息分区机制原理剖析
10 | 生产者压缩算法面面观
11 | 无消息丢失配置怎么实现?
12 | 客户端都有哪些不常见但是很高级的功能?
13 | Java生产者是如何管理TCP连接的?
14 | 幂等生产者和事务生产者是一回事吗?
15 | 消费者组到底是什么?
16 | 揭开神秘的“位移主题”面纱
17 | 消费者组重平衡能避免吗?
18 | Kafka中位移提交那些事儿
19 | CommitFailedException异常怎么处理?
20 | 多线程开发消费者实例
21 | Java 消费者是如何管理TCP连接的?
22 | 消费者组消费进度监控都怎么实现?
深入Kafka内核 (5讲)
23 | Kafka副本机制详解
24 | 请求是怎么被处理的?
25 | 消费者组重平衡全流程解析
26 | 你一定不能错过的Kafka控制器
27 | 关于高水位和Leader Epoch的讨论
管理与监控 (12讲)
28 | 主题管理知多少?
29 | Kafka动态配置了解下?
30 | 怎么重设消费者组位移?
31 | 常见工具脚本大汇总
32 | KafkaAdminClient:Kafka的运维利器
33 | Kafka认证机制用哪家?
34 | 云环境下的授权该怎么做?
35 | 跨集群备份解决方案MirrorMaker
36 | 你应该怎么监控Kafka?
37 | 主流的Kafka监控框架
38 | 调优Kafka,你做到了吗?
39 | 从0搭建基于Kafka的企业级实时日志流处理平台
高级Kafka应用之流处理 (3讲)
40 | Kafka Streams与其他流处理平台的差异在哪里?
41 | Kafka Streams DSL开发实例
42 | Kafka Streams在金融领域的应用
结束语 (1讲)
结束语 | 以梦为马,莫负韶华!
特别放送 (2讲)
加餐 | 搭建开发环境、阅读源码方法、经典学习资料大揭秘
用户故事 | 黄云:行百里者半九十
Kafka核心技术与实战
登录|注册

08 | 最最最重要的集群参数配置(下)

胡夕 2019-06-20
今天我们继续来聊那些重要的 Kafka 集群配置,下半部分主要是 Topic 级别参数、JVM 参数以及操作系统参数的设置。
在上一期中,我们讨论了 Broker 端参数设置的一些法则,但其实 Kafka 也支持为不同的 Topic 设置不同的参数值。当前最新的 2.2 版本总共提供了大约 25 个 Topic 级别的参数,当然我们也不必全部了解它们的作用,这里我挑出了一些最关键的参数,你一定要把它们掌握清楚。除了 Topic 级别的参数,我今天还会给出一些重要的 JVM 参数和操作系统参数,正确设置这些参数是搭建高性能 Kafka 集群的关键因素。

Topic 级别参数

说起 Topic 级别的参数,你可能会有这样的疑问:如果同时设置了 Topic 级别参数和全局 Broker 参数,到底听谁的呢?哪个说了算呢?答案就是 Topic 级别参数会覆盖全局 Broker 参数的值,而每个 Topic 都能设置自己的参数值,这就是所谓的 Topic 级别参数。
举个例子说明一下,上一期我提到了消息数据的留存时间参数,在实际生产环境中,如果为所有 Topic 的数据都保存相当长的时间,这样做既不高效也无必要。更适当的做法是允许不同部门的 Topic 根据自身业务需要,设置自己的留存时间。如果只能设置全局 Broker 参数,那么势必要提取所有业务留存时间的最大值作为全局参数值,此时设置 Topic 级别参数把它覆盖,就是一个不错的选择。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Kafka核心技术与实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(50)

  • 丰富
    G1是jdk9中默认的,jdk8还是需要显式指定的

    作者回复: 嗯嗯,笔误了。多谢纠正 :)

    2019-06-20
    1
    30
  • aoe
    ulimit -n这个参数说的太好了!如果不设置,单机在Centos7上几百的并发就报“Too many open files”了。网上搜索后设置成65535,用JMater压测单机也只能支撑到1000左右的并发,原来这个值可以设置到1000000!《Kafka权威指南》上说Kafka单机可以轻松处理300万并发;《响应式架构:消息模式Actor实现与Scala、Akka应用集成》上说Scala用Actor单机可以处理5000万并发。请问胡老师有没有推荐的Linux方面的书籍,可以详细解答ulimit -n参数、如何知道单台Linux机器可以处理的连接数上线?
    我在mac笔记本上用Go开启了10万个goroutine,压测服务器,结果得到异常“Too many open files”,后来也修改了ulimit -65535,但也只能保证1万左右的请求正常,请问Mac上也是只要设置ulimit -n参数就可以将请求的连接数提升到上限吗?
    2019-06-20
    18
  • saup007
    修改 Topic 级 max.message.bytes,还要考虑以下两个吧?
    还要修改 Broker的 replica.fetch.max.bytes 保证复制正常
    消费还要修改配置 fetch.message.max.bytes

    作者回复: 是的,您考虑得很全面:)

    2019-06-21
    12
  • 赌神很低调
    胡老师,kafka认为写入成功是指写入页缓存成功还是数据刷到磁盘成功算成功呢?还是上次刷盘宕机失败的问题,页缓存的数据如果刷盘失败,是不是就丢了?这个异常会不会响应给生产者让其重发呢?

    作者回复: 写入到页缓存即认为成功。如果在flush之前机器就宕机了,的确这条数据在broker上就算丢失了。producer端表现如何取决于acks的设定。如果是acks=1而恰恰是leader broker在flush前宕机,那么的确有可能消息就丢失了,而且producer端不会重发——因为它认为是成功了。

    2019-06-24
    5
  • Xiao
    帅气的胡老师,后边是否会将Kafka数据丢失和消息重复的场景以以及解决思路!

    作者回复: 会有的,后面有防止消息丢失和重复消费,到时候一起讨论哈

    2019-06-20
    5
  • Hello world
    老师说的无脑配置给jvm heap 6G大小,这应该也看机器的吧,现在机器的内存也越来越大,我们这的机器都是64G 内存,配了16G的heap,老师觉得可以优化吗

    作者回复: 虽然无脑推荐6GB,但绝不是无脑推荐>6GB。一个16GB的堆Full GC一次要花多长时间啊,所以我觉得6GB可以是一个初始值,你可以实时监控堆上的live data大小,根据这个值调整heap size。只是因为大内存就直接调整到16GB,个人觉得不可取。

    另外堆越小留给页缓存的空间也就越大,这对Kafka是好事啊。

    2019-06-20
    4
  • 老师的美式英语发音真标准
    2019-06-29
    3
  • cricket1981
    kafka streams或者ksql的性能参数调优有什么建议和参考资料吗?

    作者回复: Kafka Streams的性能调优建议:https://www.confluent.io/blog/optimizing-kafka-streams-applications

    KSQL本专栏不会涉及,目前我也给不出相应的建议,因为我。。。。我也不会😳

    2019-06-21
    3
  • AF
    老师Java8默认GC是Parallel GC,Java9默认才是G1

    作者回复: 嗯嗯 ,是的。记错了:( PS: 这是我今天第三次认错:)

    2019-06-20
    3
  • Geek_Sue
    胡老师,您好,文章中提到的JVM版本问题,是否有比较好的建议呢?Java版本对于Kafka的性能方面影响大吗?

    作者回复: Kafka 2.0已经不支持Java 7了,2.1版本开始初步支持Java 11,但不建议生产环境用11,所以还是使用Java 8吧。

    性能方面,如果是Linux平台,性能的差异主要还是Java版本升级带来的差异吧,应该说影响不是太大。

    2019-06-20
    1
    2
  • 吃饭饭
    Java8默认的新生代垃圾回收器是:UseParallelGC,可以用-XX:+PrintCommandLineFlags -version查看,还有如果显示指定 -XX:+UseCurrentMarkSweepGC 的话,会默认开启 -XX:+UseParallelGC

    作者回复: 嗯嗯 ,这点笔误了。Java 9默认的GC收集器才是G1。Java 8应该还是吞吐量收集器。

    2019-06-20
    2
  • 刘朋
    系统会根据LRU算法定期将页缓存上的 脏 数据落盘到物理磁盘上. 这个定期就是由提交时间来确定的,默认是5秒.

    这个时间如何设置? 是内核参数吗?

    作者回复: 不算内核参数,是文件系统的参数。你可以查询一下文件系统手册。比如ext4就是commit=Nseconds这样设置

    2019-06-20
    2
  • 张振宇
    老师,怎么能限制消费者的消费速度,或者限制消费带宽啊,

    作者回复: 这是我之前写的,可以参考下:https://www.cnblogs.com/huxi2b/p/8609453.html

    2019-11-19
    1
  • King Yao
    多个日志段文件?这个没太理解,老师能详细说下吗,谢谢。

    作者回复: 路径下有多个.log文件才有可能删除消息,如果只有一个.log文件是不会开启的,即使满足条件也不行。

    2019-07-05
    1
  • 小头针
    胡老师,在本课程最后留的问题,又成功的引起了我的注意,我曾经因为kafka假死,不知原因为何,而尝试过设置Broker的内存为(32G/256G),然而进程假死更加频繁(后面检测是那个版本存在线程死锁)。后来还是设置为16G了。当然我这真真的是无脑设置。我也看到了评论了胡老师的建议,很值得参考。
    另外,胡老师在这节课里,讲到了页缓存,我想请问一下这个页缓存它存在的意义和作用,以及它在整个过程中的机制又是怎样的呢?

    作者回复: 页缓存属于磁盘缓存(Disk cache)的一种,主要是为了改善系统性能。重复访问磁盘上的磁盘块是常见的操作,把它们保存在内存中可以避免昂贵的磁盘IO操作。

    既然叫页缓存,它是根据页(page)来组织的内存结构。每一页包含了很多磁盘上的块数据。Linux使用Radix树实现页缓存,主要是加速特定页的查找速度。另外一般使用LRU策略来淘汰过期页数据。总之它是一个完全由内核来管理的磁盘缓存,用户应用程序通常是无感知的。

    如果要详细了解page cache,可以参见《Understanding the Linux Kernel》一书的第15章

    2019-06-26
    1
  • 赌神很低调
    “如果在页缓存中的数据在写入到磁盘前机器宕机了,那岂不是数据就丢失了。的确,这种情况数据确实就丢失了,但鉴于 Kafka 在软件层面已经提供了多副本的冗余机制,因此这里稍微拉大提交间隔去换取性能还是一个合理的做法。“即使提供了副本,这种情况数据也会丢吧?还是说这部分数据会重发?

    作者回复: 我的意思是至少还有其他正常的副本可以使用。。。这个副本重启回来后会重新加载日志段,获取到当前末端位移,因此也能感知刚才为成功写入的消息并重新拉取之~~

    2019-06-22
    2
    1
  • 陈华应
    是不是要根据服务器性能来设置呢?比如机器的总内存是多少,单运行kafka的话,再针对性的按比例设置jvm内存大小呢?无脑设置6g也是在一定规格的服务器配置的情况下吧

    作者回复: 有道理。这里给出的6GB一般对那些很多的生产服务器而言的。如果只有8GB的服务器,自然不建议分配这么大的heap size。

    另外监控堆占用也是sizing的一个好办法,特别是监控Full GC之后的live data大小。

    2019-06-20
    1
  • theivanxu
    最近环境中有一台3G堆内存的节点在某个topic handle request的时候一直OOM,调整到5G重启后恢复正常,很想知道如何评判堆内存大小设置的标准。

    作者回复: 没有通用的标准,只有一个最佳实践值:6GB。最好还是监控一下实时的堆大小,特别是GC之后的live data大小,通常将heapsize设置成其1.5~2倍就足以了

    2019-06-20
    1
  • 风中花
    给老师点个赞!按时发布!辛苦
    2019-06-20
    1
  • 小可
    老师好,我这边单机kafka,400个client,出现这个错误
    ulimit 和 file-max都调大了,还是报错

    ERROR Error while accepting connection (kafka.network.Acceptor)
    java.io.IOException: No file descriptors available
    at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
    at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422)
    at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250)
    at kafka.network.Acceptor.accept(SocketServer.scala:460)
    at kafka.network.Acceptor.run(SocketServer.scala:403)
    at java.lang.Thread.run(Thread.java:748)

    作者回复: 最好确认下是否真的修改成功,比如是否是在/etc/security/limits.conf中修改的,这个才是永久生效的配置

    2019-09-27
    1
收起评论
50
返回
顶部