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核心技术与实战
登录|注册

07 | 最最最重要的集群参数配置(上)

胡夕 2019-06-18
你好,我是胡夕。今天我想和你聊聊最最最重要的 Kafka 集群配置。我这里用了 3 个“最”字并非哗众取宠,而是因为有些配置的重要性并未体现在官方文档中,并且从实际表现看,很多参数对系统的影响要比从文档上看更加明显,因此很有必要集中讨论一下。
我希望通过两期内容把这些重要的配置讲清楚。严格来说这些配置并不单单指 Kafka 服务器端的配置,其中既有 Broker 端参数,也有主题(后面我用我们更熟悉的 Topic 表示)级别的参数、JVM 端参数和操作系统级别的参数。
需要你注意的是,这里所说的 Broker 端参数也被称为静态参数(Static Configs)。我会在专栏后面介绍与静态参数相对应的动态参数。所谓静态参数,是指你必须在 Kafka 的配置文件 server.properties 中进行设置的参数,不管你是新增、修改还是删除。同时,你必须重启 Broker 进程才能令它们生效。而主题级别参数的设置则有所不同,Kafka 提供了专门的 kafka-configs 命令来修改它们。至于 JVM 和操作系统级别参数,它们的设置方法比较通用化,我介绍的也都是标准的配置参数,因此,你应该很容易就能够对它们进行设置。
下面我先从 Broker 端参数说起。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Kafka核心技术与实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(63)

  • 草帽路飞
    老师 advertised.listeners 这个配置能否再解释一下。感觉配置了 listeners之后就不用配置这个了呀?

    作者回复: advertised.listeners主要是为外网访问用的。如果clients在内网环境访问Kafka不需要配置这个参数。

    常见的玩法是:你的Kafka Broker机器上配置了双网卡,一块网卡用于内网访问(即我们常说的内网IP);另一个块用于外网访问。那么你可以配置listeners为内网IP,advertised.listeners为外网IP。

    2019-06-18
    4
    34
  • 不了峰
    请教老师
    gg.handler.kafkahandler.Mode = tx
    gg.handler.kafkahandler.Mode = op
    这两个的差别。我们遇到时 dml 数据会丢失的情况。用的是 op 。
    谢谢

    作者回复: 搜了一下,像是Oracle GoldenGate Kafka Adapter的参数。我没有用过,从文档中看这两者的区别是:当设置成op单个数据库表的变更(插入、更新、删除)会被当成一条Kafka消息发送;当设置成tx时,数据库事务所做的所有变更统一被封装进一条Kafka消息,并在事务提交后被发送。

    显然,后者有事务性的保障,至少有原子性方面的保证,不会丢失部分CDC数据。

    2019-06-18
    8
  • QQ怪
    老师帮我们讲讲这个参数吧auto.offset.reset,我有时候删除一个topic时会导致offset异常,出现重复消费问题,不知道跟这个参数有没有关系??

    作者回复: 不太懂“删除topic后还出现重复消费”是什么意思?删完了还要继续消费它吗?

    当consumer启动后它会从Kafka读取它上次消费的位移。情况1: 如果 Kafka broker端没有保存这个位移值,那么consumer会看auto.offset.reset的脸色
    情况2:consumer拿到位移值开始消费,如果后面发现它要读取消息的位移在Kafka中不存在(可能对应的消息已经被删除了),那么它也会看auto.offset.reset的脸色
    情况3:除以上这两种情况之外consumer不会再顾忌auto.offset.reset的值

    怎么看auto.offset.reset的脸色呢?简单说就是earliest从头消息;latest从当前新位移处消费。

    2019-06-18
    7
  • 小头针
    胡老师,我在kafka升级过程中遇到过这样的问题,就是升级后的Kafka与之前的Kafka 的配置完全一样,就是版本不一样了。但是5个Broker后,Kafka Manager工具中,只有1个Broker有数据进入进出。后来同时添加了以下4个参数:
    rebalance.max.retries=4
    auto.leader.rebalance.enable=true
    leader.imbalance.check.interval.seconds=300
    leader.imbalance.per.broker.percentage=10
    再重启Kafka,5个Broker都有数据进入进出,但是我不清楚这到底是哪个参数起到了决定性的作用。其中就有老师讲的auto.leader.rebalance.enable这个参数,但是我这里设置的是true?

    作者回复: 只有一个broker有数据进出,我猜是因为这样的原因:1. 首先你的主题分区副本数是1;2. 在你升级的过程中所有分区的Leader副本都变更到了同一台broker上。

    后面开启了auto.leader.rebalance.enable=true之后它定期将Leader副本分散到不同broker上了。

    2019-06-24
    1
    4
  • 李 P
    和本节无关,消息队列重复消费问题有什么太好的办法吗?我们现在的做法是把offset和消费后的计算结果一并保存在业务系统中,有没有更好的做法

    作者回复: 可以试试Kafka 0.11引入的事务

    2019-06-19
    4
  • 趙衍
    老师好!关于Unclean这个参数,将其设置为false之后,就意味着如果ISR内的所有broker都宕机,那么这个分区就不可用了。
    刚好我前几天看到饶军在2013年的一次报告上讲到Kafka在CAP问题上的取舍,他说,因为Kafka是部署在一个DataCenter中的,而一个DataCenter很少会出现Partitioning的情况,所以Kafka放弃了分区容忍性。
    我想问的是,Kafka舍弃了分区容忍性这一点是否可以体现在社区默认将Unclean设置为false上呢?
    附上报告的地址:https://www.youtube.com/watch?v=XcvHmqmh16g
    关于CAP的取舍出现在21:50左右的地方。谢谢老师!

    作者回复: 首先,CAP理论有很多有歧义的地方,我很好奇为什么国内很多人追捧CAP,其实对于分布式系统而言,很多一致性问题都是CAP覆盖不了的。
    其次,我个人觉得饶大神并不是说Kafka放弃了P,其实Kafka是依托于ZooKeeper以及合理配置minIsr等参数来规避脑裂的。
    第三,我翻看了社区对此提案的讨论,变更为false就是很朴素的思想:用户在默认情况下可能更加关心数据一致性,不想数据丢失。如果用户想要更高的可用性,手动调整即可。你可以看看社区对此问题的讨论:https://www.mail-archive.com/dev@kafka.apache.org/msg63086.html

    2019-06-18
    4
  • kaiux
    👍,相当于把Kafka里面的一些坑预先告诉了我们。
    2019-06-24
    2
  • Geek_edc612
    胡老师您好,我对这两个参数有些疑问:
    (1)auto.leader.rebalance.enable 这个值设置为true,那么您说的定期重新选举,应该有个触发的条件吧?我刚才跟同事沟通过,他说是跟每台broker的leader数量有关,如果leader分布不均衡就会触发重新选举leader,但是感觉说的还是不够具体,您能给解答下吗,感谢
    (2)log.retention.bytes这个参数,您说的对于总磁盘容量来说,那我这样理解您看正确不(极端情况)---这个值我设置为100G,我机器有3个磁盘,每个磁盘大小1T,每个磁盘有不同topic的partition且,如果一个租户恶意写数据到自己的topic,造成某块磁盘的partition大小为100G,那么这台broker是不是所有topic都无法继续写入数据了?劳烦您解答下,感谢

    作者回复: 1. 的确是有个比例,要超过这个比例才会触发preferred leader选举。这个比例由broker端参数leader.imbalance.per.broker.percentage控制,默认是10%。举个例子,如果一个broker上有10个分区,有2个分区的leader不是preferred leader,那么就会触发

    2. 没太明白为什么写到100GB,broker就不能继续写入了?

    2019-06-19
    2
    2
  • mickle
    老师,对于磁盘坏掉以后转移到其他磁盘的机制,我有点疑问,如果已经坏掉,则不可读了,那么是不是只能从副本去转移了,如果从副本转移那就有可能会丢失部分最新的数据吧?

    作者回复: 不会啊,broker会重建副本,然后走正常的同步机制:从leader处拉取数据。

    2019-06-18
    4
    2
  • 大牛凯
    老师好,请问unclean.leader.election.enable设置为false之后,如果leader副本挂掉了那这个分区就无法使用了,是不是意味数据会丢失呢?

    作者回复: leader挂掉了Kafka会从ISR剩下的副本中选择一个当leader,但如果ISR也没有副本了,leader就选不出来了。如果设置unclean.leader.election.enable=true,则允许Kafka从那些不在ISR但依然存活的副本中选择一个出来当leader。此时是有数据丢失的风险的

    2019-09-18
    1
  • Geek_b809ff
    [2019-08-21 20:25:24,619] WARN [Producer clientId=console-producer] Error while fetching metadata with correlation id 57 : {test=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)

    老师,请教一下,这个错误是什么参数配置错了导致的呢?

    作者回复: 如果只是偶尔抛出不用管,通常是因为没有找到对应的主题所致。不是参数配置错导致

    2019-08-21
    1
  • 李跃爱学习
    没有这种 Failover 的话,我们只能依靠 RAID 来提供保障
    — 这个说法我觉得不是很妥当。我们不用RAID应该是具备足够的 replica 吧,和Failover没有必然联系
    2019-07-16
    1
  • henry
    老师,最近别人问我一个问题,假如现有集群已经有3个分区,动态添加两个分区, 原有的分区会迁移数据到新增的分区吗?

    作者回复: 不会。已有数据将一直“躺在”原有分区中。

    2019-06-19
    1
    1
  • Liam
    请问老师,坏掉的数据是怎么自动转移到其他磁盘上的呢?

    作者回复: 可能有点没说清楚。

    1. Broker自动在好的路径上重建副本,然后从leader同步;
    2. Kafka支持工具能够将某个路径上的数据拷贝到其他路径上

    2019-06-19
    1
  • 你看起来很好吃
    '如果设置成 false,那么就坚持之前的原则,坚决不能让那些落后太多的副本竞选 Leader。'想问一下老师,每个partition的副本保存的数据不是应该和leader是一模一样的吗?为什么会有丢失的?

    作者回复: 它们是异步拉取消息的,必然有一个时间窗口导致它和leader中的数据是不一致的,或者说它是落后于leader的。

    2019-06-18
    1
  • 南辕北辙
    刚用的时候大一点的消息就有问题,后来知道是message.max.bytes,不过老师是不是打错单位了,记得是900多KB。今天干货很多

    作者回复: 感谢反馈,sorry,笔误了:(

    2019-06-18
    1
  • Geek_jacky
    老师好,如果磁盘坏掉了,这些数据是什么机制读取到其他磁盘上的呢?不是都坏了吗?不应该读取其他副本中的数据了吗?这个磁盘上的数据就算是丢失了吗?

    作者回复: Broker会在好的目录上重建副本。另外Kafka也提供了工具将某块磁盘上的数据直接搬移到另一个磁盘上,毕竟磁盘坏了也不是不能修好:)

    2019-06-18
    1
  • bunny
    后面会单独讲解producer,consumer相关配置参数吧?还有这个参数delete.topic.enable,胡老师有什么建议么?

    作者回复: 后面讲到producer和consumer会有涉及,但不会专门来讲,毕竟很多人反映单纯讲配置参数太枯燥了,还是结合具体的使用场景来讲比较好。另外建议delete.topic.enable保持默认值true就好,毕竟不能删除topic总显得不太方便。只是要注意权限设置即可,不可能 让任何人都能有删除topic的权限。

    2019-06-18
    1
  • Welliam.Cao

    接我上个问题的错误日志,麻烦帮忙指点一下:
    state-change.log日志出现错误日志
    [2019-11-05 11:08:50,508] ERROR [Controller id=2 epoch=5] Controller 2 epoch 5 failed to change state for partition xxxxx-37 from OnlinePartition to OnlinePartition (state.change.logger)
    [2019-11-05 11:08:50,510] ERROR [Controller id=2 epoch=5] Controller 2 epoch 5 failed to change state for partition xxxxx-7 from OnlinePartition to OnlinePartition (state.change.logger)
    server.log里面刷Shrinking/Expanding日志,没有错误日志
    [2019-11-05 11:08:47,630] INFO [Partition xxxxx-3 broker=2] Shrinking ISR from 2,3,4 to 2,3 (kafka.cluster.Partition)
    [2019-11-05 11:08:52,745] INFO [Partition xxxxx-60 broker=2] Expanding ISR from 2,3 to 2,3,4 (kafka.cluster.Partition)

    作者回复: 从日志上来看可以看一下broker 4的连接状态是否正常,其他问题暂时还无法从日志中看出来

    2019-11-11
  • hunterlodge
    “坚决不能让那些落后太多的副本竞选 Leader”,请问落后多少算是太多呢?谢谢

    作者回复: 这个取决于broker端参数replica.lag.time.max.ms的取值

    2019-11-10
收起评论
63
返回
顶部