最后这一章节总结Kafka中需要特别关注的重要配置以及影响Kafka性能的因素。

重要配置

  • auto.create.topics.enable:该配置项默认值是true,但在生产环境最好设置为false。这样可以控制创建Topic的人以及创建时间。
  • background.threads:该配置项默认值是10,既整个Kafka在执行各种任务时会启动的线程数。如果你的CPU很强劲,那么可以将线程数设大一点。
  • delete.topic.enable:该配置项默认值是false,可以根据实际需求改变,在生产环境还是建议保持默认值,这样至少不会出现Topic被误删的情况。
  • log.flush.interval.messages:该配置项最好保持默认值,把这个任务交给操作系统的文件系统去处理。
  • log.retention.hours:日志文件保留的时间默认是168小时,既7天。这个配置可以根据具体业务需求而定。
  • message.max.bytes:每条Message或一批次Message的大小默认是1MB。这个配置也要根据具体需求而定,比如带宽的情况。
  • min.insync.replicas:该配置项的默认值是1,既在acks=all时,最少得有一个Replica进行确认回执。建议在生产环境配置为2,保证数据的完整性。
  • num.io.threads:处理I/O操作的线程数,默认是8个线程。如果觉得在这个环节达到了瓶颈,那么可以适当调整该参数。
  • num.network.threads:处理网络请求和响应的线程数,默认是3个线程。如果觉得在这个环节达到了瓶颈,那么可以适当调整该参数。
  • num.recovery.threads.per.data.dir:每个数据目录启用几个线程来处理,这里的线程数和数据目录数是乘积关系,并且只在Broker启动或关闭时使用。默认值是1,根据实际情况配置数据目录数,从而判断该配置项应该如何设置。
  • num.replica.fetchers:该配置项影响Replicas同步数据的速度,默认值是1,如果发现Replicas同步延迟较大,可以提升该配置项。
  • offsets.retention.minutes:Offset保留的时间,默认值是1440,既24小时。在生产环境建议将该配置项设大一点,比如设置为1个月,保证消费数据的完整性。
  • unclean.leader.election.enable:该配置项的作用是,指定是否可以将非ISR的Replicas选举为Leader,默认值为false。在生产环境建议保持默认值,防止数据丢失。
  • zookeeper.session.timeout.ms:Zookeeper会话超时时间,默认值为6000。按实际情况而定,通常情况下保持60秒即可。
  • default.replication.factor:默认Replication Factor为1,建议设置为2或者3,以保证数据完整性和整个集群的健壮性。
  • num.partitions:Topic默认的Partition数,默认是1,建议设置为3或者6,以保证数据完整性和整个集群的健壮性。
阅读全文 »

这一节主要介绍Zookeeper和Kafka的UI管理工具。

ZKUI

ZKUI是一款简洁易用的Zookeeper信息管理工具。首先从Github上克隆工程到本地,这是一个Maven工程,然后mvn clean install,在target目录下打出两个jar包zkui-2.0-SNAPSHOT.jarzkui-2.0-SNAPSHOT-jar-with-dependencies.jar,将其上传至你的阿里云ECS。因为我们Zookeeper是集群模式,所以首先需要修改config.cfg中的Zookeeper地址:

#Comma seperated list of all the zookeeper servers
zkServer=zookeeper.server.1:2181,zookeeper.server.2:2181,zookeeper.server.3:2181

然后运行如下命令:

nohup java -jar zkui-2.0-SNAPSHOT-jar-with-dependencies.jar &

阅读全文 »

这一章节来真正启动Kafka集群,先给出一份Broker的配置项列表,将以下信息复制三份,分别配置三台阿里云ECS上的Broker配置文件:

############################# Server Basics #############################
broker.id=0
delete.topic.enable=true
auto.create.topics.enable=true

############################# Socket Server Settings #############################
listeners=EXTERNAL://阿里云ECS内网IP:9092,INTERNAL://阿里云ECS内网IP:9093
listener.security.protocol.map=EXTERNAL:PLAINTEXT,INTERNAL:PLAINTEXT
inter.broker.listener.name=INTERNAL
advertised.listeners=EXTERNAL://阿里云ECS外网IP:9092,INTERNAL://阿里云ECS内网IP:9093
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600

############################# Log Basics #############################
log.dirs=/root/kafka_2.12-2.0.0/data/kafka
num.partitions=1
num.recovery.threads.per.data.dir=1
default.replication.factor=3
min.insync.replicas=2
offsets.topic.replication.factor=2
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1

############################# Log Retention Policy #############################
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
log.segment.ms=604800000

############################# Zookeeper #############################
zookeeper.connect=zookeeper.server.1:2181,zookeeper.server.2:2181,zookeeper.server.3:2181
zookeeper.connection.timeout.ms=6000

############################# Group Coordinator Settings #############################
group.initial.rebalance.delay.ms=0

############################# Message #############################
message.max.bytes=1048576
fetch.message.max.bytes=1048576

阅读全文 »

这一章节主要对和Listener相关的四个配置项做以详细解释。listenersadvertised.listenerslistener.security.protocol.mapinter.broker.listener.name这四个配置项可能是大家最容易混淆和最不容易理解的。

在解释这些配置项之前,我们先来明确几个概念。

  • 部署Broker的阿里云ECS称为Host Machine。
  • 在阿里云ECS里启动的Producer或者Consumer,比如使用Kafka CLI启动的称为Internal Client。
  • 在大家的IDEA中使用Java编写的,或者第三方的Producer/Consumer,称为External Client。
  • Host Machine具有外网IP和内网IP。
  • Internal Client可以同时和Host Machine的外网IP及内网IP通信。
  • External Client只能和Host Machine的外网IP通信。
  • 多个阿里云ECS之间可以同时通过外网IP及内网IP通信。
    • 既在这个特定的场景下,Host Machine之间可以同时通过外网IP及内网IP通信。
    • 再换句话说就是不同Host Machine上的Broker之间可以同时通过外网IP及内网IP通信。
阅读全文 »

接下来几个章节我们开始搭建真正的Kafka集群,服务器还是使用上一节章节搭建Zookeeper使用的三台阿里云ECS。

搭建单机Kafka章节中,在Kafka的/root/kafka_2.12-2.0.0/config/server.properties配置文件中,我们只配置了log.dirsadvertised.listeners这两个配置项,其他配置项都是使用默认值。

Kafka的配置项一共多达140余个,虽然有一部分通常情况下我们不需要修改,使用默认值即可,但这只是一少部分。搭建Kafka集群时,光通常情况下需要考虑的配置项就有40余个。

另外,这些配置项要根据具体的业务场景做各种调整,不存在一套配置项通吃所有业务场景的情况,而且基本不可能一次性配置出性能最优、最能满足业务场景的配置项组合,都需要经过调整、测试,反复进行配置才能总结出相对最优的配置项组合。

阅读全文 »