当前位置:首页 » 操作系统 » kafka源码分析

kafka源码分析

发布时间: 2025-04-23 03:57:41

‘壹’ 源码解析kafka删除topic

源码解析Kafka删除Topic的详细流程


本文将详细介绍在Kafka 0.8.2.2版本中删除Topic的过程,分为几个关键步骤。


删除步骤


1. 配置参数
要执行Topic删除,首先需要在Broker上配置delete.topic.enable为true,这是删除操作的必要条件。


2. 执行删除操作
在命令行中使用bin/kafka-topics.sh --zookeeper zk_host:port/chroot --delete --topic my_topic_name。若不设置该参数,Topic只是被标记为删除,数据不会真正清除,重启Kafka是清除数据的最佳策略。


涉及的关键类



  • PartitionStateMachine 管理分区状态,包括NonExistentPartition、NewPartition、OnlinePartition和OfflinePartition等。

  • ReplicaManager 负责管理副本操作,如读写和删除。

  • ReplicaStateMachine 副本状态机,控制副本的五种状态变化,如NewReplica、OnlineReplica等。

  • TopicDeletionManager 负责Topic删除的全局管理。


源码分析


删除流程分为四部分:



  1. 客户端命令影响

  2. 不配置delete.topic.enable的流程

  3. 配置delete.topic.enable的流程

  4. 手动删除


1. 客户端命令触发删除操作,创建Zookeeper节点。


2. 不配置delete.topic.enable时,Topic删除操作受监听器控制,仅标记删除,不执行数据清除。


3. 配置delete.topic.enable后,会检查某些条件(如副本故障、分区重分配等),然后更新删除任务队列并启动删除线程,彻底清除数据。


4. 手动删除Zookeeper节点和磁盘数据,但可能导致内存数据未清除,是否安全需进一步测试。


总结:


Kafka Topic的删除是基于Zookeeper的事件驱动模型。删除命令触发删除操作,涉及数据的清除包括解除监听、清理内存、磁盘副本的删除以及Zookeeper节点的移除。配置delete.topic.enable为true是确保数据完全清除的关键步骤。

‘贰’ 源码解析kafka删除topic

本文将详细解析Kafka中删除topic的具体实现与过程。以Kafka 0.8.2.2版本为例,主要涉及以下几个关键点:



### 1. 删除topic的步骤



删除一个topic需要完成以下两个关键步骤:





  1. 配置删除参数:确保`delete.topic.enable`参数在Broker端设置为`True`。




  2. 执行删除命令:使用`bin/kafka-topics.sh`命令,指定`--delete`选项和目标topic名称。





若不配置`delete.topic.enable`为`true`,虽然topic会被标记为删除状态,但其在Kafka Broker内存中的数据并未被清除。此时,最理想的策略是配置`delete.topic.enable`为`true`,然后重启Kafka服务。



### 2. 重要类介绍

涉及删除topic的几个关键类包括:





  1. **PartitionStateMachine**:代表分区的状态机,决定分区的当前状态和状态转移。其包含四种状态:NonExistentPartition、NewPartition、OnlinePartition和OfflinePartition。




  2. **ReplicaManager**:负责管理当前机器的所有副本,处理读写、删除等具体动作。读写过程中,先获取partition对象,再获取Replica对象,然后获取Log对象,通过其管理的Segment对象进行数据的写入和读取。




  3. **ReplicaStateMachine**:副本的状态机,决定副本的当前状态和状态之间的转移。一个副本可以处于以下状态:NewReplica、OnlineReplica、OfflineReplica、ReplicaDeletionStarted、ReplicaDeletionSuccessful和ReplicaDeletionIneligible。




  4. **TopicDeletionManager**:管理topic删除状态机,其通过`/admin/delete_topics`目录下的节点来执行删除命令。





### 3. 源码解析删除过程

删除topic的过程可以分为以下几个阶段:





  1. 客户端执行删除命令时,在`kafka-topics.sh`中调用`kafka-run-class.sh kafka.admin.TopicCommand`执行删除操作。




  2. 在不配置`delete.topic.enable`的情况下,整个删除流程会检查`delete.topic.enable`是否为`true`。若为`false`,则不会执行删除操作。若为`true`,则继续执行。




  3. 配置`delete.topic.enable`为`true`时,会停止删除topic,并处理三种特殊情况:副本下线、分区重新分配中和首选副本选举中。`enqueueTopicsForDeletion`方法更新需要删除的topic集合并激活删除线程。




  4. 删除线程`DeleteTopicsThread`的`doWork`方法中,`completeDeleteTopic`方法负责解除分区变更监听、删除Zookeeper中的具体节点信息、清理磁盘数据并更新内存数据结构,如从副本状态机中移除分区信息。




  5. 在首次清除过程中,删除线程`DeleteTopicsThread`的`doWork`方法中,Kafka执行了完整的日志删除流程。





