1.4 服务端参数配置
在 1.2 节的 Kafka 安装与配置的说明中只是简单地表述了几个必要的服务端参数而没有对其进行详细的介绍,并且Kafka服务端参数(broker configs)也并非只有这几个。Kafka服务端还有很多参数配置,涉及使用、调优的各个方面,虽然这些参数在大多数情况下不需要更改,但了解这些参数,以及在特殊应用需求的情况下进行有针对性的调优,可以更好地利用 Kafka为我们工作。下面挑选一些重要的服务端参数来做细致的说明,这些参数都配置在$KAFKA_HOME/config/server.properties文件中。
1.zookeeper.connect
该参数指明broker要连接的ZooKeeper集群的服务地址(包含端口号),没有默认值,且此参数为必填项。可以配置为localhost:2181,如果ZooKeeper集群中有多个节点,则可以用逗号将每个节点隔开,类似于 localhost1:2181,localhost2:2181,localhost3:2181这种格式。最佳的实践方式是再加一个chroot路径,这样既可以明确指明该chroot路径下的节点是为Kafka所用的,也可以实现多个Kafka集群复用一套ZooKeeper集群,这样可以节省更多的硬件资源。包含 chroot 路径的配置类似于 localhost1:2181,localhost2:2181,localhost3:2181/kafka这种,如果不指定chroot,那么默认使用ZooKeeper的根路径。
2.listeners
该参数指明broker监听客户端连接的地址列表,即为客户端要连接broker的入口地址列表,配置格式为 protocol1://hostname1:port1,protocol2://hostname2:port2,其中protocol代表协议类型,Kafka当前支持的协议类型有PLAINTEXT、SSL、SASL_SSL等,如果未开启安全认证,则使用简单的PLAINTEXT即可。hostname代表主机名,port代表服务端口,此参数的默认值为 null。比如此参数配置为 PLAINTEXT://198.162.0.2:9092,如果有多个地址,则中间以逗号隔开。如果不指定主机名,则表示绑定默认网卡,注意有可能会绑定到127.0.0.1,这样无法对外提供服务,所以主机名最好不要为空;如果主机名是0.0.0.0,则表示绑定所有的网卡。与此参数关联的还有advertised.listeners,作用和listeners类似,默认值也为 null。不过 advertised.listeners 主要用于 IaaS(Infrastructure as a Service)环境,比如公有云上的机器通常配备有多块网卡,即包含私网网卡和公网网卡,对于这种情况而言,可以设置advertised.listeners参数绑定公网IP供外部客户端使用,而配置listeners参数来绑定私网IP地址供broker间通信使用。
3.broker.id
该参数用来指定Kafka集群中broker的唯一标识,默认值为-1。如果没有设置,那么Kafka会自动生成一个。这个参数还和meta.properties文件及服务端参数broker.id.generation.enable和reserved.broker.max.id有关,相关深度解析可以参考6.5.1节的内容。
4.log.dir和log.dirs
Kafka 把所有的消息都保存在磁盘上,而这两个参数用来配置 Kafka 日志文件存放的根目录。一般情况下,log.dir 用来配置单个根目录,而 log.dirs 用来配置多个根目录(以逗号分隔),但是Kafka并没有对此做强制性限制,也就是说,log.dir和log.dirs都可以用来配置单个或多个根目录。log.dirs 的优先级比 log.dir 高,但是如果没有配置log.dirs,则会以 log.dir 配置为准。默认情况下只配置了 log.dir 参数,其默认值为/tmp/kafka-logs。
5.message.max.bytes
该参数用来指定broker所能接收消息的最大值,默认值为1000012(B),约等于976.6KB。如果 Producer 发送的消息大于这个参数所设置的值,那么(Producer)就会报出RecordTooLargeException的异常。如果需要修改这个参数,那么还要考虑max.request.size (客户端参数)、max.message.bytes(topic端参数)等参数的影响。为了避免修改此参数而引起级联的影响,建议在修改此参数之前考虑分拆消息的可行性。
还有一些服务端参数在本节没有提及,这些参数同样非常重要,它们需要用单独的章节或者场景来描述,比如 unclean.leader.election.enable、log.segment.bytes 等参数都会在后面的章节中提及。