02kafka集群参数设置
kafka集群参数配置
Broker端参数
Broker配置存储信息的
- log.dirs:指定了Broker需要使用的若干个文件目录路径(无默认值,需要你指定)
- log.dir:指定单个路径,补充dirs的
线上生产环境只要设置log.dirs,并且设置多个路径。具体格式为CSV格式(多个逗号分隔),且最好挂载到不同的物理磁盘,好处是多块磁盘能提升吞吐量;能实现故障转移(kafka1.1后实现)
- listeners:监听器。指定该用哪种协议访问指定主机名和端口开放的Kafka服务。
监听器从构成上来说,它是若干个逗号分隔的三元组,每个三元组的格式为<协议名称,主机名,端口号>。这里的协议名称可能是标准的名字,比如PLAINTEXT表示明文传输、SSL表示使用SSL或TLS加密传输等;也可能是你自己定义的协议名字,比如CONTROLLER: //localhost:9092。假如自定义了协议名称,必须还要指定listener.security.protocol.map参数告诉这个协议底层使用了哪种安全协议,比如指定listener.security.protocol.map=CONTROLLER:PLAINTEXT表示CONTROLLER这个自定义协议底层使用明文不加密传输数据。
此外主机名不要用IP最好全部使用主机名,即Broker端和Client端应用配置中全部填写主机名。 Broker源代码中也使用的是主机名,如果在某些地方使用了IP地址进行连接,可能会发生无法连接的问题。
- auto.create.topics.enable:是否允许自动创建Topic。(最好设置成false,即不允许自动创建Topic)
- unclean.leader.election.enable:是否允许Unclean Leader选举,副本是否有资格竞争Leader(建议设置false但可以酌情考虑)
设置成false,即不让落后太多的副本竞选Leader,没有Leader,分区不可用
设置成true,即可能让落后太多的副本竞选Leader,有Leader,副本数据不全可能造成数据丢失
- auto.leader.rebalance.enable:是否允许定期进行Leader选举。(设置成false)
与上一个不同,它不是选Leader,而是换Leader(可能发生在原Leader正常的情况下)。换Leader代价很大,原本向A发送请求的所有客户端都要切换成向B发送请求,而且这种换Leader本质上没有任何性能收益
- log.retention.{hours|minutes|ms}:这是个“三兄弟”,都是控制一条消息数据被保存多长时间。从优先级上来说ms设置最高、minutes次之、hours最低。
- log.retention.bytes:这是指定Broker为消息保存的总磁盘容量大小。(这个值默认是-1,表明你想在这台Broker上保存多少数据都可以)
- message.max.bytes:控制Broker能够接收的最大消息大小。默认的1000012太少了,还不到1MB(可酌情调大)
Topic级别参数
如果同时设置了Topic级别参数和全局Broker参数,Topic级别参数会覆盖全局Broker参数的值,而每个Topic都能设置自己的参数值,这就是所谓的Topic级别参数。
- retention.ms:规定了该Topic消息被保存的时长。默认是7天,即该Topic只保存最近7天的消息。一旦设置了这个值,它会覆盖掉Broker端的全局参数值。
- retention.bytes:规定了要为该Topic预留多大的磁盘空间。和全局参数作用相似,这个值通常在多租户的Kafka集群中会有用武之地。当前默认值是-1,表示可以无限使用磁盘空间。
JVM参数
Kafka服务器端代码是用Scala语言编写的,但终归还是编译成Class文件在JVM上运行。
- 最好使用Java8及以上,选择G1垃圾回收器
- KAFKA_HEAP_OPTS:指定堆大小
- KAFKA_JVM_PERFORMANCE_OPTS:指定GC参数
操作系统
- 文件描述符限制(ulimit -n)设置大点
- 文件系统类型(最好使用XFS)
- Swappiness(设置成一个比较小的值,至少能够观测到Broker性能开始出现急剧下降,从而给进一步调优和诊断问题的时间)
- 提交时间(默认是5秒)可以适当地增加提交间隔来降低物理磁盘的写操作