乐途乐途
主页
  • 计算机基础

    • TCP/IP
    • Linux
    • HTTP
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C
    • C++
    • Java SE
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • Maven 入门
    • Maven 进阶
    • MyBatis
    • Spring
    • Spring MVC
  • Java

    • Spring Boot
    • Spring Cloud
    • Spring Cloud Alibaba
    • Spring Security
    • Spring AI
    • Spring Batch
    • Kafka
    • Java 设计模式
  • 缓存

    • Redis
  • 搜索引擎

    • Elasticsearch
  • 分布式协调

    • ZooKeeper
联系
阿里云
主页
  • 计算机基础

    • TCP/IP
    • Linux
    • HTTP
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C
    • C++
    • Java SE
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • Maven 入门
    • Maven 进阶
    • MyBatis
    • Spring
    • Spring MVC
  • Java

    • Spring Boot
    • Spring Cloud
    • Spring Cloud Alibaba
    • Spring Security
    • Spring AI
    • Spring Batch
    • Kafka
    • Java 设计模式
  • 缓存

    • Redis
  • 搜索引擎

    • Elasticsearch
  • 分布式协调

    • ZooKeeper
联系
阿里云
  • 学习路径
  • 第1章 消息队列与 Kafka 概述

    • 章节导读
    • 消息队列基础
    • Kafka 概述
    • Kafka 为什么快
  • 第2章 快速上手:单机环境搭建

    • 章节导读
    • 环境准备与安装
    • 快速启动
    • Topic 管理
  • 第3章 核心概念:主题、分区与日志

    • 章节导读
    • Topic
    • Partition
    • Offset
    • Segment 与存储结构
  • 第4章 生产者详解

    • 章节导读
    • Producer 概述
    • Producer 发送机制
    • Producer 分区策略
    • Producer 幂等与事务
    • Producer 配置
  • 第5章 消费者与消费组

    • 章节导读
    • Consumer 概述
    • Consumer Group 消费组
    • Consumer 分区分配策略
    • Consumer Offset 提交
    • Consumer 多线程
    • Consumer 配置
  • 第6章 Broker 与控制器

    • 章节导读
    • Broker 概述
    • Broker 配置
    • Controller
    • KRaft 共识协议
  • 第7章 副本与数据可靠性

    • 章节导读
    • 副本机制
    • ISR 与副本同步
    • Leader 选举
    • ACK 与一致性保证
    • 高水位与 Leader Epoch
  • 第8章 存储与性能优化

    • 章节导读
    • 存储架构
    • 日志清理与压缩
    • Page Cache 与零拷贝
    • Producer 性能优化
    • Consumer 性能优化
    • Broker 性能优化
  • 第9章 生产环境运维与监控

    • 章节导读
    • Topic 管理
    • Kafka 运维工具
    • 监控
    • 常见故障排查
  • 第10章 Kafka生态与面试考点

    • 章节导读
    • Kafka 生态全景
    • 面试高频 30 题

环境准备与安装

定义与作用

在安装 Kafka 之前,需要准备好运行环境。本节涵盖 JDK 版本检查、Kafka 下载与解压、关键配置文件介绍。面向 Linux 环境(Windows 用户建议使用 WSL2)。

核心原理

Kafka 3.x 支持两种模式启动:ZooKeeper 模式(传统)与 KRaft 模式(新,生产就绪)。本教程使用 KRaft 模式,因为它无需额外部署 ZooKeeper,单机搭建更简单,也是 Kafka 未来的默认模式。

KRaft 模式下,Kafka 集群将元数据存储在内部 Topic @metadata 中,通过 Raft 协议在 Controller 节点间达成一致。单机场景下只需要一个节点同时承担 Broker 和 Controller 角色。

完整示例

示例一:环境检查与 Kafka 下载

操作前环境:干净的 Linux 服务器(Ubuntu 22.04)。

步骤:

# 1. 检查 Java 版本(Kafka 3.x 要求 Java 11+)
java -version
# openjdk version "17.0.9" 2023-10-17
# OpenJDK Runtime Environment (build 17.0.9+9-Ubuntu-122.04)
# ✅ 满足要求

