Kafka从入门到精通

基于 KRaft 模式(Kafka 3.x 及以上版本,去 ZooKeeper)的集群搭建方案。
KRaft 是 Kafka 自 3.3.1 版本起生产可用的新模式,它通过内置的 Raft 共识协议替代了外部 ZooKeeper,让集群部署和运维变得更简单。

对于3节点集群,官方推荐配置是 3 个节点同时承担 Broker 和 Controller 角色(即 Combined 模式)。这个方案资源利用率高,部署也相对简单。

一、准备3节点虚拟机环境

1.1准备jdk环境

[root@localhost kafka]# java -version
openjdk version "17.0.19" 2026-04-21
OpenJDK Runtime Environment Temurin-17.0.19+10 (build 17.0.19+10)
OpenJDK 64-Bit Server VM Temurin-17.0.19+10 (build 17.0.19+10, mixed mode, sharing)

1.2主机名与解析

[root@localhost kafka]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.132 kafka1
10.0.0.133 kafka2
10.0.0.134 kafka3

二、部署3节点Kafka集群

2.1下载kafka安装包并解压

/opt/kafka

wget https://archive.apache.org/dist/kafka/3.9.0/kafka_2.12-3.9.0.tgz

在这里插入图片描述

2.2修改配置文件

node.id 和 advertised.listeners 在每台机器上必须是唯一的。对于 kafka2,node.id=2, advertised.listeners=PLAINTEXT://kafka2:9092;对于 kafka3 同理。
第一台

[root@localhost kafka]# cat config/kafka.properties 
properties
# 唯一标识,每台机器不同
node.id=1

# 角色:同时作为 Broker 和 Controller
process.roles=broker,controller

# 监听器配置
# PLAINTEXT://:9092 用于客户端通信
# CONTROLLER://:9093 用于内部 Raft 共识
listeners=PLAINTEXT://:9092,CONTROLLER://:9093

# 广播地址,必须配置为客户端和集群内其他节点能访问的地址
advertised.listeners=PLAINTEXT://kafka1:9092

# 控制器监听器名称,必须与 listeners 中的对应
controller.listener.names=CONTROLLER

# 安全协议映射
listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT

# 集群控制器列表,格式为 node.id@主机名:端口
controller.quorum.voters=1@kafka1:9093,2@kafka2:9093,3@kafka3:9093

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

# 为集群设置默认副本因子,非常重要!
default.replication.factor=3
min.insync.replicas=2

第二台

[root@localhost kafka]# cat config/kafka.properties 
properties
# 唯一标识,每台机器不同
node.id=2

# 角色:同时作为 Broker 和 Controller
process.roles=broker,controller

# 监听器配置
# PLAINTEXT://:9092 用于客户端通信
# CONTROLLER://:9093 用于内部 Raft 共识
listeners=PLAINTEXT://:9092,CONTROLLER://:9093

# 广播地址,必须配置为客户端和集群内其他节点能访问的地址
advertised.listeners=PLAINTEXT://kafka2:9092

# 控制器监听器名称,必须与 listeners 中的对应
controller.listener.names=CONTROLLER

# 安全协议映射
listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT

# 集群控制器列表,格式为 node.id@主机名:端口
controller.quorum.voters=1@kafka1:9093,2@kafka2:9093,3@kafka3:9093

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

# 为集群设置默认副本因子,非常重要!
default.replication.factor=3
min.insync.replicas=2

第三台

[root@localhost kafka]# cat config/kafka.properties 
properties
# 唯一标识,每台机器不同
node.id=3

# 角色:同时作为 Broker 和 Controller
process.roles=broker,controller

# 监听器配置
# PLAINTEXT://:9092 用于客户端通信
# CONTROLLER://:9093 用于内部 Raft 共识
listeners=PLAINTEXT://:9092,CONTROLLER://:9093

# 广播地址,必须配置为客户端和集群内其他节点能访问的地址
advertised.listeners=PLAINTEXT://kafka3:9092

# 控制器监听器名称,必须与 listeners 中的对应
controller.listener.names=CONTROLLER

# 安全协议映射
listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT

# 集群控制器列表,格式为 node.id@主机名:端口
controller.quorum.voters=1@kafka1:9093,2@kafka2:9093,3@kafka3:9093

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

