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

    • 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 题

副本机制

定义与作用

副本(Replica)是 Partition 的冗余拷贝。Kafka 为每个 Partition 创建多个副本,分布在不同的 Broker 上。副本机制是 Kafka 实现高可用和数据不丢失的基石:当 Leader 副本所在的 Broker 宕机,Follower 副本可以接替成为新 Leader。

每个 Partition 的副本中,只有一个是 Leader(接收读写),其余是 Follower(只从 Leader 同步数据)。

核心原理

副本角色模型

角色对比:

LeaderFollower
读写请求处理全部不处理
数据来源Producer 直接写入从 Leader fetch
Producer 连接必须不需要
Consumer 连接必须不需要(Kafka 2.4+ 可读 Follower)
数量每分区 1 个N-1 个

副本分布策略

Kafka 的副本分配遵循以下约束,确保高可用:

假设 3 Broker,Topic `demo` 有 3 分区,3 副本

Partition 0: [Leader: B1, Follower: B2, B3]
Partition 1: [Leader: B2, Follower: B3, B1]
Partition 2: [Leader: B3, Follower: B1, B2]

→ 每台 Broker 既是某些分区的 Leader,也是其他分区的 Follower
→ 任意一台宕机,其他 Broker 上有 Follower 可以接替

副本同步流程

完整示例

示例一:创建多副本 Topic

场景:3 Broker 集群,创建 3 副本的 Topic,验证副本分布。

# 创建 3 分区、3 副本的 Topic
bin/kafka-topics.sh --create --topic orders-replicated \
  --partitions 3 --replication-factor 3 \
  --bootstrap-server localhost:9092

# 查看副本分布
bin/kafka-topics.sh --describe --topic orders-replicated \
  --bootstrap-server localhost:9092

输出:

Topic: orders-replicated  Partition: 0  Leader: 1  Replicas: 1,2,3  Isr: 1,2,3
Topic: orders-replicated  Partition: 1  Leader: 2  Replicas: 2,3,1  Isr: 2,3,1
Topic: orders-replicated  Partition: 2  Leader: 3  Replicas: 3,1,2  Isr: 3,1,2

分析:3 个分区的 Leader 均匀分布在 3 台 Broker 上(负载均衡),每个 Leader 所在行第一个 Replicas 数字等于 Leader 数字(说明 Preferred Leader 分配正确)。

示例二:副本因子不足的错误

场景:2 Broker 集群尝试创建 3 副本的 Topic。

bin/kafka-topics.sh --create --topic test-rf3 \
  --partitions 3 --replication-factor 3 \
  --bootstrap-server localhost:9092

输出:

Error: Replication factor: 3 larger than available brokers: 2.

规则:replication-factor ≤ 集群 Broker 数量。

易错场景

易错 1:误认为 Follower 可以分担读负载

场景:高读 QPS 场景下,增加副本数期望提升读性能。

事实:Kafka(3.x 之前)只有 Leader 处理读请求。增加副本数不会提升读性能,反而增加同步开销。Kafka 2.4+ 引入 rack-aware 消费者可读 Follower(需 client.rack 配置),但默认不开启。

正确做法:通过增加分区数来提升读并行度。

易错 2:副本数设得太高

场景:Topic 有 50 个分区,每个分区 5 个副本。

后果:总共 250 个副本需要维护。大量网络带宽用于副本复制,Broker 内存压力大。

经验法则:

  • 一般生产环境:3 个副本
  • 银行/支付等极高可靠性:5 个副本
  • 日志/监控等可容忍丢失:1-2 个副本

面试高频考点

Q:Kafka 的副本和分布式存储(如 HDFS)的副本有什么本质区别?

A:

  • Kafka:每个 Partition 只有一个活跃副本(Leader),Follower 是被动同步,从不接受写入。这是为了确保每个 Partition 内的消息是完全有序的。
  • HDFS:任意副本都可读,写入经 Leader Pipeline 同步到多个 DataNode。因为 HDFS 文件没有"分区内消息顺序"的概念。

Kafka 的选择牺牲了部分读吞吐(需要从 Leader 读),换取了分区内的绝对有序性。

上一页
章节导读
下一页
ISR 与副本同步