前言
kafka集群是由多个broker节点组成,这里面包含了许多的知识点,以下的这些问题你都知道吗?
- 你知道topic的分区leader是怎么选举的吗?
- 你知道zookeeper中存储了kafka的什么信息吗?起到什么做呢?
- 你知道kafka消息文件是怎么存储的吗?
- 如果kafka中leader节点或者follower节点发生故障,消息会丢失吗?如何保证消息的一致性和可靠性呢?
如果你对这些问题比较模糊的话,那么很有必要看看本文,去了解以下kafka的核心设计,本文主要基于kafka3.x版本讲解。
kafka broker核心机制
kafka集群整体架构
kafka集群是由多个kafka broker通过连同一个zookeeper组成,那么他们是如何协同工作对外提供服务的呢?zookeeper中又存储了什么信息呢?
- kafka broker启动后,会在zookeeper的/brokers/ids路径下注册。
- 同时,其中一个broker会被选举为控制器(Kafka Controller)。选举规则也很简单,谁先注册到zookeeper中的/controller节点,谁就是控制器。Controller主要负责管理整个集群中所有分区和副本的状态。
- Kafka Controller会进行Leader选择,比如上图中针对TopicA中的0号分区,选择broker0作为Leader, 然后会将选择的节点信息注册到zookeeper的/brokers/topics路径下,记录谁是Leader,有哪些服务器可用。
- 被选举为Leader的topic分区提供对外的读写服务。为什么只有Leader节点提供读写服务,而不是设计成主从方式,Follower提供读服务呢?
- 为了保证数据的一致性,因为消息同步延迟,可能导致消费者从不同节点读取导致不一致。
- kafka设计目的是分布式日志系统,不是一个读多写少的场景,kafka的读写基本是对等的。
- 主从方式的话带来设计上的复杂度。
kafka leader选举机制
那么问题来了,kafka中topic分区是如何选择leader的呢?为了更好的阐述,我们先来理解下面3个概念。
- ****ISR:表示和 Leader 保持同步的 Follower 集合。如果 Follower 长时间未向 Leader 发送通信请求或同步数据,则该 Follower 将被踢出 ISR。该时间阈值由 replica.lag.time.max.ms参数设定,默认 30s。Leader 发生故障之后,就会从 ISR 中选举新的Leader。
- ****OSR:表示 Follower 与 Leader 副本同步时,延迟过多的副本。
- ****AR: 指的是分区中的所有副本,所以AR = ISR + OSR。
Kafka Controller选举Leader的规则:在isr队列中存活为前提,按照AR中排在前面的优先。例如ar[1,0,2], isr [1,0,2],那么leader就会按照1,0,2的顺序轮询。而AR中的这个顺序kafka会进行打散,分摊kafka broker的压力。
当运行中的控制器突然宕机或