### 4. 手动删除Zookeeper信息和磁盘数据

虽然手动删除Zookeeper的topic信息和磁盘数据可以实现删除操作,但可能会留下内存中的部分数据未清除。具体实施时需谨慎,以避免潜在的问题。



### 5. 总结

Kafka中topic的删除流程主要基于Zookeeper实现,通过创建`/admin/delete_topics`目录下的节点来触发删除命令。配置`delete.topic.enable`为`true`,并重启Kafka服务,可以确保topic信息被彻底删除。手动删除Zookeeper信息和磁盘数据虽可实现删除,但可能导致内存中的部分数据未清除,建议在实施前进行充分测试。

‘叁’ 一文解密Kafka,Kafka源码设计与实现原理剖析,真正的通俗易懂

Apache Kafka (简称Kafka )最早是由Linkedln开源出来的分布式消息系统,现在是Apache旗下的一个子项目,并且已经成为开册、领域应用最广泛的消息系统之 Kafka社区也非常活跃,从 版本开始, Kafka 的标语已经从“一个高吞吐量、分布式的消息系统”改为“一个分布式的流平台”
关于Kafka,我打算从入门开始讲起,一直到它的底层实现逻辑个原理以及源码,建议大家花点耐心,从头开始看,相信会对你有所收获。

作为 个流式数据平台,最重要的是要具备下面 个特点

消息系统:
消息系统 也叫作消息队列)主要有两种消息模型:队列和发布订Kafka使用消费组( consumer group )统 上面两种消息模型 Kafka使用队列模型时,它可以将处理 作为平均分配给消费组中的消费者成员

下面我们会从 个角度分析Kafka 的几个基本概念,并尝试解决下面 个问题

