【Kafka KRaft 集群】

提示:本文原创作品,良心制作,干货为主,简洁清晰,一看就会

文章目录

  • 前言
  • 一、Kafka核心概念
    • [1.1 基础角色组件](#1.1 基础角色组件)
    • [1.2 Topic](#1.2 Topic)
    • [1.3 消费组 Consumer Group](#1.3 消费组 Consumer Group)
    • [1.4 分区 Partition(横向扩容核心)](#1.4 分区 Partition(横向扩容核心))
    • [1.5 副本 Replication(高可用核心)](#1.5 副本 Replication(高可用核心))
    • [1.6 Leader选举机制](#1.6 Leader选举机制)
  • 二、基于KRaft模式的集群
    • [2.1 安装jdk](#2.1 安装jdk)
    • [2.2 安装kakfa](#2.2 安装kakfa)
    • [2.3 测试kafka集群](#2.3 测试kafka集群)

前言

Kafka 作为主流的分布式消息中间件,被广泛应用于日志收集、异步解耦、流量削峰等业务场景。自 Kafka 2.8.0 版本正式推出 KRaft 内置 Raft 协议后,彻底移除了 ZooKeeper 依赖,简化架构、提升集群稳定性与性能。为帮助快速掌握新版 Kafka,本文先系统讲解 Kafka 核心基础原理,再手把手完成 KRaft 模式三节点集群搭建与测试,实现原理理解与工程落地一体化

一、Kafka核心概念

1.1 基础角色组件

Producer生产者 :消息入口,负责向Broker推送消息

Consumer消费者 :订阅Topic,拉取并处理消息

Broker :Kafka服务实例,集群内每个Broker拥有唯一编号,一台服务器可部署多个Broker

Controller :集群总管理者(集群单点,可故障转移),依靠Zookeeper监听集群变更,负责Topic增删、分区分配、Broker上下线、Leader选举等集群管控

Zookeeper:存储集群元数据,为Controller提供集群状态监听能力

旧版靠独立 ZooKeeper外接存储元数据、实现 Controller 与 Leader 选举,多一套外部组件、链路长、大规模集群易出现 ZK 瓶颈;

Kafka 2.8.0 起推出 KRaft 模式,内置 Raft 协议管理元数据与 Leader 选举,不再依赖 ZooKeeper,用统一 Raft 日志管理全部集群元数据,选举、故障处理链路更短,部署简单、性能与稳定性更好

1.2 Topic

Topic是消息分类载体,类比数据库表/Redis List

  • 物理上拆分存储在不同文件夹,逻辑上对消息分组
  • 生产者发消息、消费者读消息只需指定Topic,无需关心底层存储节点
  • 单个Broker可承载多个Topic

1.3 消费组 Consumer Group

  • 每个消费者归属一个消费组,未指定则使用默认组
  • 同一条Topic消息,同一消费组内仅一个消费者能消费(单播);多个消费组可独立消费同一条消息(多播)

1.4 分区 Partition(横向扩容核心)

  1. 一个Topic会切分为多个Partition,以文件夹形式存储数据与索引
  2. 作用:实现负载均衡、横向扩容存储、多节点并行读写,大幅提升吞吐
  3. 有序规则:单个Partition内消息有序,不同Partition之间全局无序
  4. 最佳实践:Partition总数不超过集群Broker节点数

1.5 副本 Replication(高可用核心)

  1. 副本包含1个Leader主分片 + N个Follower从分片,副本总数建议≥2
  2. 读写仅走Leader,Follower同步数据做容灾,副本不能跨超过集群节点数量
  3. 和ES副本区别:Kafka副本总数包含主分片,ES副本仅指从分片

如下图:

左侧 Producer 生产者

多个生产者,红色线条只把消息发给 分区Leader副本,不发Follower

中间 Kafka Cluster 集群(3台Broker)

Topic 分区副本,每个Topic分区分1个Leader、多个Follower

Leader:负责所有读写

Follower:异步同步Leader数据,故障时竞选新Leader

虚线是副本之间的数据同步

分区分散在不同Broker,实现高可用

右侧 Consumer 消费者组

同一消费组(Group A):一个分区只能被组内一个消费者消费,图中A组2个消费者对应Topic A两个分区

不同消费组(Group B):独立消费全量数据,互不干扰

蓝紫色虚线:消费者从分区Leader拉取消息

底部 ZooKeeper/Raft协议

存储集群元数据:Broker、分区Leader、消费位点、控制器信息,管控集群状态

新版kafka内置 Raft 协议管理元数据与 Leader 选举,不再依赖 ZooKeeper

1.6 Leader选举机制

旧版:Leader宕机后ZooKeeper感知会话过期,通知副本选举,从ISR(当前分区 Leader + 所有跟得上 Leader、数据完全同步的 Follower)同步副本集合里挑选数据最新副本作为新Leader,随后同步更新集群元数据

新版:内置Raft协议管理元数据与Leader选举。Kafka分区采用Leader读写、Follower异步复制的架构保障高可用,允许Leader未等全部副本同步就返回写入确认,若此时Leader故障会丢失未同步数据,引发一致性问题;若要开启强一致性,需配置acks=-1/all等待全部ISR副本同步、同时将min.insync.replicas设为大于1,确保至少多个副本落盘才确认写入,以此规避数据丢失

二、基于KRaft模式的集群

本文仅演示 KRaft 模式集群搭建流程,若需了解 ZooKeeper 模式集群部署步骤,可参考下文 2.2 小节

基于Zookeeper模式的集群:https://blog.csdn.net/m0_63756214/article/details/157254529?spm=1001.2014.3001.5502

实验环境

主机名 IP 用途
kafka-1 192.168.13.140 KRaft控制器节点 + 数据Broker节点
kafka-2 192.168.13.141 KRaft控制器节点 + 数据Broker节点
kafka-3 192.168.13.142 KRaft控制器节点 + 数据Broker节点

KRaft三控三数据:3台机器全部参与Raft元数据选举,同时负责业务消息存储,无需额外ZK

2.1 安装jdk

JDK官网:https://www.oracle.com/java/technologies/downloads/

kafka每台机器都要安装

yaml 复制代码
root@kafka-1:~# wget https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.tar.gz
root@kafka-1:~# ls
jdk-21_linux-x64_bin.tar.gz
root@kafka-1:~# tar xf jdk-21_linux-x64_bin.tar.gz 
root@kafka-1:~# mv jdk-21.0.12 /usr/local/
root@kafka-1:~# mv /usr/local/jdk-21.0.12/ /usr/local/java
root@kafka-1:~# vim /etc/profile  # 增加以下两行
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$PATH
root@kafka-1:~# source /etc/profile
root@kafka-1:~# java --version
java 21.0.12 2026-07-21 LTS
Java(TM) SE Runtime Environment (build 21.0.12+7-LTS-205)
Java HotSpot(TM) 64-Bit Server VM (build 21.0.12+7-LTS-205, mixed mode, sharing)

2.2 安装kakfa

清华源镜像:https://mirrors.tuna.tsinghua.edu.cn/apache/kafka

yaml 复制代码
## 1. 域名解析
root@kafka-1:~# vim /etc/hosts
192.168.13.140 kafka-1
192.168.13.141 kafka-2
192.168.13.142 kafka-3

## 2. 下载kafka
root@kafka-1:~# wget https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/4.1.2/kafka_2.13-4.1.2.tgz
root@kafka-1:~# tar xf kafka_2.13-4.1.2.tgz -C /usr/local/

## 3. 创建日志存储目录
root@kafka-1:~# mkdir /data/logs -p
yaml 复制代码
## 4. 修改配置文件
root@kafka-1:~# vim /usr/local/kafka_2.13-4.1.2/config/server.properties
process.roles=broker,controller
# 节点唯一ID,三台机器分别配置1、2、3,不可重复
node.id=1
# KRaft控制器集群引导地址
controller.quorum.bootstrap.servers=kafka-1:9093,kafka-2:9093,kafka-3:9093
# KRaft投票节点清单,格式:节点ID@主机:控制器端口
controller.quorum.voters=1@kafka-1:9093,2@kafka-2:9093,3@kafka-3:9093
# 监听端口配置:PLAINTEXT业务消息端口9092,CONTROLLER控制器内部通信端口9093,0.0.0.0监听所有网卡
listeners=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
inter.broker.listener.name=PLAINTEXT
# 对外暴露访问地址,生产者/消费者连接用本机IP,每台kafka绑定自己的ip
advertised.listeners=PLAINTEXT://192.168.13.140:9092,CONTROLLER://192.168.13.140:9093
controller.listener.names=CONTROLLER
# Kafka消息日志持久化存储目录,分区数据全部存放于此
log.dirs=/data/logs
# 消费偏移量内置主题的副本数3,集群3节点配套此配置
offsets.topic.replication.factor=3
yaml 复制代码
## 5. 生成集群唯一ID
root@kafka-1:~# /usr/local/kafka_2.13-4.1.2/bin/kafka-storage.sh random-uuid
HOIs3Cw6RZ6K-1h7mz5Gig

## 6. 初始化元数据存储,每台kafka都要执行
root@kafka-1:~# /usr/local/kafka_2.13-4.1.2/bin/kafka-storage.sh format -t HOIs3Cw6RZ6K-1h7mz5Gig -c /usr/local/kafka_2.13-4.1.2/config/server.properties
yaml 复制代码
## 7. 后台启动kafka
root@kafka-1:~# /usr/local/kafka_2.13-4.1.2/bin/kafka-server-start.sh -daemon /usr/local/kafka_2.13-4.1.2/config/server.properties

## 8. 查看日志,端口,确保9092/9093开启
root@kafka-1:~# cat /usr/local/kafka_2.13-4.1.2/logs/server.log
root@kafka-1:~# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      946/systemd-resolve 
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1215/sshd           
tcp6       0      0 :::22                   :::*                    LISTEN      1215/sshd           
tcp6       0      0 :::9092                 :::*                    LISTEN      7809/java           
tcp6       0      0 :::9093                 :::*                    LISTEN      7809/java           
tcp6       0      0 :::43883                :::*                    LISTEN      7809/java 

2.3 测试kafka集群

yaml 复制代码
## 在一台kafka上创建测试话题
root@kafka-1:~# /usr/local/kafka_2.13-4.1.2/bin/kafka-topics.sh --create --topic test --partitions 3 --replication-factor 3 --bootstrap-server kafka-1:9092

## 在其他机器上可以看到刚才创建的话题
root@kafka-2:~# /usr/local/kafka_2.13-4.1.2/bin/kafka-topics.sh --list --bootstrap-server kafka-2:9092
test
yaml 复制代码
## 生产者生产消息
root@kafka-1:~# /usr/local/kafka_2.13-4.1.2/bin/kafka-console-producer.sh  --bootstrap-server kafka-1:9092 --topic test

## 消费者消费消息,kafka2和kafka3都能各自消费一遍
root@kafka-2:~# /usr/local/kafka_2.13-4.1.2/bin/kafka-console-consumer.sh --bootstrap-server kafka-2:9092 --topic test --from-beginning

到此,基于KRaft模式的集群搭建完毕!


注:

文中若有疏漏,欢迎大家指正赐教。

本文为100%原创,转载请务必标注原创作者,尊重劳动成果。

求赞、求关注、求评论!你的支持是我更新的最大动力,评论区等你~

相关推荐
ACP广源盛139246256733 小时前
Ling‑3.0‑flash 昇腾 0‑Day 适配落地@ACP#IX9104 在国产高密度算力矩阵中的机遇与落地场景
大数据·人工智能·分布式·单片机·嵌入式硬件
阿无,7 小时前
SpringCloudAlibaba Seata分布式事务 TCC模式
分布式
独行侠影a20 小时前
SpringBoot 分布式锁实战:Redisson 解决订单超卖并发问题
spring boot·分布式·后端
运维行者_1 天前
网络监控与ITSM集成:从告警到工单,实现运维自动化闭环
开发语言·网络·分布式·后端·架构·flask·php
猿长大人1 天前
C# | MediatR 入门指南:后端架构解耦
分布式·后端·架构·c#·.net
蓝胖的四次元口袋1 天前
分布式知识梳理(2)
分布式
小罗水2 天前
附录D 常见问题排查指南
分布式
2601_960906722 天前
地球或逃逸到相对安全的日心轨道
kafka·hbase·flume·storm
华章酱2 天前
基于 RabbitMQ 与 Hyperf 的消息顺序性保障方案
分布式·rabbitmq