Kafka部分集群参数设置(下)

◇◆丶佛笑我妖孽 提交于 2019-12-06 12:15:05

Topic级别参数设置:

如果同时设置了topic级别参数和全局broker参数,topic级别参数会覆盖全局broker参数的值,而每个topic都能设置自己的参数值,这就是所谓的topic级别参数。这样做的好处是不同部门的topic根据业务自身需要,设置自己的留存时间。

retention.ms:规定了该topic消息被保存的时长。默认是7天,即该topic只保存最近7天的消息。一旦设置了这个值,它会覆盖掉broker端的全局参数值。

retention.bytes:规定了要为topic预留多大的磁盘空间。和全局参数作用相似,这个值通常在多租户的kafka集群中会有用武之地。当前默认是-1,表示可以无限使用磁盘空间。

max.message.bytes:它决定了kafka broker能够正常接收该消息topic的最大消息大小。

设置topic级别参数方式:

1、创建topic时进行设置

以retention.ms和max.message.bytes举例,可以用以下命令来创建topic

bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --topic transaction --partitions 1 --replication-factor 1 --config retention.ms=15552000000 --config max.message.bytes=5242880

2、修改topic时设置

假设我们现在要发送最大值100MB的消息,可以用以下命令来修改:

bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --topic transaction --partitions 1 --replication-factor 1 --config retention.ms=15552000000 --config max.message.bytes=5242880

个人建议最好始终使用第二种方式来设置。

JVM参数设置:

jvm端设置,堆大小这个参数至关重要。建议将jvm堆大小设置成6GB吧,毕竟kafka broker在与客户端进行交互时会在jvm堆上创建大量的byteBuffer实例,Heap Size不能太小。

jvm端配置的另一个重要参数就是垃圾回收器的设置

使用的是java7,可以根据以下法则选择合适的垃圾回收器:

如果broker所在及其的CPU资源非常充裕,建议使用CMS收集器。启用方法指定

-XX:+UseCurrentMarkSweepGC。

否则,使用吞吐量的收集器,开启方法指定

-XX:+UseParallelGC

使用到的是java8,那么就用默认的G1收集器就好了。在没有任何调优的情况下,G1表现得要比CMS出色,主要体现在更少的FullGC,需要调整的参数更少等,所以使用G1就好了。

可以这样启动Kafka Broker

$> export KAFKA_HEAP_OPTS=--Xms6g  --Xmx6g
$> export KAFKA_JVM_PERFORMANCE_OPTS= -server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:+ExplicitGCInvokesConcurrent -Djava.awt.headless=true
$> bin/kafka-server-start.sh config/server.properties

操作系统参数:

1、文件描述符限制

2、文件系统类型

3、Swappiness

4、提交时间

首先是ulimit -n。文件描述符系统资源并不像我们想象的那样昂贵,不用太担心调大此值会有什么不利的影响。比如ulimit -n 1000000。

文件系统类型的选择,指的是如ext3、ext4或XFS这样的日志型文件系统。XFS性能要强于ext4。

swap的调优。网上很多文章提到设置为0,将swap完全禁止掉以防止kafka进程使用swap空间。建议还是不要设置成0,我们可以设置成一个较小的值,比如1。因为一旦设置成0,当物理内存耗尽时,操作系统会触发OOM killer这个组件,它会随机挑选一个进程然后kill掉,即根本不给用户任何的预警。但如果设置成一个比较小的值,当开始使用swap空间时,你至少能够观测到broker性能开始急剧下降,从而给你进一步调优和诊断问题的时间。

提交时间或者说是Flush落盘时间,向kafka发送数据并不是真要等数据被写入磁盘才会认为成功,而是只要数据被写入的操作系统的页缓存上就可以了,随后操作系统根据LRU算法会定期将页缓存上的“脏”数据落盘到物理磁盘上。这个定期就是由提交时间来确定的,默认是5秒。一般情况下我们会认为这个时间太频繁了,可以适当地增加提交间隔来确定的,默认是5秒。

 

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!