# 2. 若未安装 Java 17
# sudo apt update && sudo apt install openjdk-17-jdk -y

# 3. 下载 Kafka(以 3.6.0 为例)
wget https://archive.apache.org/dist/kafka/3.6.0/kafka_2.13-3.6.0.tgz

# 4. 解压到 /opt
sudo tar -xzf kafka_2.13-3.6.0.tgz -C /opt
sudo ln -s /opt/kafka_2.13-3.6.0 /opt/kafka

# 5. 配置环境变量(可选,方便后续使用)
echo 'export KAFKA_HOME=/opt/kafka' >> ~/.bashrc
echo 'export PATH=$PATH:$KAFKA_HOME/bin' >> ~/.bashrc
source ~/.bashrc

操作后环境:

项状态
Java17.0.9
Kafka Home/opt/kafka
核心脚本路径/opt/kafka/bin/
配置路径/opt/kafka/config/

示例二:KRaft 模式初始化

场景:首次安装 Kafka 3.x,使用 KRaft 模式生成集群 ID 并格式化存储目录。

操作前环境:Kafka 已解压但未初始化。

步骤:

cd /opt/kafka

# 1. 生成集群唯一 ID
KAFKA_CLUSTER_ID=$(bin/kafka-storage.sh random-uuid)
echo "Cluster ID: $KAFKA_CLUSTER_ID"
# Cluster ID: a7Bx9YqL3mNk2RvW5tP1eU

# 2. 格式化存储目录(使用 KRaft 配置)
bin/kafka-storage.sh format \
  --cluster-id $KAFKA_CLUSTER_ID \
  --config config/kraft/server.properties
# Formatting /tmp/kraft-combined-logs

# 3. 验证存储目录已生成
ls /tmp/kraft-combined-logs/
# __cluster_metadata-0  bootstrap.checkpoint  meta.properties

操作后对比:

操作前操作后
/tmp/kraft-combined-logs 不存在包含 meta.properties(存 Cluster ID)、__cluster_metadata-0(元数据日志段)

关键配置文件说明

config/kraft/server.properties 关键参数:

# Broker 唯一标识(单机用默认值即可)
node.id=1

# 监听地址(PLAINTEXT 无加密,本地开发用)
listeners=PLAINTEXT://:9092

# 日志存储目录
log.dirs=/tmp/kraft-combined-logs

# Controller 仲裁地址
controller.quorum.voters=1@localhost:9093

# 此节点同时承担 Broker 和 Controller
process.roles=broker,controller
参数说明生产环境注意
node.id节点唯一标识,集群中必须不重复每个节点不同
listenersBroker 监听协议和端口内网用 PLAINTEXT,外网加 SSL
log.dirs消息数据存储路径生产环境用 SSD + 多目录
process.roles节点角色生产环境建议分离 Broker 和 Controller

易错场景

易错 1:Java 版本过低

现象:

Error: A JNI error has occurred, please check your installation
Exception in thread "main" java.lang.UnsupportedClassVersionError

原因:Kafka 3.x 需要 Java 11+,如果机器上有 Java 8,会出现此错误。

解决:安装 Java 11+ 并通过 update-alternatives 切换到正确版本。

易错 2:存储目录权限不足

现象:

ERROR Failed to format storage directory
java.nio.file.AccessDeniedException: /tmp/kraft-combined-logs

解决:确保当前用户对 log.dirs 配置的路径有读写权限。/tmp 通常允许所有用户写入,如用其他路径需检查权限。

面试高频考点

Q:KRaft 模式相比 ZooKeeper 模式有什么优势?

A:

  1. 架构简化 — 不再需要单独部署和运维 ZooKeeper 集群
  2. 元数据一致性更强 — Raft 协议比 ZooKeeper 的 ZAB 协议在元数据管理上更高效
  3. 分区数上限提升 — KRaft 模式下可支持百万级分区(ZooKeeper 模式受限于 ZK 节点数)
  4. 故障恢复更快 — Controller 切换时间从数十秒缩短到数秒
上一页
章节导读
下一页
快速启动