前面章节中的例子,用来作为单个节点的服务器示例是足够的,但是如果想要把它应用到生产环境,就远远不够了。在Kafka中有很多参数可以控制它的运行和工作。大部分的选项都可以忽略直接使用默认值就好,遇到一些特殊的情况你可以再考虑使用它们。

本文翻译自《Kafka权威指南》

Broker的一般配置

有很多参数在部署集群模式时需要引起重视,这些参数都是broker最基本的配置,很多参数都需要依据集群的broker情况而变化。

broker.id

每个kafka的broker都需要有一个整型的唯一标识,这个标识通过broker.id来设置。默认的情况下,这个数字是0,但是它可以设置成任何值。需要注意的是,需要保证集群中这个id是唯一的。这个值是可以任意填写的,并且可以在必要的时候从broker集群中删除。比较好的做法是使用主机名相关的标识来做为id,比如,你的主机名当中有数字相关的信息,如hosts1.example.com,host2.example.com,那么这个数字就可以用来作为broker.id的值。

port

默认启动kafka时,监听的是TCP的9092端口,端口号可以被任意修改。如果端口号设置为小于1024,那么kafka需要以root身份启动。但是并不推荐以root身份启动。

zookeeper.connect

这个参数指定了Zookeeper所在的地址,它存储了broker的元信息。在前一章节的例子 中,Zookeeper是运行在本机的2181端口上,因此这个值被设置成localhost:2181。这个值可以通过分号设置多个值,每个值的格式都是hostname:port/path,其中每个部分的含义如下:

  • hostname是zookeeper服务器的主机名或者ip地址
  • port是服务器监听连接的端口号
  • /path是kafka在zookeeper上的根目录。如果缺省,会使用根目录。

如果设置了chroot,但是它又不存在,那么broker会在启动的时候直接创建。

PS:为什么使用Chroot路径

一个普遍认同的最佳实践就是kafka集群使用chroot路径,这样zookeeper可以与其他应用共享使用,而不会有任何冲突。指定多个zookeeper服务器的地址也是比较好的做法,这样当zookeeper集群中有节点失败的时候,还可以正常连接其他的节点。

log.dirs

这个参数用于配置Kafka保存数据的位置,Kafka中所有的消息都会存在这个目录下。可以通过逗号来指定多个目录,kafka会根据最少被使用的原则选择目录分配新的parition。注意kafka在分配parition的时候选择的规则不是按照磁盘的空间大小来定的,而是分配的parition的个数多小。

num.recovery.thread.per.data.dir

kafka可以配置一个线程池,线程池的使用场景如下:

  • 当正常启动的时候,开启每个parition的文档块segment
  • 当失败后重启时,检查parition的文档块
  • 当关闭kafka的时候,清除关闭文档块

默认,每个目录只有一个线程。最好是设置多个线程数,这样在服务器启动或者关闭的时候,都可以并行的进行操作。尤其是当非正常停机后,重启时,如果有大量的分区数,那么启动broker将会花费大量的时间。注意,这个参数是针对每个目录的。比如,num.recovery.threads.per.data.dir设置为8,如果有3个log.dirs路径,那么一共会有24个线程。

auto.create.topics.enable

在下面场景中,按照默认的配置,如果还没有创建topic,kafka会在broker上自动创建topic:

  • 当producer向一个topic中写入消息时
  • 当cosumer开始从某个topic中读取数据时
  • 当任何的客户端请求某个topic的信息时

在很多场景下,这都会引发莫名其妙的问题。尤其是没有什么办法判断某个topic是否存在,因为任何请求都会创建该topic。如果你想严格的控制topic的创建,那么可以设置auto.create.topics.enable为false。

默认的主题配置Topic Defaults

kafka集群在创建topic的时候会设置一些默认的配置,这些参数包括分区的个数、消息的容错机制,这些信息都可以通过管理员工具以topic为单位进行配置。kafka为我们提供的默认配置,基本也能满足大多数的应用场景了。

PS:使用per.topic进行参数的覆盖

在之前的版本中,可以通过log.retention.hours.per.topic,log.retention.bytes.per.topic, log.segment.bytes.per.topic等覆盖默认的配置。现在的版本不能这么用了,必须通过管理员工具进行设置。

num.partitions

这个参数用于配置新创建的topic有多少个分区,默认是1个。注意partition的个数只可以被增加,不能被减少。这就意味着如果想要减少主题的分区数,那么就需要重新创建topic。
在第一章中介绍过,kafka通过分区来对topic进行扩展,因此需要使用分区的个数来做负载均衡,如果新增了broker,那么就会引发重新负载分配。这并不意味着所有的主题的分区数都需要大于broker的数量,因为kafka是支持多个主题的,其他的主题会使用其余的broker。需要注意的是,如果消息的吞吐量很高,那么可以通过设置一个比较大的分区数,来分摊压力。

log.retention.ms

