上一篇了解了Kafka的基本概念,主要是日志、主题、分区、生产者、消费者、消费者群组、偏移量、消息和批次以及Broker和集群。这些基本概念了解以后就是上手自己下载Kafka,安装起来。安装Kafka很简单,就是将下载的压缩包解压出来,首先启动zookeeper,然后再启动Kafka服务。启动zookeeper、Kafka的时候都需要指定配置文件,zookeeper不是本系列文章的主要内容,就不多说,使用默认的zookeeper配置就可以。同样Kafka启动使用默认配置也可以,但是为了学习Kafka,还是需要了解配置文件中各项内容的含义以及在服务中起到的作用。
服务启动
服务启动很简单,下载解压不多说。下面直接看命令。
zookeeper启动
- windows系统
zookeeper-server-start.bat ../../config/zookeeper.properties
- Linux系统
zookeeper-server-start.sh ../config/zookeeper.properties
Kafka启动
- windows系统
kafka-server-start.bat ../../config/server.properties
- Linux系统
kafka-server-start.sh ../config/server.properties
配置文件server.properties
从上面的命令就可以看出来Kafka配置文件所在的位置。接下来依次来说一下Kafka配置文件细节。
borker.id
原配置文件中的说明:
# The id of the broker. This must be set to a unique integer for each broker.
broker.id=0
这个是Broker的Id,必须在每个Broker内保证唯一。其实在单机的情况下broker.id
是不用设置的,采用默认即可。如果在集群中,每台机器都需要设置,且要保证唯一。这里说取值是integer
,但是需要注意的是大于等于0的整数。
listeners
原配置文件中的说明:
# The address the socket server listens on. It will get the value returned from
# java.net.InetAddress.getCanonicalHostName() if not configured.
# FORMAT:
# listeners = security_protocol://host_name:port
# EXAMPLE:
# listeners = PLAINTEXT://your.host.name:9092
listeners=PLAINTEXT://:9092
FORMAT
说明了格式,EXAMPLE
给出了示例。在配置文件中listeners=PLAINTEXT://:9092
默认是被注释的。因为在不配置的时候,这个就是对应的默认值。即使多台机器部署成集群,也不需要做修改。但是如果某台服务器上部署了两个Kafka服务的话,就需要对这个配置进行修改,只要修改端口号,保证唯一即可。
log.dirs
原配置文件中的说明:
# A comma seperated list of directories under which to store log files
log.dirs=/tmp/kafka-logs
指定存储log文件的位置,这个log并不是我们平时理解的日志文件,而是请求数据,log地址可以同时配置多个,用逗号隔开。这个参数非常重要。上一篇博客里面写到的分区,就是放在这个日志目录下的。每一个分区都会创建一个目录放在日志目录下。
num.partitions
原配置文件中的说明:
# The default number of log partitions per topic. More partitions allow greater
# parallelism for consumption, but this will also result in more files across
# the brokers.
num.partitions=1
这个用来指定分区的数量的,用在默认创建主题的时候,因为在手动使用命令创建主题的时候是需要指定分区个数的。如果Kafka服务是单机的,毋庸置疑,分区都建在这个服务中的log.dirs
目录下。如果Kafka是集群,每个主题的多个分区会均匀的分配到集群中的每个机器上。
num.recovery.threads.per.data.dir
原配置文件中的说明:
# The number of threads per data directory to be used for log recovery at startup and flushing at shutdown.
# This value is recommended to be increased for installations with data dirs located in RAID array.
num.recovery.threads.per.data.dir=1
Kafka是基于磁盘的服务,但是并不是所有的数据都是放在磁盘中的,生产者数据提交到Kafka,数据会在内存中有一份,在消费者消费的时候优先从内存中读取,这样就需要在Kafka关闭的时候把内存中数据刷入到磁盘中、开启的时候把磁盘中的数据读取到内存中,此参数就是用来指定刷入和读取单个log目录的线程数,如果log.dirs
配置了4个目录,此参数配置了3,那么对应的线程数总量就是3*4=12
个。
log.retention.hours
原配置文件中的说明:
# The minimum age of a log file to be eligible for deletion
log.retention.hours=168
表示Kafka数据在磁盘中保存的时间,超过这个时间就会被清理,默认是7天,需要注意的是这个时间是作用在已经闭合和文件上(什么时候闭合,参考下面的log.segment.bytes
参数说明)。此参数还可以使用分钟和毫秒为单位,对应的参数名分别是:log.retention.minutes
和log.rentention.ms
。
log.retention.bytes
原配置文件中的说明:
# A size-based retention policy for logs. Segments are pruned from the log as long as the remaining
# segments don't drop below log.retention.bytes.
log.retention.bytes=1073741824
表示Kafka删除log数据的文件上限大小,当log文件达到指定的大小,就会被删除。如果这个参数和log.retention.hours
同时配置,以谁先达到条件先执行谁的策略。
log.segment.bytes
原配置文件中的说明:
# The maximum size of a log segment file. When this size is reached a new log segment will be created.
log.segment.bytes=1073741824
分区中单个log文件最大容量,当单个分区内存储log数据的单个文件达到该大小的时候就会闭合,然后重新生成一个log文件用来存储后续的数据。结合上面的log.retention.hours
参数,闭合后这个文件开始被打上计时的标签,当达到指定的保存时间就会被删除。
这里引发一个思考,如果
log.retention.bytes
配置的值比log.segment.bytes
小,这就会导致log文件永远不会出现闭合,因为在闭合之前就会被删掉。又或者说非闭合的log文件即使达到log.retention.bytes
也不会被删除,必须等到其闭合才会执行log.retention.bytes
指定的删除策略。不管是上面的那一种情况,log.retention.hours
即使配置了也是没有作用的。这个后续在学习中测试一下,先打个标记在此!
zookeeper.connect
原配置文件中的说明:
# Zookeeper connection string (see zookeeper docs for details).
# This is a comma separated host:port pairs, each corresponding to a zk
# server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002".
# You can also append an optional chroot string to the urls to specify the
# root directory for all kafka znodes.
zookeeper.connect=localhost:2181
这个没有什么多说的,Kafka是依赖zookeeper的,所有需要在配置文件中指定zookeeper的连接地址,如果zookeeper是集群,需要将多台机器都写上,用逗号隔开即可。
auto.create.topics.enable
这个参数在配置文件中没有体现,但是其是实际存在。用来指定是否允许自动创建主题,缺省值就是true
,如向Kafka中推数据的时候对应topic
没有提前创建,Kafka会自动创建。
message.max.bytes
这个参数在配置文件中也是不存在的。其表示Kafka能够接收处理的单个消息最大字节数,注意这个值producer
和consumer
必须保持一致,且不要大于fetch.message.max.bytes
属性的值,该值默认是1000000字节,大概900KB~1MB。