# 为集群设置默认副本因子,非常重要!
default.replication.factor=3
min.insync.replicas=2

2.3启动集群

生成集群 ID:在任意一台机器上执行此命令,并记录输出的 UUID。

bash
bin/kafka-storage.sh random-uuid
  • 示例输出: ABC123-DEF456-GHI789
    格式化存储目录:在所有三台机器上分别执行以下命令,使用上一步生成的统一集群 ID。
bash
bin/kafka-storage.sh format --cluster-id <你生成的集群ID> --config config/kafka.properties

注意:此命令会清除 log.dirs 目录下的所有数据,仅在初次部署或重建集群时执行。

启动 Kafka 服务:在所有三台机器上分别执行,启动 Broker。

bash
bin/kafka-server-start.sh -daemon config/kafka.properties

2.4 验证集群

检查控制器状态:在任意节点执行以下命令,确认控制器选举正常。

bash
bin/kafka-metadata-quorum.sh --bootstrap-server kafka1:9092 describe --status

创建测试主题:创建一个副本因子为3的主题,验证集群的高可用功能。

bash
bin/kafka-topics.sh --create --topic test-ha --bootstrap-server kafka1:9092 --partitions 3 --replication-factor 3

查看主题详情:确认分区 Leader 和副本分布在不同 Broker 上。

bash
bin/kafka-topics.sh --describe --topic test-ha --bootstrap-server kafka1:9092

模拟故障测试:停止其中一个 Broker 的进程(如 kafka2),然后尝试向 test-ha 主题生产和消费消息,验证服务的连续性。

💡 关键配置与运维要点
min.insync.replicas=2:配合 replication-factor=3,这条配置保证了在至少2个副本同步成功后才算写入完成,是数据不丢失的关键。

生产者 acks=all:生产端配置 acks=all 或 acks=-1,与 Broker 端的 min.insync.replicas 配合,实现最强数据可靠性。

监控是关键:生产环境务必监控 UnderReplicatedPartitions(未充分复制的分区数)和 ISR(同步副本集)的收缩情况,这直接反映了集群的健康度。

三、集群生产和消费验证

3.1生产数据

方式一:控制台生产者(交互式)
在任意一个节点上执行:

bash
bin/kafka-console-producer.sh --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092 --topic test-topic

然后输入消息,每行一条:

text
hello kafka cluster
message 1
message 2
按 Ctrl+C 退出。

方式二:单条消息生产(脚本方式)

bash
echo "test message $(date)" | bin/kafka-console-producer.sh --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092 --topic test-topic

方式三:从文件批量生产
bash

  • 准备消息文件
echo -e "line1\nline2\nline3" > messages.txt
  • 批量发送
bin/kafka-console-producer.sh --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092 --topic test-topic < messages.txt

3.2 消费数据

方式一:从头消费(查看所有历史消息)

bash
bin/kafka-console-consumer.sh --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092 --topic test-topic --from-beginning

方式二:只消费最新消息(不读历史)

bash
bin/kafka-console-consumer.sh --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092 --topic test-topic

方式三:指定消费者组(便于管理偏移量)

bash
bin/kafka-console-consumer.sh --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092 --topic test-topic --group my-group --from-beginning

方式四:消费指定数量的消息后自动退出

bash
bin/kafka-console-consumer.sh --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092 --topic test-topic --from-beginning --max-messages 10

四、完整验证流程

终端 1:启动生产者(持续发送)

bash
bin/kafka-console-producer.sh --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092 --topic test-topic

输入几条消息后保持运行。

终端 2:启动消费者(实时查看)

bash
bin/kafka-console-consumer.sh --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092 --topic test-topic --from-beginning

应该能看到终端 1 发送的所有消息。

终端 3:验证消费者组状态
bash

  • 查看消费者组列表
bin/kafka-consumer-groups.sh --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092 --list
  • 查看指定组的消费进度
bin/kafka-consumer-groups.sh --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092 --describe --group my-group

五、高可用性测试(验证集群容错)

测试 1:停止一个 Broker,看生产和消费是否继续
bash

  • 在 kafka2 上停止服务
pkill -9 -f kafka-server-start

  • 在 kafka1 上继续生产消息
