Kafka Topic动态迁移 (源代码解析)
总结下自己在尝试Kafka分区迁移过程中对这部分知识的理解,请路过高手指正。
关于Kafka数据迁移的具体步骤指导,请参考如下链接:http://www.cnblogs.com/dycg/p/3922352.html原文作者写的非常清晰。
本文主要侧重自己对相关Kafka源代码的理解:
generateAssignment()函数 (对应上述链接原文中的 --generate 参数)产生新的迁移计划,输出格式为Json字符串;
executeAssignment ()函数(对应上述链接原文中的 --execute 参数)并不是真正执行分区数据迁移,他只是将上面生成的迁移计划保存到ZK中,路径为 /admin/reassign_partitions
Broker controller在启动或者重新选举时,会初始化一个ZK Watch --- 针对/admin/reassign_partition的监听(PartitionsReassignedListener);
我们通过命令行启动一次新的Topic数据迁移,会触发这个Listener,,从而使得Broker Controller开始迁移操作。
在处理Topic迁移事件之前,Controller会做一下预检,以下两种情况将不被迁移:
a. 某个Partition正在被迁移;
b. 该Topic已经列入被删除(Delete)之列;
关于Kafka数据迁移的步骤,具体实现在 kafka controller中的onPartitionReassignment()函数:
在详细介绍迁移步骤之前,先解释三个术语:
RAR: 新的replica位置映射(replica[Topic+Partition] <--> Broker, 以下同。)
OAR: 原来的replica位置映射 AR: 目前的replica位置映射
Kafka (Topic)Partition迁移步骤:
<1> Kafka Controller首先会将存储在ZK中的AR信息更新为 RAR+OAR, 然后为每个partition更新leaderEpoch和ISR; <2> 接下来Controller会等待RAR中所有的replica都完成与各自leader的同步,并将RAR中所有的replica设为在线状态; <3> 两种条件下需要重新进行Replica Leader选举: a. 如果RAR中不包含一个Partition的Replica Leader; b. 或者RAR中包含这个Partition的Replica Leader, 但是Leader所在的Broker挂掉了。 <4> 将OAR-RAR得到的差集中所有Replica(被迁移到其他Broker节点上的源replica)设为Offline,ZK中的ISR信息也会自动剔除Offline Replica; <5> 将第四步中处于(OAR-RAR)的Replica设为不存在状态(NonExistentReplica),最终触发相关replica的物理删除; <6> ZK中的AR信息被更新为 RAR; <7> 从ZK中/admin/reassign_partitions路径删除这个Partition; <8> 告知Brokers更新Metadata ( leaderEpoch之类 );
Kafka Topic动态迁移 (源代码解析)的更多相关文章
- jdk的动态代理源代码解析
先看一下JDK的动态是怎么用的. package dynamic.proxy; import java.lang.reflect.InvocationHandler; import java.lang ...
- Spring源代码解析
Spring源代码解析(一):IOC容器:http://www.iteye.com/topic/86339 Spring源代码解析(二):IoC容器在Web容器中的启动:http://www.itey ...
- Spring源代码解析(收藏)
Spring源代码解析(收藏) Spring源代码解析(一):IOC容器:http://www.iteye.com/topic/86339 Spring源代码解析(二):IoC容器在Web容器中的 ...
- (三)kafka集群扩容后的topic分区迁移
kafka集群扩容后的topic分区迁移 kafka集群扩容后,新的broker上面不会数据进入这些节点,也就是说,这些节点是空闲的:它只有在创建新的topic时才会参与工作.除非将已有的partit ...
- kafka java动态获取topic并动态创建消费者
1.获取所有topic package com.example.demo; import java.io.IOException; import java.util.List; import org. ...
- kafka topic制定规则
kafka topic的制定,我们要考虑的问题有很多,比如生产环境中用几备份.partition数目多少合适.用几台机器支撑数据量,这些方面如何去考量?笔者根据实际的维护经验,写一些思考,希望大家指正 ...
- MyBatis官方教程及源代码解析——mapper映射文件
缓存 1.官方文档 MyBatis 包括一个非常强大的查询缓存特性,它能够非常方便地配置和定制. MyBatis 3 中的缓存实现的非常多改进都已经实现了,使得它更加强大并且易于配置. 默认情况下是没 ...
- OpenStack之虚机热迁移代码解析
OpenStack之虚机热迁移代码解析 话说虚机迁移分为冷迁移以及热迁移,所谓热迁移用度娘的话说即是:热迁移(Live Migration,又叫动态迁移.实时迁移),即虚机保存/恢复(Save/Res ...
- redis之字符串命令源代码解析(二)
形象化设计模式实战 HELLO!架构 redis命令源代码解析 在redis之字符串命令源代码解析(一)中讲了get的简单实现,并没有对 ...
随机推荐
- 旨在脱离后端环境的前端开发套件 - IDT Server篇
IDT,一个基于Nodejs的,旨在脱离后端环境的前端开发套件,目的就是能让前端开发完全脱离后端的环境,无论后端是什么模板引擎(主流),都能应付自如. IDT主要包括两大部分:Server + Bui ...
- HDU3487 Play With Chains(Splay)
很裸的Splay,抄一下CLJ的模板当作复习,debug了一个下午,收获是终于搞懂了以前看这个模板里不懂的内容.以前用这个模板的时候没有看懂为什么get函数返回的前缀要加个引用,经过一下午的debug ...
- GCD常用方法
1.延迟操作 2.一次性代码 3.队列组 /** * 延迟执行 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC ...
- UITextField中文搜索
导入头文件 #import "ChineseInclude.h"#import "PinYinForObjc.h" NSMutableArray *search ...
- 能够将 HTML 表格转换成图表的jQuery插件:Chartinator
点这里 一个jQuery 插件能够将HTML 表格转换成图表,使用 Google Charts 实现. Chartinator当前支持以下特性: Creation of the following c ...
- CXF+Spring 搭建的WebService
1.创建类 2.接口编写 package com.fan; import javax.jws.WebService; @WebService public interface IHelloWorld ...
- Mysql统计总结 - 最近30天,昨天的数据统计
-- 最近30天的医说发布数量SELECT substr(a.feed_publish_time,6, 5) AS '日期', count(*) AS '医说数' FROM xm_feed a WHE ...
- IDA 与VC 加载符号表
将Windbg路径下的symsrv.yes 拷贝到ida 的安装目录,重新分析ntoskrnl.exe, 加载本地的符号表 添加环境变量 变量名:_NT_SYMBOL_PATH变量值:SRV*{$P ...
- vim使用详解
1 插入类命令 i // 在当前字符前插入 I // 在当前行首插入 a // 在当前字符后写入 A ...
- 微软VSS的超级BUG
发现问题:今天一个新同事,无意中发现他直接就登录进VSS了,并且还是“admin”用户: 解决问题:于是开始在网上找度娘和谷歌帮忙,真是不查不要紧,一查吓一跳,VSS本身就存在这个bug,并且是一个超 ...