实时从TDengine数据库采集数据到Kafka Topic

发布于:2024-10-13 ⋅ 阅读:(17) ⋅ 点赞:(0)

一、认识TDengine

TDengine是一款高性能、高稳定性的开源时间序列数据库。它是由中国的PingCAP团队开发并开源的,旨在为大规模数据存储和实时分析提供解决方案。TDengine具有以下特点:

  • 高性能:TDengine使用了多种优化技术,如数据压缩、索引优化和并行计算,以实现高性能的数据写入和查询。它能够处理大规模的数据,并且在毫秒级的响应时间内提供查询结果。
  • 高稳定性:TDengine具有良好的容错和恢复机制,能够保证数据的持久性和可靠性。它支持数据的多副本备份和自动故障转移,以及数据一致性和完整性的检查。
  • 时间序列支持:TDengine专注于时间序列数据的存储和分析,能够高效地处理时间序列数据的写入、查询和聚合操作。它支持多种数据类型和数据模型,如数字、文本、地理位置和时间等。
  • 开源:TDengine是一个开源项目,遵循Apache 2.0许可证。用户可以自由地使用、修改和分发该软件,同时也可以参与到开发和改进过程中。
  • 总之,TDengine是一款专注于时间序列数据存储和分析的高性能、高稳定性的开源数据库,适用于大规模数据存储和实时分析的场景。

二、TDengine Kafka Connector

  • TDengine Kafka Connector 包含两个插件: TDengine Source Connector 和 TDengine Sink Connector。用户只需提供简单的配置文件,就可以将 Kafka 中指定 topic 的数据(批量或实时)同步到 TDengine, 或将 TDengine 中指定数据库的数据(批量或实时)同步到 Kafka。

三、什么是 Kafka Connect?

  • Kafka Connect 是 Apache Kafka 的一个组件,用于使其它系统,比如数据库、云服务、文件系统等能方便地连接到 Kafka。数据既可以通过 Kafka Connect 从其它系统流向 Kafka, 也可以通过 Kafka Connect 从 Kafka 流向其它系统。从其它系统读数据的插件称为 Source Connector, 写数据到其它系统的插件称为 Sink Connector。Source Connector 和 Sink Connector 都不会直接连接 Kafka Broker,Source Connector 把数据转交给 Kafka Connect。Sink Connector 从 Kafka Connect 接收数据。

在这里插入图片描述

TDengine Source Connector 用于把数据实时地从 TDengine 读出来发送给 Kafka Connect。TDengine Sink Connector 用于 从 Kafka Connect 接收数据并写入 TDengine。

在这里插入图片描述

四、前置条件

运行本教程中示例的前提条件。

  • Linux 操作系统
  • 已安装 Java 8 和 Maven
  • 已安装 Git、curl、vi
  • 已安装并启动 TDengine。

五、安装 TDengine Connector 插件

编译插件

git clone --branch 3.0 https://github.com/taosdata/kafka-connect-tdengine.git
cd kafka-connect-tdengine
mvn clean package -Dmaven.test.skip=true
unzip -d $KAFKA_HOME/components/ target/components/packages/taosdata-kafka-connect-tdengine-*.zip

以上脚本先 clone 项目源码,然后用 Maven 编译打包。打包完成后在 target/components/packages/ 目录生成了插件的 zip 包。把这个 zip 包解压到安装插件的路径即可。上面的示例中使用了内置的插件安装路径: $KAFKA_HOME/components/。

配置插件

将 kafka-connect-tdengine 插件加入 $KAFKA_HOME/config/connect-distributed.properties 配置文件 plugin.path 中

plugin.path=/usr/share/java,/opt/kafka/components

六、启动 Kafka

zookeeper-server-start.sh -daemon $KAFKA_HOME/config/zookeeper.properties

kafka-server-start.sh -daemon $KAFKA_HOME/config/server.properties

connect-distributed.sh -daemon $KAFKA_HOME/config/connect-distributed.properties

七、验证 kafka Connect 是否启动成功

输入命令:

curl http://localhost:8083/connectors

如果各组件都启动成功,会得到如下输出:

[]

八、TDengine Source Connector 的使用

TDengine Source Connector 的作用是将 TDengine 某个数据库某一时刻之后的数据全部推送到 Kafka。TDengine Source Connector 的实现原理是,先分批拉取历史数据,再用定时查询的策略同步增量数据。同时会监控表的变化,可以自动同步新增的表。如果重启 Kafka Connect, 会从上次中断的位置继续同步。

TDengine Source Connector 会将 TDengine 数据表中的数据转换成 InfluxDB Line 协议格式 或 OpenTSDB JSON 协议格式然后写入 Kafka。

