kafka Broker专题

目录

Broker

描述

1. 定义:

  • Broker是Kafka集群中的一个服务器节点,负责存储消息数据并处理客户端(如Producer和Consumer)的请求。

2. 标识:

  • 每个Broker都有一个唯一的标识符,称为broker.id,用于在集群中区分不同的Broker。

3. 功能:

  • 存储消息:Broker将Producer发送的消息存储到磁盘上。
  • 转发消息:Broker将存储的消息转发给订阅该消息的Consumer。
  • 管理分区:Broker负责管理Kafka中的分区(Partition),包括分区的创建、删除、复制等。

zookeeper存储情况

下图为zookeeper节点中的存储

  1. 具体主题节点: 每个主题在ZooKeeper中都有一个节点,节点名称为主题ID,如 [0,1,2]。 在该节点下,存储了与主题相关的各种信息,例如 ids, topics, seqid等。
  2. 事务状态和分区信息: 图片中展示了事务状态(__transaction_state)和分区信息(partitions)。 partitions节点下存储了每个分区的详细信息,包括每个分区的leader和ISR(In-Sync Replicas)列表。
    每个分区的信息以epoch和leader为标识,存储其状态以及ISR列表。
  3. 消费者偏移量: 消费者的偏移量信息存储在 __consumer_offsets 路径下。 每个消费者的状态信息以epoch和消费者ID为标识,存储其状态以及分区信息。

Broker组成

1. 网络层:

  • Broker通过网络层与客户端进行通信,接收Producer发送的消息,并将消息发送给Consumer。

2. 存储层:

  • Broker将消息存储到磁盘上,采用分段(Segment)存储的方式,每个Segment包含一个.log文件和一个.index文件。
  • .log文件用于存储消息数据,.index文件用于存储消息的偏移量索引,便于快速查找消息。

3. 控制器(Controller):

  • 每个Kafka集群都有一个Controller,负责集群的元数据管理、Leader选举、分区重分配等任务。
  • Controller通常运行在集群中的某个Broker上,当该Broker发生故障时,会触发新的Controller选举。

4. 复制管理器:

  • Broker负责管理分区的副本(Replica),包括Leader和Follower的选举、消息复制等。
  • 当Leader发生故障时,复制管理器会从ISR(In-Sync Replicas)中选择新的Leader。

Broker工作流程

1. 启动与注册

  • 启动Broker: 当启动一个Kafka Broker时,它会首先进行初始化操作,加载配置文件,创建必要的线程和组件。

  • 向ZooKeeper注册: Broker启动后,会向ZooKeeper注册自己的信息。ZooKeeper是Kafka集群的元数据存储中心,负责维护集群的状态信息。Broker会在ZooKeeper的/brokers/ids路径下创建一个节点,节点名称是Broker的唯一标识符(broker.id),并存储该Broker的地址和端口等信息。

  • 注册Controller: Kafka集群中的每个Broker都有一个内置的Controller组件。Controller负责集群的元数据管理、Leader选举、分区重分配等重要任务。在Broker启动后,会尝试在ZooKeeper的/controller路径下注册自己为Controller。第一个成功注册的Broker将成为集群的Controller,负责监听其他Broker的状态变化。

2. 监听与响应

  • 监听ZooKeeper变化: Broker会持续监听ZooKeeper中与自己相关的节点的变化。例如,它会监听/brokers/ids路径下其他Broker的状态变化,以便在集群中其他Broker发生故障时,能够及时调整自己的状态。

  • 处理客户端请求: Broker接收来自Producer(生产者)和Consumer(消费者)的请求。Producer向Broker发送消息,Broker将消息存储到磁盘中;Consumer从Broker订阅消息,Broker将消息发送给Consumer。Broker处理这些请求时,会根据消息的主题(Topic)和分区(Partition)进行路由。

3. 消息的存储与处理

  • 存储消息: 当Broker接收到Producer发送的消息时,会首先将消息写入到操作系统的页面缓存中,然后异步地刷新到磁盘上。Kafka采用分段(Segment)存储的方式,每个Segment包含一个.log文件(存储消息数据)和一个.index文件(存储消息的偏移量索引)。这种方式既提高了写入性能,又便于消息的快速查找和删除。

  • 消息复制: 为了提高消息的可靠性,Kafka支持消息的复制。每个Partition可以有多个副本(Replica),其中一个副本是Leader,负责处理读写请求;其他副本是Follower,从Leader同步消息数据。当Leader发生故障时,可以从Follower中选举出新的Leader,继续处理消息。

  • Leader选举: 当Leader发生故障时,Broker会触发Leader选举过程。Controller负责监控所有Broker和Partition的状态,当检测到Leader故障时,会在ZooKeeper中更新Leader信息,并通知所有Broker更新本地的Leader缓存。新的Leader会从ISR(In-Sync

    Replicas,与Leader保持同步的副本集合)中选择,以确保消息的可靠性和一致性。