消息由生产者发布到 fk 集群后,会被消费者消费 消息的消费模型有两种:推送模型( pu和拉取模型( pull 基于推送模型的消息系统,由消息代理记录消费者的消费状态 消息代理在将消息推送到消费者后 标记这条消息为已消费

但这种方式无法很好地保证消息的处理语义 比如,消息代理把消息发送出去后,当消费进程挂掉或者由于网络原因没有收到这条消息时,就有可能造成消息丢失(因为消息代理已经 这条消息标记为自己消费了,但实际上这条消息并没有被实际处理) 如果要保证消息的处理语义,消息代理发送完消息后,要设置状态为“已发送”,只有收到消费者的确认请求后才更新为“已消费”,这就需要在消息代理中记录所有消息的消费状态,这种做法也是不可取的

Kafka每个主题的多个分区日志分布式地存储在Kafka集群上,同时为了故障容错,每个分区都会以副本的方式复制到多个消息代理节点上 其中一个节点会作为主副本( Leader ),其 节点作为备份副本( Follower ,也叫作从副本)

主副本会负责所有的客户端读写操作,备份副本仅仅从主副本同步数据 当主副本 IH 现在故障时,备份副本中的 副本会被选择为新的主副本 因为每个分区的副本中只有主副本接受读写,所以每个服务端都会作为某些分区的主副本,以及另外一些分区的备份副本这样Kafka集群的所有服务端整体上对客户端是负载均衡的

消息系统通常由生产者“pro ucer 消费者( co sumer )和消息代理( broke 大部分组成,生产者会将消息写入消息代理,消费者会从消息代理中读取消息 对于消息代理而言,生产者和消费者都属于客户端:生产者和消费者会发送客户端请求给服务端,服务端的处理分别是存储消息和获取消息,最后服务端返回响应结果给客户端

新的生产者应用程序使用 af aP oce 对象代表 个生产者客户端进程 生产者要发送消息,并不是直接发送给 务端 ,而是先在客户端 消息放入队列 然后 一个 息发送线程从队列中消息,以 盐的方式发送消息给服务端 Kafka的记 集器( Reco dACCUl'lUlato )负责缓存生产者客户端产生的消息,发送线程( Sende )负责读取 集器的批 过网络发送给服务端为了保证客户端 络请求 快速 应, Kafka 用选择器( Selecto 络连接 读写 理,使网络连接( Netwo kCl i.ent )处理客户端 络请求

追加消息到记录收集器时按照分区进行分组,并放到batches集合中,每个分区的队列都保存了将发送到这个分区对应节点上的 记录,客户端的发送线程可 只使用 Sende 线程迭 batches的每个分区,获取分区对应的主剧本节点,取出分区对应的 列中的批记录就可以发送消息了

消息发送线程有两种消息发送方式 按照分区直接发送 按照分区的目标节点发迭 假设有两台服务器, 题有 个分区,那么每台服务器就有 个分区 ,消息发送线程迭代batches的每个分 接往分区的主副本节点发送消息,总共会有 个请求 所示,我 先按照分区的主副本节点进行分组, 属于同 个节点的所有分区放在一起,总共只有两个请求做法可以大大减少网络的开销

消息系统由生产者 存储系统和消费者组成 章分析了生产者发送消息给服务端的过程,本章分析消费者从服务端存储系统读取生产者写入消息的过程 首先我 来了解消费者的 些基础知识

作为分布式的消息系统, Kafka支持多个生产者和多个消费者,生产者可以将消息发布到集群中不同节点的不同分区上;“肖费者也可以消费集群中多个节点的多个分区上的消息 写消息时,多个生产者可以 到同 个分区 读消息时,如果多个消费者同时读取 个分区,为了保证将日志文件的不同数据分配给不同的消费者,需要采用加锁 同步等方式,在分区级别的日志文件上做些控制

相反,如果约定“同 个分区只可被 个消费者处理”,就不需要加锁同步了,从而可提升消费者的处理能力 而且这也并不违反消息的处理语义:原先需要多个消费者处理,现在交给一个消费者处理也是可以的 3- 给出了 种最简单的消息系统部署模式,生产者的数据源多种多样,它们都统写人Kafka集群 处理消息时有多个消费者分担任务 ,这些消费者的处理逻辑都相同, 每个消费者处理的分区都不会重复

因为分区要被重新分配,分区的所有者都会发生变 ,所以在还没有重新分配分区之前 所有消费者都要停止已有的拉取钱程 同时,分区分配给消费者都会在ZK中记录所有者信息,所以也要先删ZK上的节点数据 只有和分区相关的 所有者 拉取线程都释放了,才可以开始分配分区

如果说在重新分配分区前没有释放这些信息,再平衡后就可能造成同 个分区被多个消费者所有的情况 比如分区Pl 原先归消费者 所有,如果没有释放拉取钱程和ZK节点,再平衡后分区Pl 被分配给消费者 了,这样消费者 和消费者 就共享了分区Pl ,而这显然不符合 fka 中关于“一个分区只能被分配给 个消费者”的限制条件 执行再平衡操作的步骤如下

如果是协调者节点发生故障,服务端会有自己的故障容错机制,选出管理消费组所有消费者的新协调者节,点消费者客户端没有权利做这个工作,它能做的只是等待一段时间,查询服务端是否已经选出了新的协调节点如果消费者查到现在已经有管理协调者的协调节点,就会连接这个新协调节,哉由于这个协调节点是服务端新选出来的,所以每个消费者都应该重新连接协调节点

消费者重新加入消费组,在分配到分区的前后,都会对消费者的拉取工作产生影响 消费者发送“加入组请求”之前要停止拉取消息,在收到“加入组响应”中的分区之后要重新开始拉取消息时,为了能够让客户端应用程序感知消费者管理的分区发生变化,在加入组前后,客户端还可以设置自定义的“消费者再平衡监听器”,以便对分区的变化做出合适的处理


热点内容
如何重启sim密码 发布:2025-04-25 17:24:59 浏览:285
mysql服务器怎么用 发布:2025-04-25 17:24:57 浏览:969
缓存与存储 发布:2025-04-25 17:14:59 浏览:741
sql中selectinto语句 发布:2025-04-25 17:14:14 浏览:219
pilpython安装 发布:2025-04-25 17:12:55 浏览:805
安卓手机usb偏好设置在哪里 发布:2025-04-25 17:02:53 浏览:575
梁箍筋加密区间 发布:2025-04-25 17:02:10 浏览:427
大同忘记密码找回多少钱 发布:2025-04-25 16:55:22 浏览:985
手机ip被加入黑名单限制访问 发布:2025-04-25 16:40:51 浏览:731
内网的服务器地址怎么查 发布:2025-04-25 16:29:32 浏览:926