Kafka 安装与基本配置

576 阅读5分钟

Kafka 是使用 Java 开发的应用程序,可以在安装了 Java 环境的多种操作系统上运行。另外 Kafka 使用 ZooKeeper 保存 broker 的元数据。

在配置好 Java 环境和 ZooKeeper 之后,就可以开始下载并安装 Kafka 了。

安装 Kafka Broker

Kafka 官网 可以下载到最新版本的 Kafka,如 kafka_2.11-1.1.0.tgz 。使用命令

$ tar -zxf kafka_2.11-1.1.0.tgz

解压文件,在启动 ZooKeeper 后进入 Kafka 主目录,通过命令启动

$ bin/kafka-server-start.sh config/server.properties

启动 Kafka。

broker 的基本配置

在单机调试时可以使用默认配置,如果要在正式环境下部署 broker 集群,需要对配置进行调整。

broker.id

broker 的标识符,默认为 0,可以设置为任意整数,在整个 Kafka 集群内唯一。

建议设置成与机器名相关的整数。

port

Kafka 监听的端口号,默认为 9092,可以设置成任意可用端口号。

zookeeper.connect

用于存储 broker 元数据的 ZooKeeper 地址,默认为 localhost:2181,可以按照 hostname:port/path 格式进行配置,多个地址用冒号 : 分隔。

推荐配置 path 作为 Kafka 集群的 chroot 环境,如不配置则默认使用 ZooKeeper 根目录。

log.dirs

Kafka 使用磁盘保存消息,log.dirs 指定存放消息的路径,默认为 /tmp/kafka-logs,多个地址使用逗号 , 分隔。

同一个分区的数据会保存到同一个路径下。broker 根据 最少使用 原则,向拥有最少分区的路径下添加分区数据,而不是向拥有最小磁盘空间的路径添加分区数据。

num.recovery.threads.per.data.dir

broker 使用可配置的线程池来完成启动、关闭或崩溃时重启时的操作,对于包含大量分区的服务器,并行操作可能会节省大量时间。需要注意的是,该配置针对单个目录,最终使用的线程数是该配置与目录数的乘积。

auto.create.topics.enable

默认情况下,broker 对不存在的主题进行操作时会自动创建主题,即向不存在的主题写入消息、读取消息或请求主题元数据。如果需要控制主题的创建可以将该配置改为 false。

topic 的基本配置

Kafka 可以通过管理工具对每个主题进行单独的配置,如分区个数、数据保留策略等,broker 提供的默认的配置适用于常规场景,可以作为基准。

num.partitions

该参数指定新创建的主题包含的分区个数,默认为 1。Kafka 通过分区对主题进行横向扩展,当有新的 broker 加入时,可以通过分区来实现集群的负载均衡。

为了使分区能够分布到所有 broker 上,分区个数必须大于 broker 个数。如需要对包含大量消息的主题进行负载均衡,就需要大量的分区。

通常可以用主题吞吐量除以消费者吞吐量估算出需要分区的个数,即如果每秒对主题写入和读取 1 GB 的数据,每个消费者每秒可以处理 50 MB,则至少需要 20 个分区。如果无法确定吞吐量,根据经验,单个分区的数据量应该控制在 25 GB 以内。

log.retention.ms

数据保留的毫秒数。Kafka 默认使用 log.retention.hours 来配置数据保留时间,默认值为 168 小时,即 1 周。推荐使用 log.retention.ms 来配置数据保留时间。

当同时配置多个数据保留时间,会优先使用具有最小值的那个参数。

log.retention.bytes

该配置作用于每一个分区,表示保留的最大数据量。比如该配置为 1 GB 时,一个包含 8 个分区的主题最多可以保留 8 GB 的数据量。

此配置和 log.retention.ms 等数据保留时间的配置,在任意一个条件到达边界时删除旧数据。

log.segment.bytes

Kafka 以日志片段的形式存储数据,前面提到的 log.retention.ms 和 log.retention.bytes 都作用于日志片段而不是单条消息。log.segment.bytes 指定单个日志片段的大小,默认为 1 GB。消息写入到日志片段,到达日志片段上限时关闭该片段,并开启新片段。

日志片段关闭前,片段内的消息是不会过期的。如果片段上限为 1 GB,每天接收 100 MB 消息,数据保留时间为 1 周,则日志片段最多需要 17 天才会被删除。

log.segment.ms

该配置指定日志片段开启后多长时间关闭片段,没有默认值。此配置和 log.segment.bytes 一起使用时,任意一个发生作用时关闭片段并启用新的日志片段。

message.max.bytes

限制单个消息大小,默认为 1000000,即 1 MB。当生产者尝试发送大于此配置的消息时,消息不会被接受,返回错误信息。此配置只压缩后的消息大小,实际大小可以大于配置的值。

broker 集群

使用集群可以跨服务器进行负载均衡,还可以通过复制功能避免单点故障造成的数据丢失,提供高可用性。

broker 个数

判断所需要的 broker 个数首先需要考虑数据量,如果整个集群要保留 10 TB 的数据,单个 broker 可以存储 2 TB,则至少需要 5 个 broker。如果启用数据复制,则至少还需要一倍的空间,即至少需要 10 个 broker。

另外需要考虑考虑集群处理请求的能力,通过增加 broker 可以提高每秒处理请求的上限,也可以解决因磁盘吞吐量低或内存不足等造成的性能问题。

broker 集群配置

要把 broker 加到集群中,只需修改两个配置参数。

一是修改 zookeeper.connect ,所有 broker 需使用相同的 ZooKeeper 地址来保存元数据。

二是修改 broker.id 的值,broker.id 需在集群内唯一,否则将无法启动。

参考

Kafka 官方文档

Kafka 权威指南