4. 处理Consumer请求

  • 消费偏移量管理: Broker还负责管理Consumer的消费偏移量。Consumer在消费消息时,会定期向Broker提交自己的消费偏移量,Broker会将偏移量存储到ZooKeeper或Kafka内部的特定Topic中。这样,即使Consumer发生故障重启,也能从上次消费的位置继续消费消息。

  • 响应Consumer请求: 当Consumer向Broker发送消息获取请求时,Broker会根据Consumer提供的主题、分区和偏移量信息,从相应的Segment中读取消息数据,并返回给Consumer。Broker会确保Consumer读取到的是已经成功复制到ISR中的消息,以保证消息的一致性。

5. 集群协作与维护

  • 负载均衡: Kafka集群支持动态的负载均衡。当新增或删除Broker时,Controller会触发分区重分配过程,将现有的分区重新分配到集群中的Broker上,以均衡负载。

  • 监控与报警: Broker会定期向ZooKeeper报告自己的状态信息,如磁盘使用情况、网络延迟等。Controller会监控这些信息,并在检测到异常情况时触发报警或采取相应的措施。

  • 故障恢复: 当Broker发生故障时,Controller会触发故障恢复流程。它会在ZooKeeper中更新Broker的状态信息,通知其他Broker停止向故障的Broker发送请求,并从ISR中选择新的Leader继续处理消息。同时,Controller会尝试重启故障的Broker,并在其恢复后重新加入集群。


副本

1. Kafka 副本作用:避免单点故障,提高数据可靠性。 partition是有序消息日志,那么一定不能只保存这一份日志,否则一旦保存partition的Kafka服务器挂掉了,其上保存的消息也就都丢失了。分布式系统必然要实现高可靠性,而目前实现的主要途径还是依靠冗余机制一一简单地说,就是备份多份日志。这些备份日志在Kafka中被称为副本(replica),它们存在的唯一目的就是防止数据丢失,这一点一定要记住!

2. Kafka 默认副本 1 个,生产环境一般配置为 2 个,保证数据可靠性;太多副本会增加磁盘存储空间,增加网络上数据传输,降低效率。

3. Kafka 中副本分为:Leader 和 Follower。Kafka 生产者只会把数据发往 Leader,然后 Follower 找 Leader 进行同步数据。Leader 发生故障之后,就会从 ISR 中选举新的 Leader。

4. Kafka 分区中的所有副本统称为 AR(Assigned Repllicas),AR = ISR + OSR。

  • ISR(in-sync replica),表示和 Leader 保持同步的 Follower 集合。
  • OSR,表示 Follower 与 Leader 副本同步时,延迟过多的副本。
  • 如果 Follower 长时间未向 Leader 发送通信请求或同步数据,则该 Follower 将被踢出 ISR,放到OSR。该时间阈值由replica.lag.time.max.ms参数设定,默认 30s。
  • 当OSR中Follower重新"追上"了Leader的进度时,OSR->ISR。
相关推荐
Mr.朱鹏12 小时前
SQL深度分页问题案例实战
java·数据库·spring boot·sql·spring·spring cloud·kafka
山沐与山21 小时前
【MQ】Kafka与RocketMQ深度对比
分布式·kafka·rocketmq
yumgpkpm1 天前
Cloudera CDP7、CDH5、CDH6 在华为鲲鹏 ARM 麒麟KylinOS做到无缝切换平缓迁移过程
大数据·arm开发·华为·flink·spark·kafka·cloudera
树下水月1 天前
Easyoole 使用rdkafka 进行kafka的创建topic创建 删除 以及数据发布 订阅
分布式·kafka
Cat God 0071 天前
基于Docker搭建kafka集群
docker·容器·kafka
Cat God 0071 天前
基于 Docker 部署 Kafka(KRaft + SASL/PLAIN 认证)
docker·容器·kafka
KD1 天前
设计模式——责任链模式实战,优雅处理Kafka消息
后端·设计模式·kafka
原神启动12 天前
Kafka详解
分布式·kafka
一只懒鱼a2 天前
搭建kafka集群(安装包 + docker方式)
运维·容器·kafka
青春不流名2 天前
如何在Kafka中使用SSL/TLS证书认证
分布式·kafka·ssl