这个参数用于配置kafka中消息保存的时间,也可以使用log.retention.hours,默认这个参数是168个小时,即一周。另外,还支持log.retention.minutes和log.retention.ms。这三个参数都会控制删除过期数据的时间,推荐还是使用log.retention.ms。如果多个同时设置,那么会选择最小的那个。

PS:过期时间和最后修改时间

过期时间是通过每个log文件的最后修改时间来定的。在正常的集群操作中,这个时间其实就是log段文件关闭的时间,它代表了最后一条消息进入这个文件的时间。然而,如果通过管理员工具,在brokers之间移动了分区,那么这个时候会被刷新,就不准确了。这就会导致本该过期删除的文件,被继续保留了。

log.retention.bytes

这个参数也是用来配置消息过期的,它会应用到每个分区,比如,你有一个主题,有8个分区,并且设置了log.retention.bytes为1G,那么这个主题总共可以保留8G的数据。注意,所有的过期配置都会应用到patition粒度,而不是主题粒度。这也意味着,如果增加了主题的分区数,那么主题所能保留的数据也就随之增加了。

PS:通过大小和时间配置数据过期

如果设置了log.retention.bytes和log.retention.ms(或者其他过期时间的配置),只要满足一个条件,消息就会被删除。比如,设置log.retention.ms是86400000(一天),并且log.retention.bytes是1000000000(1G),那么只要修改时间大于一天或者数据量大于1G,这部分数据都会被删除。

log.segment.bytes

这个参数用来控制log段文件的大小,而不是消息的大小。在kafka中,所有的消息都会进入broker,然后以追加的方式追加到分区当前最新的segment段文件中。一旦这个段文件到达了log.segment.bytes设置的大小,比如默认的1G,这个段文件就会被关闭,然后创建一个新的。一旦这个文件被关闭,就可以理解成这个文件已经过期了。这个参数设置的越小,那么关闭文件创建文件的操作就会越频繁,这样也会造成大量的磁盘读写的开销。
通过生产者发送过来的消息的情况可以判断这个值的大小。比如,主题每天接收100M的消息,并且log.segment.bytes为默认设置,那么10天后,这个段文件才会被填满。由于段文件在没有关闭的时候,是不能删除的,log.retention.ms又是默认的设置,那么这个消息将会在17天后,才过期删除。因为10天后,段文件才关闭。再过7天,这个文件才算真正过期,才能被清除。

PS:根据时间戳追踪offset

段文件的大小也会影响到消息消费offset的操作,因为读取某一时间的offset时,kafka会寻找关闭时间晚于offset时间的那个段文件。然后返回offset所在的段文件的第一个消息的offset,然后按照偏移值查询目标的消息。因此越小的段文件,通过时间戳消费offset的时候就会越精确。

log.segment.ms

这个参数也可以控制段文件关闭的时间,它定义了经过多长时间段文件会被关闭。跟log.retention.bytes和log.retention.ms类似,log.segment.ms和log.segment.bytes也不是互斥的。kafka会在任何一个条件满足时,关闭段文件。默认情况下,是不会设置Log.segment.ms的,也就意味着只会通过段文件的大小来关闭文件。

PS:基于时间关闭段文件的磁盘性能需求

当时使用基于时间的段文件限制,对磁盘的要求会很高。这是因为,一般情况下如果段文件大小这个条件不满足,会按照时间限制来关闭文件,此时如果分区数很多,主题很多,将会有大量的段文件同时关闭,同时创建。

message.max.bytes

这个参数用于限制生产者消息的大小,默认是1000000,也就是1M。生产者在发送消息给broker的时候,如果出错,会尝试重发;但是如果是因为大小的原因,那生产者是不会重发的。另外,broker上的消息可以进行压缩,这个参数可以使压缩后的大小,这样能多存储很多消息。
需要注意的是,允许发送更大的消息会对性能有很大影响。更大的消息,就意味着broker在处理网络连接的时候需要更长的时间,它也会增加磁盘的写操作压力,影响IO吞吐量。

PS:配合消息大小的设置

消息大小的参数message.max.bytes一般都和消费者的参数fetch.message.max.bytes搭配使用。如果fetch.message.max.bytes小于message.max.bytes,那么当消费者遇到很大的消息时,将会无法消费这些消息。同理,在配置cluster时replica.fetch.max.bytes也是一样的道理。