下面的示例程序同步数据库 test 中的数据到主题 tdengine-test-meters。

九、添加 Source Connector 配置文件

vi source-demo.json

输入以下内容:

source-demo.json

{
  "name":"TDengineSourceConnector",
    "config":{
    "connector.class": "com.taosdata.kafka.connect.source.TDengineSourceConnector",
    "tasks.max": 1,
    "subscription.group.id": "source-demo",
    "connection.url": "jdbc:TAOS://127.0.0.1:6030",
    "connection.user": "root",
    "connection.password": "taosdata",
    "connection.database": "test",
    "connection.attempts": 3,
    "connection.backoff.ms": 5000,
    "topic.prefix": "tdengine",
    "topic.delimiter": "-",
    "poll.interval.ms": 1000,
    "fetch.max.rows": 100,
    "topic.per.stable": true,
    "topic.ignore.db": false,
    "out.format": "line",
    "data.precision": "ms",
    "key.converter": "org.apache.kafka.connect.storage.StringConverter",
    "value.converter": "org.apache.kafka.connect.storage.StringConverter"
    }
}

十、准备测试数据

准备生成测试数据的 SQL 文件。

prepare-source-data.sql

DROP DATABASE IF EXISTS test;
CREATE DATABASE test;
USE test;
CREATE STABLE meters (ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT) TAGS (location BINARY(64), groupId INT);

INSERT INTO d1001 USING meters TAGS('California.SanFrancisco', 2) VALUES('2018-10-03 14:38:05.000',10.30000,219,0.31000) \
            d1001 USING meters TAGS('California.SanFrancisco', 2) VALUES('2018-10-03 14:38:15.000',12.60000,218,0.33000) \
            d1001 USING meters TAGS('California.SanFrancisco', 2) VALUES('2018-10-03 14:38:16.800',12.30000,221,0.31000) \
            d1002 USING meters TAGS('California.SanFrancisco', 3) VALUES('2018-10-03 14:38:16.650',10.30000,218,0.25000) \
            d1003 USING meters TAGS('California.LosAngeles', 2)   VALUES('2018-10-03 14:38:05.500',11.80000,221,0.28000) \
            d1003 USING meters TAGS('California.LosAngeles', 2)   VALUES('2018-10-03 14:38:16.600',13.40000,223,0.29000) \
            d1004 USING meters TAGS('California.LosAngeles', 3)   VALUES('2018-10-03 14:38:05.000',10.80000,223,0.29000) \
            d1004 USING meters TAGS('California.LosAngeles', 3)   VALUES('2018-10-03 14:38:06.500',11.50000,221,0.35000);

使用 TDengine CLI, 执行 SQL 文件。

taos -f prepare-source-data.sql

十一、创建 Source Connector 实例

curl -X POST -d @source-demo.json http://localhost:8083/connectors -H "Content-Type: application/json"

十二、查看 topic 数据

使用 kafka-console-consumer 命令行工具监控主题 tdengine-test-meters 中的数据。一开始会输出所有历史数据, 往 TDengine 插入两条新的数据之后,kafka-console-consumer 也立即输出了新增的两条数据。 输出数据 InfluxDB line protocol 的格式。

kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic tdengine-test-meters

输出:

......
meters,location="California.SanFrancisco",groupid=2i32 current=10.3f32,voltage=219i32,phase=0.31f32 1538548685000000000
meters,location="California.SanFrancisco",groupid=2i32 current=12.6f32,voltage=218i32,phase=0.33f32 1538548695000000000
......

此时会显示所有历史数据。切换到 TDengine CLI, 插入两条新的数据:

USE test;
INSERT INTO d1001 VALUES (now, 13.3, 229, 0.38);
INSERT INTO d1002 VALUES (now, 16.3, 233, 0.22);

再切换回 kafka-console-consumer, 此时命令行窗口已经打印出刚插入的 2 条数据。

十三、unload 插件

测试完毕之后,用 unload 命令停止已加载的 connector。

查看当前活跃的 connector:

curl http://localhost:8083/connectors

如果按照前述操作,此时应有两个活跃的 connector。使用下面的命令 unload:

curl -X DELETE http://localhost:8083/connectors/TDengineSinkConnector
curl -X DELETE http://localhost:8083/connectors/TDengineSourceConnector

十四、性能调优

如果在从 TDengine 同步数据到 Kafka 的过程中发现性能不达预期,可以尝试使用如下参数提升 Kafka 的写入吞吐量。

  • 打开 KAFKA_HOME/config/producer.properties 配置文件。
  • 参数说明及配置建议如下:
