• 参数优化,修改的都是带默认值的参数

带默认值的参数

全局参数

Broker

broker 存储位置

log.dirs: csv 格式参数

  • csv 参数: 比如 /mnt/d1,/mnt/d2
  • 最好各个目录挂载到不同的物理磁盘上
    • 提高读写性能,多块硬盘有更高的吞吐量
    • kafka从 1.1 开始,能够实现故障转移:即 Failover。以前版本,只要 Kafka Broker 使用的任何一块磁盘挂掉了,整个 Broker 进程都会关闭;新版本后,当 broker 坏掉的磁盘上的数据会自动地转移到其他正常的磁盘上,而且 Broker 还能正常运行。

log.dir单个目录设置

Broker 连接 zk

Zookeeper.connect: csv ``格式参数

  • 设置多个 zk 地址(ip:port)
  • 如果需要使用别名,即多套 kafka 集群用一套 zk,在上面的csv 格式中,划分一部分给一个 kafka 集群,只需要在那一组的最后带上 chroot(别名)
    • 比如原来zk1:2181,zk2:2181, zk3:2181, zk4:2181
    • 可以划分为zk1:2181,zk2:2181/kafka1, zk3:2181, zk4:2181/kafk2
    • 表明 kafka1 集群用前两个 zk,kafka2集群用后两个 zk

Broker 客户端通讯

listeners

  • 监听器,指定可以访问 kafka 服务的协议
  • 一般内网使用
    • 比如 client 和 kafka broker 都在内网中

advertised.listeners

  • 向对外(比如注册中心)发布的监听器地址
  • 配置外网 ip
    • 当 client 在外网时,就可以通过注册中心获得 kafka 的 borker 外网地址
  • 如果没有配置,则默认使用 listeners
  • 监听器是由若干个三元组,格式是 <协议名称,主机名,端口号>
    • 协议名称可能是标准的名字,比如 PLAINTEXT 表示明文传输、SSL 表示使用 SSL 或 TLS 加密传输等
    • 协议名称可能是你自己定义的协议名字,其实就是给别名
      • 自定义协议吗,需要设置 listener.security.protocol.map 进行 别名映射

host.namehost.port

  • 两个不要设置

Topic

auto.create.topics.enable

  • 是否允许自动创建Topic。
  • 建议 false,避免莫名其妙的 topic 出现

unclean.leader.election.enable

  • 是否允许 Unclean Leader 选举,即是否允许不处于 ISR 的 follower rep 竞选 leader
  • 如果 leader rep 没了,会让有数据最多的,尽量不会落后的 follower rep 竞选 leader;但是如果符合条件的 follower rep没有时,会触发该判断
  • 不处于 ISR 的 follower rep 竞选 leader,有可能会丢数据
  • 建议 false

**
auto.leader.rebalance.enable

  • 是否允许定期对一些 topic 分区进行 Leader 重新选举
  • 建议 false ,换 leader 成本很大,所有 client 都需要切换 leader 位置

数据留存

log.retention.{hour|minutes|ms}

  • 三条控制语句,规定一套数据被保存多长时间
  • 优先级从 ms -> minutes -> hour
  • 建议用 hours

log.retention.bytes

  • broker 为消息保存的总磁盘大小,记得那条影响参数 (新增消息数, 消息留存时间,平均消息大小, 备份数量, 是否启用压缩)
  • 默认 -1

满足上述一个要求(包括后面 topic 的那两个),就会开始清理 Log Segments

message.max.bytes

  • 控制 broker 最大接收消息大小
  • 默认 1000012.不到 1mb
  • 建议调大

Topic 参数

如何使能 topic 参数

  1. 创建 topic 时设置

    • kafka-configs 带上 –config 表示带 topic 参数
  2. 修改 topic 时设置

    • kafka-configs.sh
    • 推荐

**

参数

局部 topic 参数会覆盖全局 topic 参数

保存数据

retention.ms:

  • 该 topic 消息被保存的时长
  • Default 7days

retention.bytes

  • 该 topic 要预留多大的磁盘空间
  • Default -1

满足上述一个要求(包括全局的那两个),就会开始清理 Log Segments

处理数据

max.message.bytes

  • 接收该 topic 的最大消息大小

jvm 参数

如何使能 jvm 参数

设置环境变量即可

  • KAFKA_HEAP_OPTS:指定堆大小。
  • KAFKA_JVM_PERFORMANCE_OPTS:指定 GC 参数。

    KAFKA_HEAP_OPTS=—Xms6g —Xmx6g KAFKA_JVM_PERFORMANCE_OPTS= -server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:+ExplicitGCInvokesConcurrent -Djava.awt.headless=true

参数

堆大小

  • Heap, 6G

垃圾回收器

  • 多核用 cms, 单核只能 parallel
  • Jdk 8 或者直接 g1

Os 参数

文件描述符限制

ulimit -n

可以设置得超大,避免 Too many open files

文件系统类型

  • 根据官网的测试报告,XFS 的性能要强于 ext4,所以生产环境最好还是使用 XFS
  • 有个 Kafka 使用 使用 ZFS 的数据报告,貌似性能更加强劲,有条件的话不妨一试

Swappiness

  • 不要设置为 0
    • 因为一旦设置成 0,当物理内存耗尽时,操作系统会触发 OOM killer 这个组件,它会随机挑选一个进程然后 kill 掉,即根本不给用户任何的预警。
  • 如果设置成一个比较小的值,当开始使用 swap 空间时,至少能够观测到 Broker 性能开始出现急剧下降,从而给进一步调优和诊断问题的时间
  • 基于这个考虑,建议将 swappniess 配置成一个接近 0 但不为 0 的值,比如 1

提交时间

  • Flush 落盘时间
    • 写请求会先进入 os 的 page cache,再一定时间后 flush 到磁盘
  • 默认 5s,太频繁,kafka 有冗余策略保障,设置大点吧
  • 是文件系统的参数