一、broker常规配置
1、broker.id
broker的唯一标识符。可设置为任意整数,默认值为0。
2、port
broker启动端口。配置样本中为9092。
3、zookeeper.connect
保存broker元数据的Zookeeper地址。
格式:hostname:port/path。
路径/path可选,作为Kafka集群的 chroot 环境。
4、log.dirs
一组逗号分割的本地文件系统路径,即消息保存日志片段在磁盘上存储的目录。
指定了多路径时,broker根据“最少使用”原则,把同一个分区的日志片段保存到同一个路径下。broker会往拥有最少数目分区的路径新增分区,而不是往拥有最小磁盘空间的路径新增分区。
5、num.recovery.threads.per.data.dir
对于如下 3 种情况,Kafka 会使用可配置的线程池来处理日志片段。
5.1、服务器正常启动,用于打开每个分区的日志片段;
5.2、服务器崩溃后重启,用于检查和截短每个分区的日志片段;
5.3、服务器正常关闭,用于关闭日志片段。
默认情况,每个日志目录只使用一个线程。
6、auto.create.topics.enable
默认情况,Kafka在如下情况自动创建主题:
6.1、当一个生产者开始往主题写入消息时;
6.2、当一个消费者开始从主题读取消息时;
6.3、当任意一个客户端向主题发送元数据请求时。
显示创建主题时(手动,通过配置系统),可把
auto.create.topics.enable设为false。
二、主题的默认配置
1、num.partitions
指定了新创建的主题将包含多少个分区。默认值为1。
2、log.retention.ms
决定数据可以保留的时间。
默认使用 log.retention.hours 参数来配置,默认值 168 小时,即为一周。此外还有 log.retention.minutes。这三个参数一样,配置多个,使用最小值的那个参数。推荐使用log.retention.ms。
3、log.retention.bytes
可以保留最多的字节数。以此判断消息是否过期(大于此参数值即过期)。作用与每个分区上。
若同时指定了log.retention.ms,则任一条件满足,消息就会被删除。
4、log.segment.bytes
作用于单个日志片段,非作用于单个消息。
日志片段达到log.segment.bytes指定的上限时,当前片段关闭,新的日志片段被打开。
使用时间戳获取偏移量
日志片段的大小会影响使用时间戳获取偏移量。
在使用时间戳获取日志偏移量时,Kafka 会检查分区时间里最后修改时间大于时间戳的日志片段(已关闭),该日志片段的前一个文件的最后修改时间小于指定时间戳。然后,Kafka返回该日志片段(即文件名)开发的偏移量。
对于使用时间戳获取偏移量的操作来说,日志片段越小,结果越准确。
5、log.segment.ms
控制日志片段多长时间后关闭。与log.setment.ms同时使用时,任一条件满足,皆会关闭当前日志片段,开启新的日志片段。
6、message.max.bytes
限制单个消息的大小(压缩后)。认 1 000 000,即为 1MB。
生产者无法发送超过此参数值大小的消息,broker无法接收且返回错误消息。
在服务端和客户端之间协调消息大小的配置
消费者客户端设置的 fetch.message.max.bytes 需比 message.max.bytes的值大,否则消费者无法读取比较大的消息,进而会导致消费者被阻塞。
在集群中的broker配置的 replica.fetch.max.bytes 参数也遵循同样的原则。
三、操作系统的调优
1、虚拟内存
vm.swppiness:指明虚拟机的子系统将如何使用交换分区,而不是只把内存页从页面缓存里移除。需优先考虑减少页面缓存,而不是进行内存交换。
之前,建议尽量将 vm.swppiness设置为0,意为“除非内存溢出,非则不进行内存交换”。后 Linux内核 3.5-rcl 版本发布,参数发生变化,并被移植到其他的发行版,包括Red Hat 企业内核 2.6.32-303。发生变化后,0意为“在任何情况下都不要进行内存交换”。所以现在建议设置此参数为1。
vm.dirty.background.ratio:系统内存百分比。多数情况设置为 5。
可以将vm.dirty.background.ratioo设为小于10的值,使在后台刷新进程将脏页写如磁盘之前,可以减少脏页的数量。
不可设置为0,斗则会使内核频繁刷新页面缓存,从而降低内核底层设备的硬盘写入提供缓冲的能力。
vm.dirty.ratio:被内核刷新到磁盘之前,脏页内存的百分比。
可设置大于20的值(即系统内存的百分比)。此参数设置范围广,60-80是比较合理的值。
若此参数设置较高的值,建议开启Kafka的复制功能,避免系统崩溃造成数据丢失。
2、网络
sock读写缓冲区参数:net.core.wmen_default,net.core.rmen_default
合理值:131 072,即 128 KB。
sock读写缓冲区最大值参数:net.core.wmem_max,net.core.rmem_max
合理值:2 097 152,即 2 MB。
TCP socket读写缓冲区:net.ipv4.tcp_wmem,net.ipv4.tcp_rmem。
参数的值由 3 个整数组成,空格分隔,分别是最小值、默认值、最大值。最大值不能大于net.core.wmem_max和net.core.rmem_max的大小。
TCP 时间窗扩展:net.ipv4.tcp_window_scaling
设置为 1,则是启用时间窗,可以提升客户端传输效率,传输的数据可在服务器进行缓冲。
tcp socket 并发连接:net.ipv4.tcp_max_syn_backlog,默认值1024。
net.core.netdev_max_backlog:默认值 1000,设置更大的值,有助于应对网络流量的爆发,特别是在使用千兆网络时,允许更多的数据包排队等待内核处理。
3、垃圾回收器
Java7引入的G1垃圾回收器:在应用的整个生命周期,G1会自动根据工作负载情况进行自我调节,而且其停顿时间恒定。G1可轻松处理大块的堆内存,把堆内存分为若干小块的区域,每次停顿时并不会对整个对空间进行回收。
MaxGCPauseMills:每次垃圾回收默认的停顿时间。该值不固定,G1可根据需要使用更长的时间。默认值200ms。即G1会决定垃圾回收的频率以及每一轮需要回收多少个区域,如此计算每轮垃圾回收的时间。
InitiatingHeapOccupancyPercent:G1启动新一轮垃圾回收之前可以使用的堆内存百分比(包括新生代和老年代)。
Kafka 对堆内存使用率非常高,易产生垃圾对象,可将者两个参数值设置小一些,以便更高效及时清除垃圾对象。