echo "test after broker down" | bin/kafka-console-producer.sh --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092 --topic test-topic
  • 消费消息(应该还能正常消费)
bin/kafka-console-consumer.sh --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092 --topic test-topic --from-beginning --max-messages 1

测试 2:查看分区 Leader 重新分配
bash

  • 查看主题详情,确认 Leader 已切换到其他节点
bin/kafka-topics.sh --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092 --describe --topic test-topic

🛠️ 常用生产和消费参数
生产者高级参数

bash
bin/kafka-console-producer.sh \
  --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092 \
  --topic test-topic \
  --producer-property acks=all \
  --producer-property compression.type=gzip \
  --producer-property batch.size=16384

参数 说明 推荐值
acks=all 所有副本确认后才算成功 生产环境必配
compression.type 压缩类型 gzip 或 snappy
batch.size 批量大小 16384 (16KB)
消费者高级参数

bash
bin/kafka-console-consumer.sh \
  --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092 \
  --topic test-topic \
  --group my-group \
  --from-beginning \
  --consumer-property fetch.min.bytes=1024 \
  --consumer-property fetch.max.wait.ms=500

参数 说明
fetch.min.bytes 每次拉取的最小数据量
fetch.max.wait.ms 等待数据的最长时间
max.poll.records 每次拉取的最大消息数
💡 集群与单节点的关键区别
操作 单节点 集群(3节点)
Bootstrap 地址 localhost:9092 kafka1:9092,kafka2:9092,kafka3:9092
副本因子 --replication-factor 1 --replication-factor 3(推荐)
可用性 一台挂了全部不可用 一台挂了仍可继续
数据可靠性 低(无副本) 高(3副本)
✅ 验证清单
执行完所有测试后,确认以下功能正常:

生产者能成功发送消息(控制台无报错)

消费者能看到历史消息(–from-beginning)

消费者能实时看到新消息(生产者输入后立即显示)

消费者组能查询到偏移量和 Lag

停止一个 Broker 后,生产和消费仍然正常

主题副本分布在所有 3 个节点上

六、使用fliebeat将日志收集到kafka

6.1下载安装filebeat

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.17.0-x86_64.rpm
sudo rpm -vi filebeat-8.17.0-x86_64.rpm

6.2配置文件

[root@kafka1 filebeat-8.17.0-linux-x86_64]# cat filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/*.log          # 替换为你实际的日志路径

output.kafka:
  hosts: ["kafka1:9092", "kafka2:9092","kafka3:9093"] # 替换为你的Broker地址

  # ⚠️ 关键配置:指定协议版本为 2.1.0
  version: "2.1.0"             # [citation:2][citation:5]

  topic: "filebeat-logs"       # 替换为你想要的Topic
  required_acks: 1
  compression: gzip

启动脚本

[root@kafka1 filebeat-8.17.0-linux-x86_64]# cat start.sh
#!/bin/bash
sudo ./filebeat -e -c filebeat.yml

消费下topic看看

[root@kafka1 kafka]# bin/kafka-console-consumer.sh --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092 --topic filebeat-logs --from-beginning
[2026-06-18 09:38:20,375] WARN [Consumer clientId=console-consumer, groupId=console-consumer-59133] Connection to node -3 (kafka3/10.0.0.134:9092) could not be established. Node may not be available. (org.apache.kafka.clients.NetworkClient)
[2026-06-18 09:38:20,376] WARN [Consumer clientId=console-consumer, groupId=console-consumer-59133] Bootstrap broker kafka3:9092 (id: -3 rack: null) disconnected (org.apache.kafka.clients.NetworkClient)
{"@timestamp":"2026-06-18T01:38:04.895Z","@metadata":{"beat":"filebeat","type":"_doc","version":"8.17.0"},"ecs":{"version":"8.0.0"},"host":{"name":"kafka1"},"agent":{"version":"8.17.0","ephemeral_id":"bae82063-9773-4700-a59c-ed463df169b0","id":"80ccd9ad-05d3-4808-9c68-4113e30eb1d7","name":"kafka1","type":"filebeat"},"log":{"offset":60,"file":{"path":"/var/log/yum.log"}},"message":"Apr 30 20:57:52 Installed: 14:tcpdump-4.9.2-4.el7_7.1.x86_64","input":{"type":"log"}}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值