目录
broker配置
一个独立的 Kafka 服务器被称为broker。它接收来自生产者的消息,为消息设置偏移量,并提交消息到磁盘保存。broker 为消费者提供服务,对读取分区的请求作出响应,返回已经提交到磁盘上的消息。
配置项 | 说明 |
broker.id | 每个broker 都需要有个标识符,使用 broker.id 来表示。它的默认值是0,也可以被设成其任意整数。这个值在整个kafka集群里必须是唯一的。这个值可以任意选定,如果出于维护的需要,可以在服务器节点间交换使用这些ID 。建议把它们设置成与机器名具相关性的整数,这样在进行维护时,将 ID 号映射到机器名就没那么麻烦了。例如,如果机器名包含唯一性的数字(比如 hostl.example.com、host2.example.com ),那么用这些数来设置 broker.id 就再好不过了。 |
port | kafka默认会监听 9092 端口。修改 port 配置参数可以把它设成其他任意可用的端口。注意,如果使用1024 以下的端口,需要使用 root 权限启动Kafka ,不过不建议这么做。 |
zookeeper.connect |
用于保存 b
roker
元数据的
Zoo
ke
地址是通过
zookeepe
.connect
来指定的。
localhost:2181
表示这个
Zooke
是运行在本地的 21
81
端口上
。该
配置参数是用
冒号分
隔的
hostnal'le:por
t/path
列表,每
部分的含义如下:
|
lo
g
.
dirs
|
Kafka
把所有消息都保存在磁盘上,存放这些日志片段的目录是通过 l
og.d
irs 指定的。它是一
组用逗号分隔的本地文件系统路径。如果指定了多个路径,那么 b
roke 会根据“最少使
用”原则,把同一
个分区的日志片段保存到同一个路径下。注意,
broker 会往拥有最少数目分区的路径新增分区,而不是往拥有最小磁盘空间的路径新增分区。
|
nu
m.recovery .
threads.per.
data.dir
|
对于
如下三
种情况,
Kafka
会使用可配置的线程池来处理日志片段:
默认情况下
,每个日志目录只使用一个线程。因为这些线程只是在服务器启动和关闭时会
用到
,所以完全可以设置大量的线程来达到井行操作的目的。特别是对于包含大量分区的
服务器来说,一
旦发生崩愤,在进行恢复时
使用并行操作可能会省下数
小时的时
间。设置
此参数时需要注意,所配置的数字对应的是 log. dir 指定的单个日志目录。也就是说,如果num.recovery. threads.per.data.dir 被设为8,并且 log.dir 指定了3个路径,那么总共需 24 个线程。
|
a
uto
.
c
r
ea
t
e
.
topics
.
enable
|
默认
情况下,
Kafka
会在如下几种情形下自动创
建主题:
当一
个生产者开始往主题写入消息时;
当一
个消费者开始从主题读取消息时;
当
任意一个客
户端向主题发送元数据请求时;
根据 kafka
协
议,如果一个主题不先被创建,
根本无法知道它是否已经存在。如果显式地创
建主题,
不管是手动创
建还是通过其 配置
系统来
创建,都可以把
auto.create.topi..cs
enable
设为
false。
|
如何选定Broker数量:一个Kafka 集群需要多少个 broker 决于以下几个因素:
首先,需要多少磁盘空间来保留数据,以及单个 broker 有多少空间可用。如果整个集群需要保留 10TB 的数据, 每个 broker 可以存储 2TB ,那么至少需要5个 broker 。如果启用了数据复制,那么至少还需要一倍的空间,不过这要取决于配置的复制系数是多少。 也就是说,如果启用了数据复制,那么这个集群至少需要 10 broker。
其次,要考虑的因素是集群处理请求的能力。这通常与网络接口处理客户端流量的能力有关,特别是当有多个消费者存在或者在数据保留期间流量发生波动(比如高峰时段的流量爆发)时。如果单个 broker 的网络接口在高峰时段可以达到80%的使用量,并且有两个消费者,那么消费者就无法保持峰值,除非有两个 broker 。如果集群启用了复制功能,则要把这个额外的消费者考虑在内。因磁盘吞吐量低和系统内存不足造成的性能问题,也可以通过扩展多个 broker 来解决。
Topic配置
配置项 | 说明 |
num.par
itions
|
num.par
itions
参数指定了新创建的主题将包含多少个分区。如果启用了主题自动创建功能(该功能默认是启用的),主题分区的个数就是该参数指定的值
。该参数
的默认值是1。要注意,我们可以增加主题分区的个数,但不能减少分区的个数。所以,如果耍让一
个主
题的分区个数少于
num.par
itions 指定的值,需要手动创建该主题。
|
log.retention.ms
|
Kafka
通常根据时间来决定数据可以被保留多久。默认使用
log. r
etentlon.hour
参数来配
置时间
,默认值为
168
小时,也就是
一周。除
此以外,还有其他两个参数 log.retention.minutes和log.retention.ms。这3个参数的作用是一样的,都是决定消息多久以后会被删
除,不过还是推荐使用
log.retention.ms。如果指定了不止一
个参数, Kafka 会优先使用
具有最小值的那个参数。
|
log.r
etention
.
bytes
|
另一种方式是通过保留的消息字节数来判断消息是否过期。它的值通过参数 log.retention.bytes 来指定,作用在每一个分区上。也就是说,如果有一个包含8个分区的主题,并且 log.retention.bytes 被设为 1GB ,那么这个主题最多可以保留 8GB 的数据。所以,当主题的分区个数增加时,整个主题可以保留的数据也随之增加。如果同时指定了 log.retention.bytes 和 log.retention.bytes (或者另一个时间参数),只要任意一个条件得到满足,消息就会被删除。 |
log.segment.bytes
|
以上的设置都作用在日志片段上,而不是作用在单个消息上。当消息到达 broker 时,它们被追加到分区的当前日志片段上。当日志片段大小达到 log.segment.bytes 定的上限(默认是 1GB )时,当前日志片段就会被关闭,一个新的日志片段被打开。如果一个日志片段被关闭,就开始等待过期。这个参数的值越小,就会越频繁地关闭和分配新文件,从而降低磁盘入的整体效率。
如果主题的消息量不大,那么
如何调整这个参数的大小就变得尤为重要。例如,如果一个
主题
每天只接收
100MB 的消息,而
log.segment.bytes
使用默认设置,那么需要 10 天时
间才能填满
个日志片段。因为在日志片段被关闭之前消息是不
会过期的,所以如果
log.r
etention.ms
被设为
604
800000 (
一
周),那么日志片段最多需要
17
天才会过期。
这是因为关闭日志片段需要
10
天的时间,而根据配置的过期时间,还需要再保留7
天时
间(要等到日志片段里的最后一
个消息过期才能被删除)
|
log.segment.ms
|
另一个可以控制日志片段关闭时间的参数是 log.segment.ms,它指定了多长时间之后日志片段会被关闭。就像 log.retention.bytes 和 log.retention.ms 这两个参数一 |