参数 参数说明 设置建议
producer.type 此参数用于设置消息的发送方式,默认值为 sync 表示同步发送,async 表示异步发送。采用异步发送能够提升消息发送的吞吐量。 async
request.required.acks 参数用于配置生产者发送消息后需要等待的确认数量。当设置为1时,表示只要领导者副本成功写入消息就会给生产者发送确认,而无需等待集群中的其他副本写入成功。这种设置可以在一定程度上保证消息的可靠性,同时也能保证一定的吞吐量。因为不需要等待所有副本都写入成功,所以可以减少生产者的等待时间,提高发送消息的效率。 1
max.request.size 该参数决定了生产者在一次请求中可以发送的最大数据量。其默认值为 1048576,也就是 1M。如果设置得太小,可能会导致频繁的网络请求,降低吞吐量。如果设置得太大,可能会导致内存占用过高,或者在网络状况不佳时增加请求失败的概率。建议设置为 100M。 104857600
batch.size 此参数用于设定 batch 的大小,默认值为 16384,即 16KB。在消息发送过程中,发送到 Kafka 缓冲区中的消息会被划分成一个个的 batch。故而减小 batch 大小有助于降低消息延迟,而增大 batch 大小则有利于提升吞吐量,可根据实际的数据量大小进行合理配置。可根据实际情况进行调整,建议设置为 512K。 524288
buffer.memory 此参数用于设置生产者缓冲待发送消息的内存总量。较大的缓冲区可以允许生产者积累更多的消息后批量发送,提高吞吐量,但也会增加延迟和内存使用。可根据机器资源来配置,建议配置为 1G。 1073741824

十五、配置参考

通用配置

以下配置项对 TDengine Sink Connector 和 TDengine Source Connector 均适用。

  • name: connector 名称。
  • connector.class: connector 的完整类名, 如: com.taosdata.kafka.connect.sink.TDengineSinkConnector。
  • tasks.max: 最大任务数, 默认 1。
  • topics: 需要同步的 topic 列表, 多个用逗号分隔, 如 topic1,topic2。
  • connection.url: TDengine JDBC 连接字符串, 如 jdbc:TAOS://127.0.0.1:6030。
  • connection.user: TDengine 用户名, 默认 root。
  • connection.password :TDengine 用户密码, 默认 taosdata。
  • connection.attempts :最大尝试连接次数。默认 3。
  • connection.backoff.ms : 创建连接失败重试时间隔时间,单位为 ms。 默认 5000。

TDengine Source Connector 特有的配置

  • connection.database: 源数据库名称,无缺省值。
  • topic.prefix: 数据导入 kafka 时使用的 topic 名称的前缀。默认为空字符串 “”。
  • timestamp.initial: 数据同步起始时间。格式为’yyyy-MM-dd HH:mm:ss’,若未指定则从指定 DB 中最早的一条记录开始。
  • poll.interval.ms: 检查是否有新建或删除的表的时间间隔,单位为 ms。默认为 1000。
  • fetch.max.rows : 检索数据库时最大检索条数。 默认为 100。
  • query.interval.ms: 从 TDengine 一次读取数据的时间跨度,需要根据表中的数据特征合理配置,避免一次查询的数据量过大或过小;在具体的环境中建议通过测试设置一个较优值,默认值为 0,即获取到当前最新时间的所有数据。
  • out.format : 结果集输出格式。line 表示输出格式为 InfluxDB Line 协议格式,json 表示输出格式是 json。默认为 line。
  • data.precision: 使用 InfluxDB 行协议格式时,时间戳的精度。可选值为:
    • ms : 表示毫秒,
    • us : 表示微秒
    • ns : 表示纳秒。
  • topic.per.stable: 如果设置为 true,表示一个超级表对应一个 Kafka topic,topic的命名规则 <topic.prefix><topic.delimiter><connection.database><topic.delimiter>
    <stable.name>;如果设置为 false,则指定的 DB 中的所有数据进入一个 Kafka topic,topic 的命名规则为 <topic.prefix><topic.delimiter><connection.database>
  • topic.ignore.db: topic 命名规则是否包含 database 名称,true 表示规则为 <topic.prefix><topic.delimiter><stable.name>,false 表示规则为 <topic.prefix><topic.delimiter><connection.database><topic.delimiter><stable.name>,默认 false。此配置项在 topic.per.stable 设置为 false 时不生效。
  • topic.delimiter: topic 名称分割符,默认为 -。
  • read.method: 从 TDengine 读取数据方式,query 或是 subscription。默认为 subscription。
  • subscription.group.id: 指定 TDengine 数据订阅的组 id,当 read.method 为 subscription 时,此项为必填项。
  • subscription.from: 指定 TDengine 数据订阅起始位置,latest 或是 earliest。默认为 latest。

十六、更多内容

更多内容请参阅官网: