介绍
kafka-connect是一个工具,用来在kafka和外部数据存储系统之间移动数据,kafka-connect可以简单快捷地将数据从kafka导入或导出,数据范围涵盖了关系型数据库、日志、度量数据、Hadoop、数据仓库、NoSql数据存储、ES等。
kafka-connet 内置jetty web 服务提供多个restful endpoint 管理connetor。
本文针对有kafka connector 使用经验的开发者阅读。介绍分布式启动类ConnectDistributed源码逻辑,感兴趣的同学可以对源码进行调试分析。
架构分析
worker: kafka connect 进程,管理多个connecter & task 线程
connector: 管理connector运行状态
task: 实际执行数据导入与导出的任务
endpoints: 提供http接口创建,修改,删除connector&task
connect-offsets: 内置主题用于保存任务抽取时kafka主题offset
connect-configs:内置主题用于保存connector配置信息
connect-status:内置主题用于保存connector&task 运行状态
kafka connect 采用多进程+多线程的设计方式来运行数据导入导出任务,配置信息运行信息通过kafka 主题进行存储。
代码分析
启动入口类ConnectDistributed
进入 ConnectDistributed 启动主类发现main方法逻辑并不复杂主要做了两件事
- 加载配置文件
- 启动connect
复杂的逻辑封装在startConnect方法中。
由于startConnector方法过长下面会逐块进行分析,避免篇幅过长只分析内部功能忽略具体细节。
图中每个红框代表具体的功能将按照顺序进行解析
- 通过配置文件加载kafka-connect 插件,例如debezuim 用来cdc监控mysql,sqlserver, oracle等数据的插件
- 初始化restserver 此处为jetty web 服务端
- 初始化kafka 网络请求客户端主要用于kafka 主题的管理例如:查询,创建等
- 创建connect-offsets主题读取器,读取器会启动一个线程同步connect-offsets中commit信息
- 创建woker 并初始化但并未创建connector&task
- 创建connect-status主题读取器,同样启动一个线程同步connect-status状态信息
- 创建connect-configs主题读取器,同样启动一个线程同步connect-configs配置信息
- 通过connect类启动DistributedHerder,DistributedHerder实现了runnable接口并被提交到线程池中执行
Connect类start方法主要做了两件事
- 启动herder线程
- 初始化jetty http endpoint 例如 /connectors等 路径
herder start 内部将自己提交到线程池并启动,因为实现了runnable接口因此run方法中为启动逻辑
startServices方法中会启动线程进行配置更新
startServices内部启动图
启动connector&task的逻辑在tick()方法中执行,
handleRebalanceCompleted方法中startWork()开启connector&task
- 获取connector 配置并创建connector
- 获取task 配置并创建task
- 通过worker 启动connector & task
总结
由于内部技术细节过多不在一一展开,关于kafka 消费者coordinator的逻辑不在本次分析范围,以后将分析kafka更多的技术细节