Kafka 集群参数配置介绍

Broker 端

Broker 端参数也被称为静态参数(Static Configs),必须在 Kafka 的配置文件 server.properties 中进行设置的参数,不管是新增、修改还是删除。同时,你必须重启 Broker 进程才能令它们生效。

存储信息相关参数

  • lod.dirs: 指定了 Broker 需要使用的若干个文件目录路径。

    该参数没有默认值,需要手动指定多个路径,以逗号分隔,例如:/home/kafka1,/home/kafka2,/home/kafka3

    有条件的话,可以使这些目录挂载到不同的物理磁盘上,这样做有两个好处:

    • 提升读写性能:比起单块磁盘,多块物理磁盘同时读写数据有更高的吞吐量。

    • 能够实现故障转移:即 Failover。

      这是 Kafka 1.1 版本新引入的强大功能。要知道在以前,只要 Kafka Broker 使用的任何一块磁盘挂掉了,整个 Broker 进程都会关闭。

      从Kafka 1.1 版本开始,这种情况被修正了,出现坏盘后,Broker进程依然可以为好盘正常提供服务,一旦用户触发了reassign,Kafka支持将坏掉磁盘上的数据自动地转移到其他正常的磁盘上。

ZooKeeper 相关参数

ZooKeeper 是一个分布式协调框架,负责协调管理并保存 Kafka 集群的所有元数据信息,比如集群都有哪些 Broker 在运行、创建了哪些 Topic,每个 Topic 都有多少分区以及这些分区的 Leader 副本都在哪些机器上等信息。

  • zookeeper.connect

    该参数没有默认值,格式:zk1:2181,zk2:2181,zk3:2181

    当多套集群共用一个 ZooKeeper 时,可以使用增加一个 “chroot” 路径,将集群中所有kafka数据存放在特定的路径下,如下格式:

    • zk1:2181,zk2:2181,zk3:2181/kafka1

    • zk1:2181,zk2:2181,zk3:2181/kafka2

  • listeners:告诉外部连接者要通过什么协议访问指定主机名和端口开放的 Kafka 服务。

  • advertised.listeners:这组监听器是 Broker 用于对外发布的。

    一般用于双网卡主机或者 Docker 容器场景下,advertised.listeners配置为外网网卡,listeners配置为内网网卡。

Topic 相关参数

  • auto.create.topics.enable:是否允许自动创建 Topic。

    建议设置成 false,即不允许自动创建 Topic。

  • unclean.leader.election.enable:是否允许 Unclean Leader 选举。

    建议设置成 false,即不能让那些落后太多的副本竞选 Leader。

  • auto.leader.rebalance.enable:是否允许定期进行 Leader 选举。

    建议设置成 false,即不允许 Kafka 定期地对一些 Topic 分区进行 Leader 重选举。

数据存留相关参数

  • log.retention.{hours|minutes|ms}:这是个“三兄弟”,都是控制一条消息数据被保存多长时间。从优先级上来说 ms 设置最高、minutes 次之、hours 最低。

    通常情况下,我们还是设置 hours 级别即可,比如,log.retention.hours=168 表示默认保存 7 天的数据,自动删除 7 天前的数据。

  • log.retention.bytes:这是指定 Broker 为消息保存的总磁盘容量大小。

    一般云上构建多租户场景,需要关注这个参数。

  • message.max.bytes:控制 Broker 能够接收的最大消息大小。

    默认值 1000012 较小,建议设置为一个较大的数值。

Topic 级别参数

如果同时设置了 Topic 级别参数和全局 Broker 参数,Topic 级别参数会覆盖全局 Broker 参数的值,而每个 Topic 都能设置自己的参数值,这就是所谓的 Topic 级别参数。

Topic 级别参数有两种方式可以设置:

  • 创建 Topic 时进行设置

    例如,创建 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
    
  • 修改 Topic 时设置

    例如,修改 Topic:

    bin/kafka-configs.sh --zookeeper localhost:2181 --entity-type topics --entity-name transaction --alter \
    --add-config max.message.bytes=10485760
    

保存消息

  • retention.ms:规定了该 Topic 消息被保存的时长。

    默认是 7 天,即该 Topic 只保存最近 7 天的消息。一旦设置了这个值,它会覆盖掉 Broker 端的全局参数值。

  • retention.bytes:规定了要为该 Topic 预留多大的磁盘空间。

    和全局参数作用相似,这个值通常在多租户的 Kafka 集群中会有用到。当前默认值是 -1,表示可以无限使用磁盘空间。

JVM 参数

  • 堆空间大小

    建议将 JVM 堆大小设置成 6GB ,这是目前业界比较公认的一个合理值。默认的 1GB, 较小。

  • 垃圾回收器

    • Java 7

      • 如果 Broker 所在机器的 CPU 资源非常充裕,建议使用 CMS 收集器。

        开启方法:指定 -XX:+UseCurrentMarkSweepGC 即可。

      • 否则,使用吞吐量收集器。

        开启方法:指定 -XX:+UseParallelGC 即可。

    • Java 8

      直接使用 G1 收集器即可。

具体设置堆空间和垃圾回收期的方法如下,只需要设置下面这两个环境变量即可:

  • KAFKA_HEAP_OPTS:指定堆大小。

  • KAFKA_JVM_PERFORMANCE_OPTS:指定 GC 参数。

例如,可以在启动 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

操作系统参数

文件描述符限制

建议,将其设置为一个较大的值,例如:

ulimit -n 1000000

文件系统类型

这里所说的文件系统指的是如 ext3、ext4 或 XFS 这样的日志型文件系统。根据官网的测试报告,XFS 的性能要强于 ext4,所以,生产环境建议选择 XFS。

Swappiness

Swappiness 的值可以在 0 到 100 之间,0 值指示内核积极避免尽可能使用物理内存。值 100 将积极地将进程的内存移动交换空间。大多数Linux发行版的默认 swappiness 值为 60。

建议设置成一个接近 0 但不为 0 的值,比如 1,例如

  • 临时修改

    sysctl vm.swappiness=1
    
  • 永久修改

    在文件 /etc/sysctl.conf 中添加:

    vm.swappiness=1
    

提交时间

向 Kafka 发送数据并不是真要等数据被写入磁盘才会认为成功,而是只要数据被写入到操作系统的页缓存(Page Cache) 上就可以了,随后,操作系统根据 LRU 算法,会定期将页缓存上的“脏”数据,落盘到物理磁盘上。

这个定期就是由提交时间来确定的,默认是 5 秒。一般情况下我们会认为这个时间太频繁了,可以适当地增加提交间隔来降低物理磁盘的写操作。

配置 flushd 进程把脏页写回到磁盘的是时间间隔,单位是 10ms。

例如,配置为10s,在文件 /etc/sysctl.conf 中编辑:

vm.dirty_writeback_centisecs=1000

当然你可能会有这样的疑问:如果在页缓存中的数据在写入到磁盘前机器宕机了,那岂不是数据就丢失了。

的确,这种情况数据确实就丢失了,但鉴于 Kafka 在软件层面已经提供了多副本的冗余机制,因此这里稍微拉大提交间隔去换取性能,还是一个合理的做法。


参考:

posted @ 2023-07-18 16:35  LARRY1024  阅读(196)  评论(0编辑  收藏  举报