Broker端参数

日志相关

  • log.dirs:这是非常重要的参数,指定了 Broker 需要使用的若干个文件目录路径。要知道这个参数是没有默认值的,这说明什么?这说明它必须由你亲自指定。
  • log.dir:注意这是 dir,结尾没有 s,说明它只能表示单个路径,它是补充上一个参数用的。

    Broker 连接相关的,即客户端程序或其他 Broker 如何与该 Broker 进行通信的设置。

    有以下三个参数:

  • listeners:学名叫监听器,其实就是告诉外部连接者要通过什么协议访问指定主机名和端口开放的 Kafka 服务。

  • advertised.listeners:和 listeners 相比多了个 advertised。Advertised 的含义表示宣称的、公布的,就是说这组监听器是 Broker 用于对外发布的。
  • host.name/port:列出这两个参数就是想说你把它们忘掉吧,压根不要为它们指定值,毕竟都是过期的参数了。

    Topic管理相关

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

建议生产环境设置为false,不允许自动创建。线上环境很多稀奇古怪的topic,大概就是因为设置成了true

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

建议生产环境设置为false,避免跑得慢的副本中选举出一个当leader

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

建议生产环境设置为false,设置为true,会定期对一些topic分区进行leader重选举。选举换Leader代价很高,原本向A发送请求的所有客户端要切换到B发送。

数据留存相关

  • log.retention.{hours|minutes|ms}:这是个“三兄弟”,都是控制一条消息数据被保存多长时间。从优先级上来说 ms 设置最高、minutes 次之、hours 最低。
  • log.retention.bytes:这是指定 Broker 为消息保存的总磁盘容量大小。
  • message.max.bytes:控制 Broker 能够接收的最大消息大小。

    Topic级别参数

    Topic级别参数会覆盖Broker全局参数

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

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

    1. # 消息不超过5M,保存半年时间
    2. 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时设置

    1. # 修改消息最大不超过10M
    2. bin/kafka-configs.sh --zookeeper localhost:2181 --entity-type topics --entity-name transaction --alter --add-config max.message.bytes=10485760

    JVM参数

    无脑通用建议:JVM堆大小设置成6GB。业界公认的一个合理值

  • KAFKA_HEAP_OPTS:指定堆大小。

  • KAFKA_JVM_PERFORMANCE_OPTS:指定 GC 参数。

比如你可以这样启动 Kafka Broker,即在启动 Kafka Broker 之前,先设置上这两个环境变量:

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