Kafka权威指南——broker的常用配置的更多相关文章

  1. 《Kafka权威指南》读书笔记-操作系统调优篇

    <Kafka权威指南>读书笔记-操作系统调优篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 大部分Linux发行版默认的内核调优参数配置已经能够满足大多数应用程序的运 ...

  2. 【Kafka】《Kafka权威指南》——分区partition

    在上篇的例子里([Kafka]<Kafka权威指南>--写数据), ProducerRecord 对象包含了目标主题.键和值. Kafka 的消息是 一个个 键值对, ProducerRe ...

  3. Kafka权威指南 读书笔记之(五)深入Kafka

    集中讨论以下3 个有意思的话题 :• Kafka 如何进行复制:• Kafka 如何处理来自生产者和消费者的请求 :• Kafka 的存储细节,比如文件格式和索引. 集群成员关系 Kafka 使用 Z ...

  4. Kafka权威指南 读书笔记之(四)Kafka 消费者一一从 Kafka读取数据

    KafkaConsumer概念 消费者和消费者群组 Kafka 消费者从属于消费者群组.一个群组里的消费者订阅的是同一个主题,每个消费者接收主题一部分分区的消息. 往群组里增加消费者是横向伸缩消费能力 ...

  5. Kafka权威指南 读书笔记之(三)Kafka 生产者一一向 Kafka 写入数据

    不管是把 Kafka 作为消息队列.消息总线还是数据存储平台来使用 ,总是需要有一个可以往 Kafka 写入数据的生产者和一个从 Kafka 读取数据的消费者,或者一个兼具两种角色的应用程序. 开发者 ...

  6. Kafka权威指南 读书笔记之(一)初识Kafka

    发布与订阅消息系统 数据(消息)的发送者(发布者)不会直接把消息发送给接收者,这是发布与订阅消息系统的一个特点.发布者以某种方式对消息进行分类,接收者(订阅者)订阅它们, 以便接收特定类型的消息.发布 ...

  7. kafka读书笔记《kafka权威指南》2018

    1.有了分区,可以多个client消费一个topic,有了分区,可以将一个topic 分散在多个broker 2.kafka通过复制实现可靠,通过横向扩展提高性能(如增加分区.客户端.增加broker ...

  8. 【Kafka】《Kafka权威指南》入门

    发布与订阅消息系统 在正式讨论Apache Kafka (以下简称Kafka)之前,先来了解发布与订阅消息系统的概念, 并认识这个系统的重要性.数据(消息)的发送者(发布者)不会直接把消息发送给接收 ...

  9. 【Kafka】《Kafka权威指南》——写数据

    不管是把 Kafka 作为消息队列.消息.总线还是数据存储平台来使用 ,总是需要有一个可以往 Kafka 写入数据的生产者和一个可以从 Kafka读取数据的消费者,或者一个兼具两种角 色的应用程序. ...

随机推荐

  1. lsb_release 命令找不到

    yum install redhat-lsb -y 参考:http://blog.chinaunix.net/uid-20606164-id-3485376.html

  2. .net core版 文件上传/ 支持批量上传,拖拽以及预览,bootstrap fileinput上传文件

    asp.net mvc请移步 mvc文件上传支持批量上传,拖拽以及预览,文件内容校验 本篇内容主要解决.net core中文件上传的问题  开发环境:ubuntu+vscode 1.导入所需要的包:n ...

  3. web浏览器上传超大文件插件

    如今基于浏览器安装插件的时代已经过时,让人觉得比较low,基于非插件的文件上传大都有限制,给大家推荐一款插件,基于大文件切割原理上传的插件,解决大家的难题! 项目链接http://www.twinkl ...

  4. Android Studio查找功能(搜索功能)及快捷键

    版权声明:本文为博主原创文章,未经博主允许不得转载. 1.在当前窗口查找文本[Ctrl+F] F3                  向下查找关键字出现位置 Shift+F3        向上一个关 ...

  5. Maven项目搭建(三):Maven直接部署项目

    上一章给大家讲解了如何使用Maven搭建SSM框架项目.   这次给大家介绍一下怎么使用Maven直接部署项目.   Maven直接部署项目  1.新建系统变量CATALINA_HOME,值为:Tom ...

  6. Java面试题:Servlet是线程安全的吗?

    Servlet不是线程安全的. 要解释为什么Servlet为什么不是线程安全的,需要了解Servlet容器(即Tomcat)使如何响应HTTP请求的. 当Tomcat接收到Client的HTTP请求时 ...

  7. HTML基础学习(二)—CSS

    一.CSS概述     CSS(Cascading Stytle Sheets)层叠样式表,用来定义网页的显示效果.可以解决HTNL代码对样式定义的重复,提高了后期样式代码的可维护性,并增强了网页的显 ...

  8. JDBC基础学习(二)—PreparedStatement

    一.PreparedStatement介绍     在SQL中包含特殊字符或SQL的关键字(如: ' or 1 or ')时Statement将出现不可预料的结果(出现异常或查询的结果不正确),可用P ...

  9. linux awk 命令详解

    awk是一个非常棒的数字处理工具.相比于sed常常作用于一整行的处理,awk则比较倾向于将一行分为数个"字段"来处理.运行效率高,而且代码简单,对格式化的文本处理能力超强.先来一个 ...

  10. Java与面向对象之随感(2)

    我们知道Java语言的一大特性就是相比于c语言和c++语言,其更加安全.那么Java安全性的一个重要保证就是它取消了指针,并且坚决反对数组的出界(c++对当数组超出上限但是还进行读写操作时允许的!), ...