ITPub博客

首页 > 数据库 > 数据库开发技术 > Kafka学习笔记(三)

Kafka学习笔记(三)

原创 数据库开发技术 作者:DBA修行之路 时间:2021-07-22 23:07:02 0 删除 编辑




点击上方“蓝字”,发现更多精彩。





Kafka学习笔记(三)

kafka配置参数概念

生产中,kafka通常使用集群的方式部署,为了能够使集群正常工作或者是提高kafka的性能,需要了解kafka的一些配置参数。可以将参数分为以下类:

1).broker端参数。

2).topic级别参数。

3).JDK配置参数。

4).操作系统参数。


Broker端参数

broker端参数,即服务器端参数,需要在kafka的server.properties文件中进行设置,大部分参数不支持现在修改,新增,修改或删除需要重启对应的broker服务器。下面是一些常见参数:


broker.id:broker的标识,默认为-1,如果不指定会自动生成,一个集群中,broker.id值不能重复。


logs.dirs:kafka持久化消息的目录,多个目录使用逗号分隔。若不设置,默认为/emp/kafka-logs。不建议生产环境使用。


zookeeper.connect:设置zookeeper连接信息,如果使用一套zookeeper集群管理多套kafka集群,则需要在参数结尾指定zookeeper的chroot,用/分割,不指定则默认使用Zookeeper的根路径。


listeners:broker监听器的CSV列表,格式为[协议]://[主机名]:[端口],用于客户端连接broker使用,如果不指定主机名,表示绑定默认网卡,如果主机名为0.0.0.0,表示绑定所有网卡。如果开启安全认证,可以使用SSL或SASL SSL协议,否则使用PLAINTEXT即可。


adertised.listeners:与listeners类似,区别为主要用于IaaS环境。


unclean.leader.election.enable:开启unclear leader选举,自1.0.0版本设置该参数默认值为false,即当leader宕机了而此时ISR又变空了,kafka不允许从剩下的非ISR副本中选择一个当leader。这种策略不会造成数据的丢失。


delet.topic.enable:默认设置为true,即允许用户删除topic及其数据,一方面,能够删除topic为操作带来便利,另一方面,kafka0.9.0.0中新增了ACL权限特性,降低了安全隐患。


log.retention.{hours|minutes|ms}:该参数用来设置消息数据的保留时间,同时设置时会先选择ms,然后minutes,最后hours。该值默认为7,即kafka只会保存最近7天的数据。7天前的会自动删除。可根据业务需求自己修改。


log.retention.bytes:该参数用来设置消息数据的保存数据大小。即设置kafka集群为每个消息日志保存多大的数据。当草果改大小时,自动清理。默认值为-1,即不清理。根据业务需求自己修改。


min.insync.replicas:与producer端的ack参数结合使用,只有当acks=-1时设置才有意义,用来设置broker端成功响应clients消息发送的最少副本数。如果broker端无法满足该条件,则消息发送视为失败。如果要求发送的消息需要写到所有副本,可以设置该参数为-1。


num.network.threads:该参数用来设置broker在后台用于处理网络请求的线程数,默认为3,可通过监控NetworkProcessorAvgIdlePercent JMX指标来评估是否需要调整该值。


num.io.threads:该参数设置broker端实际处理网络请求的线程数,默认为8,可通过监控RequestHandlerAvgIdlePercent指标来评估是否需要调整该值。


message.max.bytes:该参数用来设置broker能偶接收的最大消息大小,默认为977KB,不到1MB,生产上可根据实际设置。





Topic级参数

在kafka中,每个topic可以根据业务需要设置自己的参数,topic级参数可以覆盖broker端参数,类似于之类可以重写父类的方法一样。与broker端大部分参数需要重启才能生效不同,topic级参数可以通过kafka-configs脚本设置在线生效,常见的有:


delete.retention.ms:指定某个topic设置自己的日志留存时间。


max.message.byte:指定某个topic设定自己的最大消息尺寸。


retention.bytes:指定某个topic设置自己的日志大小。


retention.ms:指定某个topic持有单个分区消息的最长时间。


segment.bytes:指定该某个topic日志段文件的大小。 


cleanup.policy:指定某个topic的留存策略,可以是compact,delete或同时指定。


compression.type:指定某个topic自己的消息的压缩类型。


preallocate:指定某个topic是否需要提前分配存储空间。


unclean.leader.election.enable:指定某个topic是否开启unclean领导者选举。






Kafka的JDK设置

kafka运行依赖JVM,因此需要考虑Java方面的因素,建议如下:


1).尽量使用Java8版本的jdk。垃圾回收器选择G1垃圾回收器,如果使用Java7时,当CPU资源充足时,优先使用CMS收集器,反之,使用吞吐量收集器。


2).设置broker端的堆空间不超过6GB,因为kafka使用更多的是堆外内存,即大量使用操作系统的页缓存。因此不需要为JVM分配太大内存。





操作系统参数设置

kafka支持Linux,windows等多平台,但是表现最良好的是Linux,因此建议部署在Linux平台上,针对操作系统级别的参数,可关注一下几点。


文件描述符限制:Kafka本身会频繁创建并修改文件系统中的文件,例如日志文件,索引文件及元数据管理文件等。每个broker上打开的文件数=分区数*(分区总大小/日志段大小)*3左右,生产中建议设置为一个较大的值,例如655350,设置方法为ulimit -n 655350。


Swap空间:建议关闭swap,临时生效命令为sysctl vm.swappiness=值,建议值设定在1-10之间,如果希望永久生效,则在/etc/sysctl.conf中增加vm.swappiness=N,然后重启机器。


设置flush时长:kafka默认刷盘时间是5秒,但是该值太小,导致刷盘的时间间隔较短,可以通过合理设置该值增加物理写入吞吐量。


Socket缓冲区大小设置:kafka自身的Socket缓冲区参数大小默认为64KB,对于普通内网环境而言足够了,但是对于跨区域或远距离的数据传输,建议增大操作系统的Socket缓冲区大小。


禁止atime:在挂载文件系统时设置noatime选项,取消文件atime(最新访问时间)属性的更新,避免了inode访问时间的写入操作,减少了文件系统写操作数,可通过mount -o noatime命令进行设置。


vm.max_map_count参数设置:如果单台tipic数较多,可能会大量消耗操作系统内存,可以调整vm.max_map_count参数,通过如下命令设置:/sbin/sysctl -w vm.max_map_count=值设置,默认为65536,可以考虑调整为更大。


使用XFS文件系统:XFS文件系统相较于Ext4系统,能够更好提升Kafka的写入性能。




为什么不建议设置swap为0?

swap开启会拖慢机器的速度,但是建议调小而不是直接关闭,因为如果存在物理内存耗尽的场景,当设置为较小值时,可以通过swap定位应用并及时处理,而如果关闭后,当发生OOM后,linux的OOM killer将会根据某种规则kill掉一个进程,而这个过程对用户而言不可控,可能会导致数据丢失。


kafka的参数如何设置?

对于kafka中的不同级别的参数,可以根据实际的业务需求,当前服务器资源,数据安全以及性能方面考虑,而不是生搬硬套,需要综合多方面因素并结合实际测试来进行设置。


结尾小结

这两天学习了下kafka中的一些参数设置,从不同的级别进行kafka参数的设置,只有了解了基本的参数及其含义,才能在此基础上学习如何进行优化,当然,纸上得来终觉浅,要想熟练掌握还得不断实践。




END



扫码关注我
每天进步一点点,未来才可期,我们共同的目标是星辰大海。




原文作者:DBA修行之路;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2021-05-25

  • 博文量
    64
  • 访问量
    23946