kafka可配置参数有很多,2.2版本中broker就将近200个参数,topic大概25个。
绝大多数采用默认值即可,下面就说下一般不采用默认值的一些配置参数的设置。
broker参数:
log.dirs:信息储存在磁盘哪里,设置多个路径,比如:/home/kafka1,/home/kafka2,/home/kafka3。最好这些dirs是mount到不同物理磁盘上。好处是:提升读写性能、故障转移,防止磁盘坏了导致broker进程关闭,相当于简约RAID方案
zookeeper.connect:zookeeper在kafka中充当分布式协调框架的作用,负责协调管理和保存kafka集群的所有Meta数据,比如集群有哪些broker在运行,有哪些topic,以及每个topic有哪些partition,partition中leader replica在哪些机器上。一套kafka集群它的值为zk1:2181,zk2:2181,zk3:2181.如果有2套kafka集群,设置zk1:2181,zk2:2181,zk3:2181/kafka1、zk1:2181,zk2:2181,zk3:2181/kafka2,kafka1和kafka2是kafka集群的名字。
listeners:监听器,即外部连接者通过协议://主机名:端口号访问开放的kafka服务。这里的主机名最好是主机名,而不是ip地址。listeners一般结合listener.security.protocol.map一起用,即指定哪种安全协议,如controller:plaintext 明文不加密的方式传输数据
另外,关于topic的几个参数最好设置成false,比如
auto.create.topics.enable 不允许自动创建topic,否则topic名乱七八糟的
unclean.leader.election.enable 不允许让落后太多的replica竞选leader,否则可能会发生消息丢失
数据留存参数:
log.retention.hour=168:即保存7天数据
log.retention.bytes=-1:不限制容量
message.max.bytes:默认值还不到1M,可以适当放大。
replica.lag.time.max.ms :follower副本允许落后leader副本的最长时间间隔,默认10秒,ISR副本集合 in-sync-replicas 。 leader副本天然在ISR副本中,满足(10秒)条件的follower副本也在ISR中。
生产上如果有消息丢失的情况,检查下下面这些参数是否设置合理:
1. unclean.leader.election.enable = false
2. replication.factor >=3:将消息多冗余几份
3. min.insync.replicas >= 2,消息至少要被写入2个副本才算是‘已提交’,1个leader副本,至少1个follower副本
4. retries >0 ,producer端参数,防止网络抖动,自动重试消息发送,在网络不稳定的时候可以考虑。acks = all,表示所有副本broker全部接收到消息才算是‘已提交’。另外,producer.send(msg, callback),callback可以知道消息到底发送成功了没有。
5. enable.auto.commit = false, 这是consumer端参数,采用手动提交offset 。特别是当consumer端是多线程处理时,offset提交了,但是线程处理出错了。
顺便说下,标记read-only的参数:重启broker才能生效, 还有一部分是可动态配置的,即无需重启broker即可生效。
标记有:
per-broker:只在对应的broker上生效
cluster-wide:适用整个集群范围
最可能需要用到的动态调整参数有:
log.retention.ms :日志保存时间
num.io.threads, num.network.threads:broker端各种线程池大小
命令 kafka-configs 可动态修改参数
kafka将动态broker参数保存在Zookeeper中 - /config/brokers
Topic参数:
topic参数和broker参数,就好像是局部和全局变量的关系,以topic参数为准。
一般就数据预存参数message.max.bytes,最好根据具体的topic单独设置。
设置topic级别的参数有2种方式:创建topic 时设置,另一个是修改参数
kafka有kafka-topics命令来创建topic,结尾处使用--config设置topic参数;另一个用kafka-configs来修改参数。
JVM参数:
kafka_heap_opts:指定堆大小,默认是1GB,这可能太小了,最好设置大点,社区推荐是6GB。
kafka_jvm_performance_opts:指定GC参数,java8默认是新生代垃圾回收器UseParallelGC,可以调整为G1收集器。
具体做法是先设置这两个环境变量,然后再启动kafka broker。
export kafka_heap_opts=--Xms6g --Xmx6g
export kafka_jvm_performance_opts= -server -XX:UseG1GC
kafka-server-start.sh config/server.properties
操作系统参数:
文件描述符系统:ulimit -n 1000000
文件系统系统:kafka支持XFS,甚至是ZFS,这些文件系统性能比ext4,ext3要好很多。
swappiness :默认是0,即不使用swap空间,当物理内存耗尽时,oom killer会随机kill掉一个进程。建议还是设置成1.
提交时间:默认是5秒,即kafka数据被写到操作系统page cache后,5秒后,操作系统根据LRU算法将cache上的数据真正写入到物理磁盘中。kafka有replica 冗余机制,不用担心cache会丢失,所以设置大一点也没关系。