总结下自己在尝试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动态迁移 (源代码解析)的更多相关文章

  1. jdk的动态代理源代码解析

    先看一下JDK的动态是怎么用的. package dynamic.proxy; import java.lang.reflect.InvocationHandler; import java.lang ...

  2. Spring源代码解析

    Spring源代码解析(一):IOC容器:http://www.iteye.com/topic/86339 Spring源代码解析(二):IoC容器在Web容器中的启动:http://www.itey ...

  3. Spring源代码解析(收藏)

    Spring源代码解析(收藏)   Spring源代码解析(一):IOC容器:http://www.iteye.com/topic/86339 Spring源代码解析(二):IoC容器在Web容器中的 ...

  4. (三)kafka集群扩容后的topic分区迁移

    kafka集群扩容后的topic分区迁移 kafka集群扩容后,新的broker上面不会数据进入这些节点,也就是说,这些节点是空闲的:它只有在创建新的topic时才会参与工作.除非将已有的partit ...

  5. kafka java动态获取topic并动态创建消费者

    1.获取所有topic package com.example.demo; import java.io.IOException; import java.util.List; import org. ...

  6. kafka topic制定规则

    kafka topic的制定,我们要考虑的问题有很多,比如生产环境中用几备份.partition数目多少合适.用几台机器支撑数据量,这些方面如何去考量?笔者根据实际的维护经验,写一些思考,希望大家指正 ...

  7. MyBatis官方教程及源代码解析——mapper映射文件

    缓存 1.官方文档 MyBatis 包括一个非常强大的查询缓存特性,它能够非常方便地配置和定制. MyBatis 3 中的缓存实现的非常多改进都已经实现了,使得它更加强大并且易于配置. 默认情况下是没 ...

  8. OpenStack之虚机热迁移代码解析

    OpenStack之虚机热迁移代码解析 话说虚机迁移分为冷迁移以及热迁移,所谓热迁移用度娘的话说即是:热迁移(Live Migration,又叫动态迁移.实时迁移),即虚机保存/恢复(Save/Res ...

  9. redis之字符串命令源代码解析(二)

    形象化设计模式实战             HELLO!架构                     redis命令源代码解析 在redis之字符串命令源代码解析(一)中讲了get的简单实现,并没有对 ...

随机推荐

  1. 通过Docker配置DNS服务器

    1. 概述 DockerHub中的 sameersbn/bind 镜像提供了搭建DNS服务器的功能,本文给出使用该镜像搭建DNS服务器的例子. 2. 环境 DNS服务器主机 IP:10.11.150. ...

  2. HTML5 webSQL

    https://www.ibm.com/developerworks/cn/web/1108_zhaifeng_websqldb/   <!DOCTYPE HTML> <html&g ...

  3. solr的collection,shard,replica,core概念

    一.collection 1.由多个cores组成一个逻辑索引叫做一个collection.一个collection本质上是一个可以跨越多个核的索引,同时包含冗余索引. 2.collection由不同 ...

  4. Leetcode: strStr()

    Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle ...

  5. 安装mysql之后,存入中文出现乱码 02

    现在出现这个问题,将编码字符串改成utf8 之后 数据表 还是不能存储中文. 看如下两张图,应该会有启发: 这下应该明白了吧.

  6. Maven的配置文件pom.xml

    Maven的配置文件pom.xml 简介: 什么是POM? POM是项目对象模型(Project Object Model)的简称,它是Maven项目中的文件,使用XML表示,名称叫做pom.xml. ...

  7. MongoDB (三) MongoDB 安装

    MongoDB安装在Windows上 在 Windows上,首先要安装 MongoDB下载最新发布的MongoDB: http://www.mongodb.org/downloads 确保得到正确的版 ...

  8. PushBackInputStream与PushBackInputStreamReader的用法

    举个例子:获取XX内容 PushBackInputStream pb=new PushBackInputStream(in,4);//4制定缓冲区大小 byte[] buf=new byte[4]; ...

  9. Shell脚本基础I

    1.Linux shell类型 /bin/sh--已经被/bin/bash所取代 /bin/bash--就是Linux预设的shell /bin/ksh--由AT&T Bell lab发展出来 ...

  10. 如何用crontab运行一个图形化界面的程序

    crontab是linux中定时任务的 执行crontab -e可以编辑定时列表(export DISPLAY=:0 指定显示器或者export DISPLAY=localhost:0) 15 13 ...