1. 课程导入与生产环境认知

在开始搭建 Confluent Kafka 高可用集群之前,先要建立一个清晰的生产环境认知:Kafka 不是“装好就能用”的中间件,而是一套对磁盘、网络、JVM、操作系统参数和运维流程都有强依赖的分布式系统。本节的目标是让你明确高可用的核心目标、识别典型生产挑战、理解课程整体学习路径,并完成实战环境的准备。

高可用的核心目标

Kafka 高可用的本质,是在部分节点、磁盘、机架甚至机房发生故障时,集群仍能持续提供读写服务,并且不丢失已确认的消息。围绕这个本质,可以拆解为四个可度量的目标:

  • 数据不丢:已提交(committed)的消息在故障后仍然存在。这依赖副本机制、acks=all、min.insync.replicas 与 ISR 的协同。
  • 服务不断:Broker 宕机后,分区 Leader 能自动切换到其他副本,客户端在秒级到十秒级内恢复。
  • 容量可控:分区分布均匀,单 Broker 不成为热点,磁盘、网络、CPU 不因倾斜而先于硬件故障。
  • 可观测可恢复:故障能被监控发现,恢复动作有预案,而不是靠人工登录逐台排查。

这四个目标之间存在张力。例如为了“不丢”提高副本数和 acks 级别,会带来更高的写入延迟和网络开销;为了“不断”加快故障切换,可能缩短会话超时,却增加了误判风险。生产设计的本质就是在这些参数之间做有依据的取舍。

典型生产挑战

从大量真实集群的运维经验看,Kafka 生产环境的问题往往集中在以下几类:

1. 副本与 ISR 收缩。当某个 Follower 副本同步落后超过 replica.lag.time.max.ms(默认 30000ms),它会被踢出 ISR。如果此时 ISR 数量低于 min.insync.replicas,生产者写入会直接失败。常见诱因是磁盘 I/O 抖动、网络带宽不足或 Broker 负载过高。

2. 分区倾斜与 Leader 集中。创建 Topic 时若分区数过少,或副本分配策略不合理,会出现部分 Broker 承载大量 Leader。Leader 承担读写流量,Follower 只做同步,因此 Leader 集中会直接造成单机网卡和 CPU 饱和。

3. 磁盘写满与日志段管理。Kafka 以追加写日志段(segment)的方式存储消息,保留策略由 log.retention.hours 或 log.retention.bytes 控制。若保留时间过长或流量突增,磁盘写满会导致 Broker 直接不可用。

4. 客户端配置不当。生产者未设置重试、消费者 max.poll.interval.ms 过小导致频繁 rebalance,都会在高可用集群上制造“集群没问题但业务不可用”的假象。

5. 控制器与元数据压力。Kafka 依赖 Controller 管理分区 Leader 选举和副本状态。大规模集群中,Controller 切换和元数据传播可能成为瓶颈。

以上问题中,磁盘、网络和 JVM 属于基础设施层,副本、ISR、分区属于集群配置层,重试、超时、poll 间隔属于客户端层。排障时必须先定位问题属于哪一层,否则容易在错误的层面反复调整。

课程整体学习路径

本课程共 30 章,按“认知 → 单机 → 集群 → 高可用 → 生产运维”的递进关系组织。下图展示了从环境准备到高可用集群落地的核心链路,以及每一环对应的关键对象与判断依据。

Confluent Kafka 高可用集群学习路径 阶段一 · 环境准备 3 台 Linux 主机 JDK 17 + Confluent 7.x 主机名 / hosts / 时钟同步 阶段二 · 单机验证 KRaft 模式启动 创建 Topic / 收发消息 确认 Broker 与 Controller 阶段三 · 集群搭建 3 Broker + 3 Controller 副本分配 / 分区规划 跨机架感知配置 阶段四 · 高可用 ISR / acks / 重试 故障切换演练 数据不丢验证 关键对象与判断依据 Broker / Controller 进程存活、端口 9092/9093 Topic / Partition 分区数、副本因子、Leader ISR / min.insync.replicas 同步副本数是否达标 磁盘 / 网络 / JVM I/O 延迟、带宽、GC 停顿 验证闭环:每一步都要能回答“怎么判断成功” 1 进程与端口可访问 jps / ss -lntp 2 Topic 元数据正确 kafka-topics --describe 3 消息可生产可消费 console producer / consumer 4 故障后仍可读写 停 Broker 观察 Leader 切换

路径中的每一阶段都不是孤立的。阶段一的环境准备如果主机名、时钟、JDK 版本不一致,阶段三的集群会频繁出现副本同步异常;阶段二的单机验证如果只确认进程启动,不验证消息收发,阶段四的高可用演练就缺少可靠的基线。

实战环境准备

本课程使用 3 台 Linux 主机模拟生产集群,推荐配置如下(属于教学示例,实际生产应按流量和保留策略重新核算):

项目示例配置说明
主机数量3 台可模拟 Broker 宕机与 Leader 切换
CPU / 内存4 核 / 8 GB教学环境下限,生产需按吞吐评估
磁盘100 GB SSDKafka 对顺序写友好,但随机 I/O 抖动会拖垮 ISR
操作系统CentOS 7 / Ubuntu 22.04关闭 swap,调整文件句柄数
JDKOpenJDK 17Confluent 7.x 推荐版本
Kafka 发行版Confluent Platform 7.6含 Schema Registry、Control Center 等组件

环境准备的关键动作包括:设置静态 IP 与主机名(如 kafka01、kafka02、kafka03),在 /etc/hosts 中互相解析;配置 NTP 或 chrony 保证三台机器时钟偏差在毫秒级;关闭 swap 并设置 vm.swappiness=1;将文件句柄数提升到 100000 以上。这些动作看似基础,但直接决定后续集群能否稳定运行。

# 示例:三台主机的基础检查
hostnamectl set-hostname kafka01
echo "192.168.1.11 kafka01" >> /etc/hosts
echo "192.168.1.12 kafka02" >> /etc/hosts
echo "192.168.1.13 kafka03" >> /etc/hosts

# 关闭 swap
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab

# 文件句柄
ulimit -n 100000

# 时钟同步
chronyc sources -v

完成上述准备后,你应该能够回答三个问题:三台主机能否互相通过主机名通信?JDK 版本是否一致?磁盘剩余空间是否足够支撑课程中的消息保留测试?如果这三个问题的答案都是肯定的,就可以进入下一阶段的单机验证。

建议在开始集群搭建前,先用 kafka-storage.sh random-uuid 生成集群 ID 并记录,后续所有节点必须使用同一个集群 ID,否则无法组成同一集群。