面试题答案
一键面试消息存储
- 持久化存储:Broker负责将接收到的消息持久化到本地磁盘。Kafka使用基于文件系统的日志结构存储,每个Topic的每个Partition在Broker上对应一个日志目录,日志以段(Segment)为单位进行管理,每个段包含一定数量的消息,这种结构便于消息的追加写入和旧日志的清理。
- 日志管理:Broker对消息日志进行定期清理和压缩。清理策略可以基于时间(如保留最近7天的消息)或大小(如日志文件达到一定大小后删除旧的部分)。压缩则是通过合并具有相同Key的消息,只保留最新的Value,以减少存储空间并提高读取效率。
- 副本管理:为了保证数据的可靠性,Broker参与副本的存储和同步。每个Partition可以有多个副本,其中一个为领导者(Leader)副本,其余为追随者(Follower)副本。Broker上的Follower副本会从Leader副本同步消息,确保数据一致性。
消息分发
- 生产者消息接收:Broker接收来自生产者(Producer)发送的消息。生产者根据Partition策略(如轮询、按Key哈希等)将消息发送到特定的Partition,Broker负责将这些消息写入对应的日志。
- 消费者消息分发:Broker为消费者(Consumer)提供消息。消费者通过订阅Topic来获取消息,Broker根据消费者的消费偏移量(Offset),将相应的消息发送给消费者。在基于拉(Pull)模式的消费模型中,消费者主动向Broker请求消息,Broker根据请求返回相应的消息集。
- 消费者组管理:对于消费者组(Consumer Group),Broker协调组内消费者的负载均衡。当新的消费者加入组或已有消费者离开组时,Broker会重新分配Partition给组内的消费者,以确保每个Partition在同一时间只被组内的一个消费者消费,从而实现并行消费。
集群管理
- 节点通信:Broker之间通过内部协议进行通信,以维持集群的状态。它们交换关于Partition的元数据信息,如Leader副本的位置、副本的同步状态等,确保集群中各个节点对整个集群状态有一致的认知。
- 选举机制:当Leader副本所在的Broker发生故障时,Broker参与Partition的Leader选举。通过一定的选举算法(如Zookeeper协调下的ISR(In - Sync Replicas)机制),从Follower副本中选出新的Leader,保证消息的正常读写。
- 元数据管理:Broker存储和维护与Topic、Partition相关的元数据信息,如Topic的配置(分区数、副本因子等)、Partition的分布情况等。这些元数据信息通过Zookeeper进行协调和同步,使集群中的所有Broker都能获取最新的元数据,以正确处理消息的存储和分发。