RocketMQ Connect介绍与使用

335 阅读7分钟

目录:

1、背景

2、Connect应运而生

3、怎么使用 connecct

4、如何自己开发一个 connect

5、现状与未来

 

1、背景

数据迁移

在我们的业务系统中,数据是我们的核心生产力,由于业务不断升级

所以不免会有一些数据迁移的场景

需要将数据从源数据源迁移到目标数据源,

包括单一数据类型的迁移,还有异构数据类型的迁移

比如如下数据库的迁移:

image.png

 

mysql 数据迁移

可以使用 mysqldump 工具或者其他类似 navicat、datagrip 等直接导出为 SQL 文件

canal

canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave,向 MySQL master 发送 dump 协议

redis 数据迁移

redis shake

 

mongodb 数据迁移

mongoexport

mongoimport

 

elasticsearch 数据迁移

cos 快照:数据量 大(TB,PB),对迁移速度要求较高

logstash:可以对数据进行一些处理,全量,增量同步

elasticsearch dump 数据量较小的场景  

构建数据管道

 

将数据从来源经过抽取、转换、加载至目标端

CDC

Change Data Capture 变更数据捕获, 比如 mysql 基于日志的 CDC 就是要开启 mysql binary log。

 

Data Warehouse 数据仓库

 

提供所有类型数据支持的集合。统一源数据中所有矛盾之处,如字段的同名异义、异名同义、单位不统一、字长不一致。一般有相对明确的数据结构

建立数仓的主要目的是为分析性报告和决策支持目的而创建。

实现方案如 apche hive

 

数据湖

 

可以存储任意格式数据(结构化和非结构化)的存储中心,范围比数据仓库更广泛

可以存储关系型数据库中的数据,也可以 存储半结构化数据(如csv、日志、xml、json),非结构化数据(如email,文档、PDF)和二进制数据(如图像、音频、视频),对接多种计算分析平台,根据业务场景不同,可以选择相应的计算引擎对数据湖中存储的数据进行数据处理与分析,从而打破孤岛,挖掘业务价值

实现方案如 apache hudi、delta lake

LakeHouse(湖仓一体)

湖仓一体是一种新型开放式架构,将数据湖和数据仓库的优势充分结合,它构建在数据湖低成本的数据存储架构之上,又继承了数据仓库的数据处理和管理功能。    

 

详细介绍:www.databricks.com/blog/2020/0…

 

如上所述,面对越来越多的数据源,我们的开发成本、维护成本不断提升,这显然不符合我们的愿景,所以 connect 应运而生

2、Connect 应运而生

对于数据迁移,不需要针对每一种数据源查找对应的数据迁移组件

有一个 connect 就搞定了,不管是 mysql 数据迁移还是 es 迁移,还是 mongo 迁移,

只要启动对应的 connector,就可以利用 connect 实现数据迁移,对于构建数据管道也是同样的道理,rocketmq 作为中介,利用 sourcetask 数据从源数据源流向 rocketmq,sinktask 作为消费者,处理接收到的数据,将数据发送到目标数据源,两条数据管道就建成了

image.png

 

Connector

定义数据从哪复制到哪,如果是从源数据系统读取数据写入 RocketMQ,这种是 SourceConnector,如果是从 RocketMQ 读数据写入到目标系统,这种是 SinkConnector。Connector 决定需要创建任务的数量,从 Worker 接收传入的配置再传递给任务。  

Task

它是 Connector 任务分片的最小分配单位,是实际将数据源复制数据到 RocketMQ(SourceTask),或者将数据从 RocketMQ 读取数据写入到目标系统(SinkTask)真正的执行者,Task 是无状态的可以动态的启停任务,多个 Task 是可以并行执行的,Connector 复制数据的并行度主要体现在 Task 数量上。

Worker

worker 进程是 Connector 和 Task 运行环境,它提供 RESTful 能力,接受 HTTP 请求,将获取到的配置传递给 Connector 和 Task。 除此之外它还负责启动 Connector 和 Task,保存 Connector 配置信息,保存 Task 同步数据的位点信息,负载均衡能力,Connect 集群高可用,扩缩容,故障处理主要依赖 Worker 的负载均衡能力实现的。

 

3、怎么使用 Connect?

 

启动 Runtime

因为 connect 是依赖 rocketmq 的,所以我们在启动 connect 之前先启动 rocketmq

connect 的运行环境是 runtime,

分为单机版和集群版 runtime

单机版可以在我们自己测试 connect 或者对可用性要求不高的情况下使用

常用的 还是集群版,可以支持任务的高可用和负载

 

比如我们想迁移 es 数据,从一个 es 集群到另外一个 es 集群,这时需要启动 es source connector 和 es sinkconnector

将 es connect 模块进行打包,在 runtime 启动的时候配置 pluginpath,指向打包后的 es connect jar,这样在启动的时候我们就会加载 jar 包中的 es source connector 和 sink connector

 

