【Note】《Kafka: The Definitive Guide》 第二章 Installing Kafka:Kafka 安装与运行
《Kafka: The Definitive Guide》 第二章 Installing Kafka:Kafka 安装与运行
本章核心目标是教读者如何在本地搭建 Kafka,包括依赖安装、启动服务、测试运行等操作。
一、Kafka 的依赖与基本结构
1. Kafka 的核心组成
Kafka 并不是一个单独运行的进程,它依赖以下两个核心组件:
组件 | 作用 |
---|---|
ZooKeeper | Kafka 用于存储元数据(如 broker 注册信息、controller 选举) |
Kafka Broker | 接收、存储和发送消息的进程,Kafka 的主要服务单元 |
⚠️ 注意:虽然 Kafka 现在在逐步引入 “KRaft” 模式以替代 ZooKeeper,但在本章及大多数 Kafka 2.x ~ 3.x 的安装中,ZooKeeper 仍是必需的。
2. 所需环境
依赖项 | 说明 |
---|---|
Java JDK 8+ | Kafka 是 Java 编写的,运行依赖 JDK |
Linux/macOS/WSL | 官方推荐在类 Unix 环境运行 Kafka |
Kafka 二进制包 | 可从 https://kafka.apache.org/downloads 获取 |
二、安装与配置 Kafka 步骤(以本地单节点为例)
1. 下载并解压 Kafka
wget https://downloads.apache.org/kafka/3.6.1/kafka_2.13-3.6.1.tgz
tar -xzf kafka_2.13-3.6.1.tgz
cd kafka_2.13-3.6.1
- Kafka 有多个版本(Scala 2.12 / 2.13),需选择与你的 Spark/Flink 环境匹配的版本。
2. 启动 ZooKeeper
bin/zookeeper-server-start.sh config/zookeeper.properties
- 运行前可检查
config/zookeeper.properties
中的dataDir
、端口(默认 2181)。
3. 启动 Kafka Broker
bin/kafka-server-start.sh config/server.properties
-
检查
config/server.properties
中以下配置:broker.id
:每个 Kafka 实例的唯一 ID;log.dirs
:Kafka 存储数据的路径;zookeeper.connect
:ZooKeeper 的连接地址。
✅ 成功启动后,Kafka Broker 会监听默认端口 9092
。
三、Kafka 命令行工具测试(Topic 与消息)
Kafka 提供了多个命令行工具用于管理 Topic 与调试:
创建 Topic
bin/kafka-topics.sh --create --topic test --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
查看 Topic 列表
bin/kafka-topics.sh --list --bootstrap-server localhost:9092
启动一个生产者发送消息
bin/kafka-console-producer.sh --topic test --bootstrap-server localhost:9092
然后输入一些消息回车发送。
启动一个消费者接收消息
bin/kafka-console-consumer.sh --topic test --from-beginning --bootstrap-server localhost:9092
⚠️ 四、使用过程中常见注意事项
⚠️ 1. ZooKeeper 一定要先启动
Kafka 启动时需要连接 ZooKeeper,否则会失败报错 “Connection refused to ZooKeeper”。
⚠️ 2. 确认端口未被占用
-
默认端口:
- Kafka: 9092
- ZooKeeper: 2181
-
如果端口被占用,服务可能启动失败,需要修改配置文件中的端口或释放端口。
⚠️ 3. 修改 server.properties
时注意:
配置项 | 说明 |
---|---|
broker.id | 对于集群环境应唯一(单机可以为 0) |
log.retention.hours | 消息保留时间,默认 168 小时(7 天) |
num.partitions | 默认每个 Topic 分区数,可调 |
⚠️ 4. 多窗口同时使用时注意目录不要混乱
- 推荐在多个终端 tab 中运行 ZooKeeper、Kafka、producer、consumer;
- 如果在 Docker 中部署,注意挂载数据卷、配置外部访问地址(如
advertised.listeners
)。
五、Kafka 的 Web 管理工具(可选)
安装好本地 Kafka 后,你可能想可视化管理:
工具 | 说明 |
---|---|
Kafka UI | 功能强大,支持查看 Topic、消费组等 |
Kafka Tool | GUI 客户端(Windows/macOS) |
AKHQ | 另一个好用的 Web UI,适合生产环境 |
总结:章节关键要点
类别 | 注意事项 |
---|---|
环境 | 确保安装 JDK,使用类 Unix 环境更顺利 |
启动顺序 | 先启动 ZooKeeper,再启动 Kafka |
配置文件 | 熟悉 server.properties 和 zookeeper.properties 结构 |
常用命令 | 掌握 topic 创建、生产消费、查看命令 |
多窗口操作 | 推荐使用 tmux 或多终端 tab 并行操作 |
UI 工具 | Kafka UI 工具可以极大提升管理效率 |
kafka是java专属?其他语言怎么使用啊?
C++ 可以使用 Kafka 服务,主要基于 Kafka 的跨语言通信协议设计和客户端支持机制。
Kafka 通信协议的语言无关性
Kafka Broker 和客户端之间通信基于一个自定义的二进制协议,该协议通过 TCP 套接字传输数据。协议本身是语言无关的,只要客户端能够按协议格式正确地构造请求、解析响应,就能和 Kafka Broker 交互。
- 请求/响应模型:客户端向 Broker 发送请求(如发送消息、拉取消息、管理 Topic 等),Broker 返回响应数据。
- 数据格式:请求和响应采用固定的二进制格式(含长度、API key、版本号等),严格定义在 Kafka 协议规范里。
- 因此,只要用 C++ 实现该协议的编解码,就能实现完整的 Kafka 客户端功能。
Kafka 官方并未直接提供 C++ 客户端,但社区有成熟方案
-
Kafka 官方维护的客户端主要是 Java、Scala。
-
Confluent 和其他社区开发了多种非 Java 语言客户端:
- librdkafka:由 Edenhill 开发的 C/C++ Kafka 客户端库,广泛使用且性能稳定,是 C++ 生态中事实标准。
- 其它语言客户端(Python, Go, C# 等)也都是基于类似原理,按协议实现交互。
C++ 使用 Kafka 的关键要素
Kafka Broker 端协议兼容
- Kafka Broker 端口(默认9092)接收客户端请求,无论请求来自哪个语言实现,只要协议格式正确,Broker 都能识别。
- 协议版本不断迭代,C++ 客户端需要跟上协议版本(比如支持新特性)。
C++ 客户端库(librdkafka)
-
librdkafka 提供:
- Producer、Consumer API;
- 底层网络通信、请求编码/解码;
- 支持多线程安全;
- 支持高性能异步生产和消费;
- 支持高级特性如事务、幂等性。
-
用户只需调用 C++ API,配置 Broker 地址、Topic 等,即可方便操作 Kafka。
异步事件模型
- Kafka 设计支持高吞吐异步通信,librdkafka 通过事件回调、队列机制实现异步非阻塞;
- C++ 开发者可以结合自身业务模型设计异步处理逻辑。
依赖环境
- 需要在系统安装和编译 librdkafka;
- 运行时依赖 OpenSSL(支持加密传输)、zlib(压缩)等库。
简单示意:C++ 调用 Kafka 的流程
+-------------------+
| C++ librdkafka API| -- 构造请求 --> TCP Socket --> Kafka Broker
| | <-- 响应数据 --/
+-------------------+
- 初始化配置(broker 列表、序列化方式、消费者组等);
- 创建 Producer 或 Consumer 实例;
- 生产或消费消息(异步发送或拉取);
- 处理回调事件(成功、失败、消息处理等);
- 关闭客户端,释放资源。
小结
关键要素 | 说明 |
---|---|
协议语言无关 | Kafka 的通信协议与语言无关,任何语言都可实现 |
C++ 客户端库 | 主要是 librdkafka 提供稳定高性能的实现 |
异步高效 | 支持异步事件模型,满足高吞吐要求 |
跨平台兼容 | 适配多操作系统和编译环境 |
丰富特性支持 | 支持事务、幂等性、分区管理等 Kafka 重要特性 |