- 参数优化,修改的都是带默认值的参数
带默认值的参数
全局参数
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.name
和 host.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 参数
创建 topic 时设置
kafka-configs
带上–config
表示带 topic 参数
修改 topic 时设置
kafka-configs.sh
- 推荐
参数
保存数据
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 有冗余策略保障,设置大点吧
- 是文件系统的参数