以单机版为例:

构建connect:

 

git clone github.com/apache/rock…

cd  rocketmq-connect

mvn -Prelease-connect -DskipTests clean install -U

将打包好的connect jar放入connectorPlugin文件夹

配置pluginPath

pluginPaths=/home/root/connectorPlugin

 

运行worker:

cd distribution/target/rocketmq-connect-0.0.1-SNAPSHOT/rocketmq-connect-0.0.1-SNAPSHOT

 

sh bin/connect-standalone.sh -c conf/connect-standalone.conf &

 

启动 SourceConnector 和 SinkConnector

connect 提供了丰富的 http 接口,例如启动 connector,停止 connector,查看集群信息,查看某个 connector 的任务

详细的接口大家可以看源码中的 Resthandler, 如果大家感觉现有的接口不满足需求,也可以提交 pr 添加对应的 http 接口

 

启动 connect 之后,connector 会启动对应的任务 ,比如 sourceconnector 会启动从来源数据库拉取数据的任务,通过 schema 组装好对应的数据 ConnectRecord,如果配置了 transform,也会进行相应的处理,然后发送到 rocketmq,

 

启动 sinkconnector 之后,会启动一个消费者,从 rocketmq connector 对应的 topic,从 rocketmq 拉取数据之后经过 schema,converter,transform 之后,又拿到了对应的 connectrecord,然后把数据保存到目标数据库

 

以源码中rocketmq-connect-sample中的fileconnector为例:

github.com/apache/rock…

 

启动SourceConnector:

touch test-source-file.txt

echo "Hello \r\nRocketMQ\r\n Connect" >> test-source-file.txt

curl -X POST -H "Content-Type: application/json" http://127.0.0.1:8082/connectors/fileSourceConnector -d '{"connector.class":"org.apache.rocketmq.connect.file.FileSourceConnector","filename":"test-source-file.txt","connect.topicname":"fileTopic"}'

启动SinkConnector:

curl -X POST -H "Content-Type: application/json" http://127.0.0.1:8082/connectors/fileSinkConnector -d '{"connector.class":"org.apache.rocketmq.connect.file.FileSinkConnector","filename":"test-sink-file.txt","connect.topicnames":"fileTopic"}'

 

cat test-sink-file.txt

 

断点续传

从数据来源查询数据之后,在组装数据的时候设置offset信息,如果任务莫名中断下次启动connector可以接着上次的位点进行传输数据

4、如何自己开发一个 Connect?

SourceConnector

自定义SourceConnector,需要实现的核心api有:

/**
 * Return the current connector class
 *
 * @return task implement class
 */
public abstract Class<? extends Task> taskClass();

 

返回实现的SourceTask

 

/**
 * Start the component
 *
 * @param config component context
 */
void start(KeyValue config);

 

启动connector

 

/**
 * Stop the component.
 */
void stop();

停止connector

 

/**
 * Returns a set of configurations for Tasks based on the current configuration,
 * producing at most count configurations.
 *
 * @param maxTasks maximum number of configurations to generate
 * @return configurations for Tasks
 */
public abstract List<KeyValue> taskConfigs(int maxTasks);

返回配置信息

 

SinkConnector

 

与SourceConnector实现的api相同

Converter

  主要负责数据的序列化与反序列化

在启动SourceConnector或者SinkConnector的,需要指定key.converter和value.converter,

比如我们指定value.converter为org.apache.rocketmq.connect.runtime.converter.record.json.JsonConverter,数据在发送到rocketmq之前会先经过JsonConverter进行数据转换,然后将对应的json数据发送到Rocket MQ,当启动SinkConnector的时候,同样配置value.converter为org.apache.rocketmq.connect.runtime.converter.record.json.JsonConverter,当sink端作为消费者接收数据的时候,同样会经过JsonConverter把数据还原为原始数据ConnectRecord

 

如果现有的converter不满足我们的业务需求,我们同样可以自定义converter

 

Transform

 

如果我们想要对数据做一些转换,比如过滤掉不需要的字段,替换数据key,可以使用connect内置的一些transform,如果内置的transform不满足业务 需求,也可以自定义transform

Metric

统计connect运行中的指标信息

指标详情信息参见:

org.apache.rocketmq.connect.runtime.metrics.ConnectMetricsTemplates

 

详细api参见:github.com/apache/rock…

将所有的指标发送到RocketMQ

 

5、现状与未来

 

目前已经支持 cassandra、debezium、deltalake、http、hudi、jdbc、jms等connector,详细的可以参考源码github.com/apache/rock…

rocketmq connect在官网的文档和源码中的README.md 内容更详细,有兴趣的可以去看看

欢迎大家一起参与到 connect 的贡献当中 ,一起交流 connect