2 minutes
Kafka Connect Design Kip
早期的设计
最早的设计可以看: KIP-26 - Add Kafka Connect framework for data import/export,
通过kip, 可以发现, connect设计的目标是 导入和导出数据. 设计目标:
- 只聚焦数据处理
- 并行度的支持. 能够支持大量数据的拷贝
- 尽可能提供 准确一次的分发.
- 管理元数据
- 设计良好的connector api. 易于扩展
- 流式和批处理的支持
- Strandalone 和 集群的支持
为什么是基于 kafka 构建一套connect, 而不是其他框架呢?
- kafka 本身就有并行度的概念
- kafka 本身良好的 容错能力, 使得编码简单
- kafka 提供了 准确一次、最多一次、最少一次
除此之外, 其他的框架 本身也是从一个具体的case进行 泛化, 不能很好的利用kafka本身的优势。 学习成本和复杂度很高. 部分依赖于 yarn, 对于大集群是好处, 但是应该是 利用而不是依赖. 最后, 其他框架的技术栈 和 kafka 不匹配.
那么, 为什么 kafka-connect 和 kafka 放在一起呢?
- 文档入口友好度
- 生态化. 在使用kafka的时候, 不需要到处找其他框架的connector
- 更好的集成kafka相关的接口
模块设计
设计上, kafka connect 主要有一下三个模块:
- 数据模型的定义. 和 kafka 使用byteArray 不一样. 数据模型将 序列化/反序列化作为可插拔的组件. 模型定义是 schema.
- 与外部系统交互的 connector 定义. connector负责切分数据(监听外部系统变化更新数据切分), task 负责生产和消费 records
- worker模型. connector执行模式、coordination、配置存储、offset 存储、offset commit 管理. 负责任务的负载均衡, 以及 rest 接口支持. Strandalone 和 分布式模式
关于数据存储:
主要存储的对象: 用户提供的connector配置、connector生产的task配置、offset数据. 目前主要是 本地文件 和 kafka/zk 两种实现方式, 对应 standalone 和 分布式模式.
kafka sink 直接复用 offset. kafka source 在 offset 数据上需要添加一些元信息.
分发保证:
kafka connect 支持 三种不同的分发模式. 至少一次、最多一次、准确一次.
- 至少一次: source connector, producer 支持 flush; sink connector, consumer 本身支持 offset 提交
- 最多一次: 机制和上面类似, 但是可以通过缓存一批数据 进行提交
- 准确一次: source connector, 通过 幂等producer 实现; sink connector, 可以借助于 topic + partition + offset 实现
进程管理和集群资源管理
connect 框架不负责 进程的 开始/暂停/重启. 可以利用yarn/mesos/k8s, 或者不需要其他框架. 使用方式:
- kafka connector 作为一个服务. 进程管理可以通过 Chef/Puppet/Ansible/Salt 实现, connecotor 通过 rest api 提交.
- 资源管理 connector. 通过 mesos/yarn/k8s/Slider/Marathon 管理
- standalone 模式
- 嵌入式模式. 提供了嵌入式 api
例子
jdbc、hdfs、log 和 mirror make
接口
cli: standalone 和 cluster 模式分两种 rest api: embedded api:
反对方案
- kafka connect 是和 kafka 放在一起的. 接口更加一致, 管理更加方便
- 不使用第三方的流处理框架: kafka-connect 如果使用 流处理框架, 那么 流处理实现会很复杂, 涉及 source/sink. 而且, 流处理框架不会太关心 kafka-connect
- 不支持 push-based source connectors. 针对任务调度变得复杂,集成其他第三方数据源 也复杂.
229 Words
2019-11-02 23:31 +0800