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 切换和元数据传播可能成为瓶颈。
课程整体学习路径
本课程共 30 章,按“认知 → 单机 → 集群 → 高可用 → 生产运维”的递进关系组织。下图展示了从环境准备到高可用集群落地的核心链路,以及每一环对应的关键对象与判断依据。
路径中的每一阶段都不是孤立的。阶段一的环境准备如果主机名、时钟、JDK 版本不一致,阶段三的集群会频繁出现副本同步异常;阶段二的单机验证如果只确认进程启动,不验证消息收发,阶段四的高可用演练就缺少可靠的基线。
实战环境准备
本课程使用 3 台 Linux 主机模拟生产集群,推荐配置如下(属于教学示例,实际生产应按流量和保留策略重新核算):
| 项目 | 示例配置 | 说明 |
|---|---|---|
| 主机数量 | 3 台 | 可模拟 Broker 宕机与 Leader 切换 |
| CPU / 内存 | 4 核 / 8 GB | 教学环境下限,生产需按吞吐评估 |
| 磁盘 | 100 GB SSD | Kafka 对顺序写友好,但随机 I/O 抖动会拖垮 ISR |
| 操作系统 | CentOS 7 / Ubuntu 22.04 | 关闭 swap,调整文件句柄数 |
| JDK | OpenJDK 17 | Confluent 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,否则无法组成同一集群。