Kafka 作为高性能的分布式消息队列,其 Broker 节点的设计是支撑高吞吐、高可用的核心。本文将从存储结构、消息清理、高可用选举、数据同步四个维度,解析 Kafka Broker 的工作原理。
tom-topic
可分为 Partition0、Partition1 等,每个分区对应独立的物理目录(如 tom-topic-0
)。
replication-factor
配置)。副本分为:
Kafka 通过 assignReplicasToBrokers
函数分配副本,核心规则包括:
例如,4 个分区、2 个副本的 Topic 会将 8 个副本均衡分布到 3 台 Broker 上(3:3:2),确保负载均衡。
为防止单个日志文件无限膨胀,Kafka 将每个 Partition 拆分为多个 Segment,每个 Segment 包含:
.log
:存储消息数据;
.index
:Offset 与消息物理位置的映射(稀疏索引);
.timeindex
:时间戳与 Offset 的映射。
Segment 切分触发条件:
log.segment.bytes
控制);
log.roll.hours
控制);
log.index.size.max.bytes
控制)。
Kafka 采用 稀疏索引(非每条消息都建索引),通过 log.index.interval.bytes
(默认 4KB)控制索引密度:每写入 4KB 数据,生成一条索引记录。
.log
文件中遍历匹配。
Kafka存储结构:
Kafka 通过两种策略管理消息生命周期,可通过 log.cleanup.policy
配置(默认 delete
)。
定时任务(默认每 5 分钟,log.retention.check.interval.ms
)触发删除,规则包括:
log.retention.hours
),支持分钟(log.retention.minutes
)或毫秒级配置;
log.retention.bytes
限制总大小,超过后从最旧数据开始删除。
针对 Key 重复的消息(如 __consumer_offsets
主题),压缩后仅保留最新版本。例如:
k1:aa → k1:ii → k1:kk
k1:kk
(最新 Offset)。
压缩可减少存储空间,但会导致 Offset 不连续(不影响查询)。
Kafka 通过 Zookeeper 选举唯一的 Controller 节点,负责管理全集群元数据:
/controller
,成功创建者成为 Controller;
当 Leader 副本故障时,需从副本中选举新 Leader,核心逻辑如下:
[146,144,145]
中优先选择 146);
unclean.leader.election.enable
允许 OSR(落后的副本)参选,但可能导致数据丢失。
Kafka Broker 通过分区与副本实现扩展与可靠性,通过Segment 与稀疏索引高效管理存储,通过Controller 与 ISR 选举保障高可用,通过LEO 与 HW 机制确保数据同步一致性。这些设计共同支撑了 Kafka 高吞吐、低延迟、高容错的核心能力,使其成为分布式系统中消息传递的首选方案。