欢迎光临
我们一直在努力

Apache IoTDB 数据同步完全指南:从功能到实战,手把手教你搭建工业物联网数据链路

在这里插入图片描述在这里插入图片描述

Apache IoTDB 数据同步完全指南:从功能到实战,手把手教你搭建工业物联网数据链路

本文围绕工业物联网场景下 IoTDB 数据同步展开,先介绍其核心功能 —— 通过抽取(Source)、处理(Process)、发送(Sink)三阶段,结合 SQL 配置实现数据、元数据、权限等多范围同步,同时说明元数据与权限同步的限制条件。接着详解任务管理,包括创建、启停、删除、查看任务的 SQL 操作,以及同步插件类型与使用方法。随后提供全量同步、部分同步、边云传输、级联传输、压缩同步、加密同步六大实战示例,给出配置文件调整建议与关键参数说明,助力用户根据业务场景搭建数据链路,满足内网外网互通、数据迁移备份等需求。

在这里插入图片描述

在工业物联网(IIoT)场景里,数据同步绝对是个绕不开的核心需求。毕竟要实现不同IoTDB之间的数据共享,搭建起完整的数据链路,才能满足内网外网互通、端边云协同、数据迁移备份这些实际业务场景的需求。今天这篇文章,就带大家从头到尾把IoTDB数据同步的事儿捋清楚,从功能原理到实际操作,每个环节都讲明白,就算是刚接触的朋友,跟着做也能搞定数据同步任务。

一、 功能概述

1.1 数据同步

在这里插入图片描述

咱们先搞明白,一个数据同步任务到底是怎么跑起来的?其实它主要分三个阶段,咱们一步一步说:

  • 抽取(Source)阶段:简单说就是从源IoTDB里把数据“捞”出来,具体要怎么捞、捞哪些,在SQL语句的source部分定义就行。
  • 处理(Process)阶段:捞出来的数据可能不是直接能用的,这个阶段就是对这些数据做处理,比如筛选、转换之类的,对应的配置在SQL语句的processor部分。
  • 发送(Sink)阶段:处理好的数据总不能一直放在那,这个阶段就是把数据送到目标IoTDB里去,怎么送、送到哪,在SQL语句的sink部分设置。

通过SQL语句把这三个阶段的内容明明白白配置好,就能灵活实现数据同步了。目前IoTDB支持的同步范围还挺多的,创建任务时可以自己选,默认是同步新写入的数据(也就是data.insert)。具体能同步哪些内容,看下面这个表就清楚了:

同步范围同步内容说明
all 所有范围 包含数据、元数据、权限等所有可同步内容
data(数据) insert(增量) 同步新写入的数据,比如实时采集的新数据
delete(删除) 同步被删除的数据,确保两端数据删除操作一致
schema(元数据) database(数据库) 同步数据库的创建、修改或删除操作,比如新建一个数据库
timeseries(时间序列) 同步时间序列的定义和属性,比如某个传感器对应的时间序列配置
TTL(数据到期时间) 同步数据的存活时间,超过这个时间的数据会被自动清理
auth(权限) 同步用户权限和访问控制,比如某个用户的查询、写入权限

1.2 功能限制及说明

虽然元数据(schema)和权限(auth)同步很实用,但用的时候也有几个限制得注意,不然可能会出问题:

  • 用元数据同步时,Schema region和ConfigNode的共识协议必须是默认的ratis协议。怎么判断呢?打开iotdb-system.properties配置文件,看看里面有没有config_node_consensus_protocol_class=org.apache.iotdb.consensus.ratis.RatisConsensus和schema_region_consensus_protocol_class=org.apache.iotdb.consensus.ratis.RatisConsensus这两行,如果没有,那就是默认用的ratis协议,没问题;如果有,只要这两行对应的类是对的,也可以。
  • 为了避免数据冲突,开启元数据同步后,一定要把接收端的自动创建元数据功能关掉。操作也简单,修改iotdb-system.properties配置文件里的enable_auto_create_schema配置项,把它设为false就行。
  • 开启元数据同步的时候,可不能用自定义插件,这点一定要记牢,不然同步过程可能会出各种报错。
  • 另外,在跑数据同步任务的时候,尽量别执行删除操作,不然很容易导致源端和目标端的数据状态不一致,后面排查问题会很麻烦。

二、使用说明

数据同步任务有三种状态:RUNNING(运行中)、STOPPED(已停止)和DROPPED(已删除)。任务创建好之后会自动启动,要是过程中因为异常停了,系统也会自动尝试重启,这点还挺省心的。

在这里插入图片描述

下面就给大家介绍怎么用SQL语句管理这些同步任务,每个操作都有具体的例子,跟着做就行。

2.1 创建任务

创建数据同步任务用的是CREATE PIPE语句,这里有几个关键点要注意:PipeId和sink是必须填的,source和processor可选;还有,输入SQL的时候,SOURCE和SINK插件的顺序可不能搞反了,不然任务创建会失败。

给大家举个SQL示例,一看就懂:

CREATE PIPE [IF NOT EXISTS] <PipeId> — PipeId是任务的唯一名字,比如A2B,不能和其他任务重复
— 数据抽取插件,可选,要是不用自定义的,这部分可以不写
WITH SOURCE (
[<parameter> = <value>,], — 比如配置抽取数据的时间范围、路径等参数
)
— 数据处理插件,可选,不用的话也可以省略
WITH PROCESSOR (
[<parameter> = <value>,], — 比如配置数据过滤、转换的规则
)
— 数据连接插件,必须填,不然不知道要把数据送到哪
WITH SINK (
[<parameter> = <value>,], — 比如配置目标IoTDB的地址、端口等
)

这里面IF NOT EXISTS的作用也得说一下,加上它之后,只有当指定的Pipe不存在的时候,才会执行创建命令。要是你不小心想创建一个已经存在的Pipe,也不会报错,能避免不少误操作。

2.2 开始任务

任务创建好之后,要是之前停了,或者想手动启动,用下面这条语句就行,特别简单:

START PIPE <PipeId> — 把<PipeId>换成你要启动的任务名字,比如START PIPE A2B

2.3 停止任务

有时候可能需要暂停任务,比如要修改配置,这时候就用停止命令:

STOP PIPE <PipeId> — 同样,把<PipeId>换成实际的任务名,比如STOP PIPE A2B

2.4 删除任务

要是某个任务不用了,想彻底删掉,就用DROP PIPE语句,而且不用先停止任务,直接删就行:

DROP PIPE [IF EXISTS] <PipeId> — 比如DROP PIPE IF EXISTS A2B

这里的IF EXISTS和创建任务时的IF NOT EXISTS类似,只有当指定的Pipe存在的时候,才会执行删除操作,避免因为删一个不存在的任务而报错。

2.5 查看任务

创建好任务之后,怎么看任务的状态、配置这些信息呢?有两个命令可以用:

  • 查看所有任务,用SHOW PIPES,执行之后会列出所有同步任务的详细信息;
  • 查看某个特定任务,就用SHOW PIPE <PipeId>,只显示你指定的那个任务的信息。

给大家看个SHOW PIPES的结果示例,每个字段代表什么意思都标清楚了:

+——————————–+———————–+——-+———-+————-+———————————————————–+—————-+——————-+————————-+
| ID| CreationTime| State|PipeSource|PipeProcessor| PipeSink|ExceptionMessage|RemainingEventCount|EstimatedRemainingSeconds|
+——————————–+———————–+——-+———-+————-+———————————————————–+—————-+——————-+————————-+
|59abf95db892428b9d01c5fa318014ea|2024-06-17T14:03:44.189|RUNNING| {}| {}|{sink=iotdb-thrift-sink, sink.ip=127.0.0.1, sink.port=6668}| | 128| 1.03|
+——————————–+———————–+——-+———-+————-+———————————————————–+—————-+——————-+————————-+

各列的含义咱们逐个说:

  • ID:同步任务的唯一标识符,每个任务都不一样,就像身份证号;
  • CreationTime:任务创建的时间,精确到毫秒,能清楚知道任务是什么时候建的;
  • State:任务当前的状态,是RUNNING、STOPPED还是DROPPED,一看就知道;
  • PipeSource:同步数据流的来源,比如是哪个IoTDB,配置了哪些抽取参数;
  • PipeProcessor:数据在传输过程中的处理逻辑,要是没配置处理插件,这里就是空的;
  • PipeSink:数据流的目的地,也就是目标IoTDB的配置,比如地址、端口、用的哪个sink插件;
  • ExceptionMessage:要是任务出了异常,这里会显示异常信息,方便排查问题;
  • RemainingEventCount:还没处理的event数量,这里要注意,统计可能会有延迟。这个event包括数据、元数据同步的event,还有系统和用户自定义的event;
  • EstimatedRemainingSeconds:预估完成剩余数据传输还需要的时间,也是基于当前event个数和处理速率算出来的,同样存在统计延迟。

2.6 同步插件

为了适应不同的同步场景,IoTDB支持在同步任务框架里组装插件。系统已经预置了一些常用的插件,直接就能用;另外,你也可以自己写processor插件和Sink插件,写完之后加载到IoTDB里就能用了,灵活性特别高。

想看看系统里有哪些插件(包括自定义的和内置的),执行SHOW PIPEPLUGINS命令就行,返回的结果大概是这样的:

IoTDB> SHOW PIPEPLUGINS
+——————————+———-+————————————————————————————————–+—————————————————-+
| PluginName|PluginType| ClassName| PluginJar|
+——————————+———-+————————————————————————————————–+—————————————————-+
| DO-NOTHING-PROCESSOR| Builtin| org.apache.iotdb.commons.pipe.plugin.builtin.processor.donothing.DoNothingProcessor| |
| DO-NOTHING-SINK| Builtin| org.apache.iotdb.commons.pipe.plugin.builtin.connector.donothing.DoNothingConnector| |
| IOTDB-SOURCE| Builtin| org.apache.iotdb.commons.pipe.plugin.builtin.extractor.iotdb.IoTDBExtractor| |
| IOTDB-THRIFT-SINK| Builtin| org.apache.iotdb.commons.pipe.plugin.builtin.connector.iotdb.thrift.IoTDBThriftConnector| |
| IOTDB-THRIFT-SSL-SINK| Builtin| org.apache.iotdb.commons.pipe.plugin.builtin.connector.iotdb.thrift.IoTDBThriftSslConnector| |
+——————————+———-+————————————————————————————————–+—————————————————-+

下面给大家详细介绍这些预置插件,包括适用版本和各自的特点,方便大家根据场景选择:

类型自定义插件插件名称介绍适用版本
source 插件 不支持 iotdb-source 默认的抽取插件,不管是IoTDB的历史数据还是实时数据,都能抽出来 1.2.x
processor 插件 支持 do-nothing-processor 默认的处理插件,不对传入的数据做任何处理,适合不需要加工数据的场景 1.2.x
sink 插件 支持 do-nothing-sink 不对要发送的数据做任何处理,一般用得少,主要做测试或者特殊场景 1.2.x
支持 iotdb-thrift-sink V1.3.1及以上版本的默认sink插件,用于两个1.2.0及以上版本的IoTDB之间传数据。用的是Thrift RPC框架,多线程async non-blocking IO模型,传输性能特别好,尤其是目标端是分布式的时候,用这个插件准没错 1.2.x
支持 iotdb-thrift-ssl-sink 用于1.3.1及以上版本和1.2.0及以上版本的IoTDB之间传数据。同样基于Thrift RPC框架,但用的是单线程sync blocking IO模型,最大的特点是安全,适合对数据传输安全性要求高的场景 1.3.1+

要是你想导入自定义插件,可以参考流处理框架相关的章节,里面有详细的步骤说明。

三、使用示例

光说理论不够,咱们结合实际场景给几个例子,大家跟着练一遍,很快就能上手。

3.1 全量数据同步

这个例子是把一个IoTDB里的所有数据,完整同步到另一个IoTDB里。比如你有两个IoTDB,A是源端,B是目标端,要把A的所有数据都传到B,该怎么操作呢?

在这里插入图片描述

首先,咱们创建一个叫A2B的同步任务,这里要用到sink的iotdb-thrift-sink插件(系统内置的,不用自己装)。关键是要通过node-urls配置目标端B的DataNode节点的数据服务端口url,具体的SQL语句是这样的:

create pipe A2B — 任务名A2B,清楚知道是A同步到B
with sink (
'sink'='iotdb-thrift-sink', — 指定用iotdb-thrift-sink这个sink插件
'node-urls' = '127.0.0.1:6668', — 这里填的是目标端B的DataNode数据服务端口url,根据实际情况改
)

执行完这条SQL,任务就创建好了,而且会自动启动,开始把A的全量数据往B同步。

3.2 部分数据同步

有时候不需要同步所有数据,比如只同步某个历史时间范围内的数据。这个例子就教大家怎么同步2023年8月23日8点到2023年10月23日8点之间的数据,同样是从A同步到B。

在这里插入图片描述

首先还是创建A2B这个任务,但这次要在source里定义清楚传输数据的范围。因为同步的是历史数据(也就是任务创建之前就存在的数据),所以得配置start-time(开始时间)、end-time(结束时间),还有传输模式mode。目标端的配置和全量同步类似,还是用node-urls指定B的DataNode端口。

具体的SQL语句如下,每个参数的意思都标出来了:

create pipe A2B — 任务名还是A2B,方便识别
WITH SOURCE (
'source'= 'iotdb-source', — 指定用默认的iotdb-source抽取插件
'realtime.mode' = 'stream', — 这个参数是配置任务创建后,新插入数据的抽取模式,这里用stream模式
'start-time' = '2023.08.23T08:00:00+00:00', — 同步的开始时间,包含这个时间点的数据
'end-time' = '2023.10.23T08:00:00+00:00' — 同步的结束时间,同样包含这个时间点的数据
)
with SINK (
'sink'='iotdb-thrift-async-sink', — 指定sink插件,这里用iotdb-thrift-async-sink
'node-urls' = '127.0.0.1:6668', — 目标端B的DataNode数据服务端口url,根据实际情况修改
)

执行这条SQL后,任务就会只同步指定时间范围内的历史数据,不会同步这个时间段之外的数据,精准满足需求。

3.3 边云数据传输

在工业物联网里,边云协同是很常见的场景,比如多个边缘端的IoTDB(B、C、D)要把数据同步到云端的IoTDB(A)。这种情况下该怎么配置呢?

在这里插入图片描述

核心思路是在B、C、D分别创建同步任务,往A同步数据,而且要配置path限制同步范围,还要用inclusion=all确保边侧和云侧的数据完全一致(包括全量数据、元数据和权限)。

咱们逐个看每个集群的配置:

  • B同步到A:在B的IoTDB上执行下面的SQL,创建BA这个任务(BA代表B到A):
  • create pipe BA — 任务名BA,明确是B同步到A
    with source (
    'inclusion'='all', — 同步全量数据、元数据和权限,保证边云数据一致
    'path'='root.db.**', — 限制同步的路径范围,这里是root.db下的所有数据,根据实际业务改
    )
    with sink (
    'sink'='iotdb-thrift-sink', — 用iotdb-thrift-sink插件
    'node-urls' = '127.0.0.1:6667', — 云端A的DataNode数据服务端口url,实际部署时要填正确的地址
    )

  • C同步到A:在C的IoTDB上执行,创建CA任务:
  • create pipe CA — 任务名CA,C到A
    with source (
    'inclusion'='all', — 同样同步全量内容
    'path'='root.db.**', — 路径范围根据实际情况调整
    )
    with sink (
    'sink'='iotdb-thrift-sink',
    'node-urls' = '127.0.0.1:6668', — 云端A的另一个DataNode端口,也可以和上面一样,看A的部署情况
    )

  • D同步到A:在D的IoTDB上执行,创建DA任务:
  • create pipe DA — 任务名DA,D到A
    with source (
    'inclusion'='all', — 全量同步
    'path'='root.db.**', — 路径范围按需调整
    )
    with sink (
    'sink'='iotdb-thrift-sink',
    'node-urls' = '127.0.0.1:6669', — 云端A的DataNode端口,根据实际情况填写
    )

    这样配置之后,B、C、D三个边缘集群的数据就会分别同步到云端的A集群,实现边云数据协同。

    3.4 级联数据传输

    除了边云同步,级联传输也很常见,比如数据要从A集群同步到B集群,再从B同步到C集群,形成一条数据链路。这种情况下,关键是要在B到C的任务里配置forwarding-pipe-requests为true,让B能转发从A同步过来的数据。

    在这里插入图片描述

    咱们分两步配置:

  • A同步到B:在A的IoTDB上创建AB任务,把A的数据传到B:
  • create pipe AB — 任务名AB,A到B
    with sink (
    'sink'='iotdb-thrift-sink', — 用iotdb-thrift-sink插件
    'node-urls' = '127.0.0.1:6668', — B集群的DataNode数据服务端口url,实际地址按需改
    )

  • B同步到C:在B的IoTDB上创建BC任务,这里要注意配置forwarding-pipe-requests参数:
  • create pipe BC — 任务名BC,B到C
    with source (
    'forwarding-pipe-requests' = 'true' — 这个参数设为true,B才会把从A同步来的数据转发给C
    )
    with sink (
    'sink'='iotdb-thrift-sink',
    'node-urls' = '127.0.0.1:6669', — C集群的DataNode数据服务端口url,实际地址按需改
    )

    这样一来,A的数据先到B,B再把这些数据转发给C,实现了级联数据传输。

    3.5 压缩同步

    数据同步的时候,要是数据量大,传输起来会很费时间,还占带宽。IoTDB支持在同步过程中对数据进行压缩,只要配置compressor参数就行,能有效节省带宽,提高传输效率。

    目前compressor支持snappy、gzip、lz4、zstd、lzma2这5种压缩算法,还可以选多种算法组合,按配置的顺序依次压缩。另外,V1.3.3及以后版本还支持rate-limit-bytes-per-second参数,用来限制每秒最大传输的字节数(按压缩后的字节算),要是设为小于0的值,就表示不限制。

    给大家举个例子,创建一个叫A2B的压缩同步任务:

    create pipe A2B — 任务名A2B
    with sink (
    'node-urls' = '127.0.0.1:6668', — 目标端的DataNode端口url,实际地址改一下
    'compressor' = 'snappy,lz4' — 这里选了snappy和lz4两种算法,先snappy压缩,再lz4压缩
    )

    要是想限制传输速率,比如每秒最多传102400字节,可以加个参数:

    create pipe A2B
    with sink (
    'node-urls' = '127.0.0.1:6668',
    'compressor' = 'snappy,lz4',
    'rate-limit-bytes-per-second' = 102400 — 限制每秒传输102400字节
    )

    3.6 加密同步

    要是数据传输的网络不安全,很容易被窃取。IoTDB支持用SSL加密来保障同步过程中的数据安全,只要配置好SSL相关的参数,比如证书地址(ssl.trust-store-path)和密码(ssl.trust-store-pwd)就行。

    比如创建一个叫A2B的加密同步任务,SQL语句是这样的:

    create pipe A2B — 任务名A2B
    with sink (
    'sink'='iotdb-thrift-ssl-sink', — 要用支持SSL的sink插件,也就是iotdb-thrift-ssl-sink
    'node-urls'='127.0.0.1:6667', — 目标端的DataNode端口url,实际地址改一下
    'ssl.trust-store-path'='pki/trusted', — 连接目标端需要的trust store证书路径,填实际的路径
    'ssl.trust-store-pwd'='root' — 证书的密码,填实际的密码
    )

    这样配置之后,数据在传输过程中就会用SSL加密,安全性大大提高。

    四、注意事项

    在使用数据同步功能的时候,有些配置参数可以通过修改IoTDB的配置文件(iotdb-system.properties)来调整,比如同步数据的存储目录、线程数这些。下面给大家列一些常用的配置,主要是V1.3.3及以上版本的,方便大家根据实际需求调整:

    4.1 同步数据存储目录(pipe_receiver_file_dir)

    这个参数用来设置同步数据的存储目录,配置的时候有几种情况:

    • 要是没设置这个参数,系统会把数据存在IoTDB文件夹下的默认相对路径里,也就是%IOTDB_HOME%/${cn_system_dir}/pipe/receiver;
    • 要是填的是绝对路径,数据就存在这个绝对路径指向的位置;
    • 要是填的是相对路径,数据就存在IoTDB文件夹下这个相对路径的位置;
    • 注意:要是把pipe_receiver_file_dir设为空字符串,会按相对路径处理。

    另外,Windows和Linux平台对路径的判断不一样:

    • Windows平台:如果路径前缀是驱动器标识符加“\\”(比如C:\\),或者前缀是“\\\\”,那就是绝对路径,否则是相对路径;
    • Linux平台:如果路径前缀是“/”,就是绝对路径,否则是相对路径。

    默认配置(Linux平台):

    pipe_receiver_file_dir=data/confignode/system/pipe/receiver

    4.2 插件目录(pipe_lib_dir)

    这个参数用来配置插件的存放目录,取消注释就能配置,生效模式是first_start(第一次启动时生效)。同样分Windows和Linux平台:

    • Windows平台:路径前缀是驱动器标识符加“\\”或“\\\\”,就是绝对路径,否则是相对路径;
    • Linux平台:路径前缀是“/”,就是绝对路径,否则是相对路径。

    默认配置(Linux平台):

    pipe_lib_dir=ext/pipe

    4.3 线程数配置(pipe_subtask_executor_max_thread_num)

    这个参数是PipeSubtaskExecutor中可用于执行pipe子任务的最大线程数,实际使用的线程数会取这个参数值和“CPU核心数/2”(最小是1)中的较小值。生效模式是restart(重启后生效),数据类型是int,默认值是5:

    pipe_subtask_executor_max_thread_num=5

    要是你的服务器CPU核心数多,同步任务比较多,可以适当调大这个值,提高处理效率;要是CPU资源紧张,就别调太大,避免占用太多资源。

    4.4 连接超时时间(pipe_sink_timeout_ms)

    这个参数是thrift客户端的连接超时时间,单位是毫秒,生效模式是restart,数据类型是int,默认值是900000(15分钟):

    pipe_sink_timeout_ms=900000

    要是目标端网络不太稳定,连接容易超时,可以适当调大这个值;要是网络很好,也可以调小一点,加快超时判断。

    4.5 Sink相关配置

    • pipe_sink_selector_number:sink中可使用的最大选择器数量,建议设为小于或等于pipe_sink_max_client_number的值,生效模式是restart,数据类型是int,默认值是4:pipe_sink_selector_number=4
    • pipe_sink_max_client_number:sink中可使用的最大客户端数量,生效模式是restart,数据类型是int,默认值是16:pipe_sink_max_client_number=16

    这两个参数可以根据同步任务的并发量调整,并发高的话可以适当调大,提高传输效率。

    4.6 传输速率限制(pipe_all_sinks_rate_limit_bytes_per_second)

    这个参数用来限制所有pipe sink每秒总共能传输的字节数,要是设为小于或等于0的值,就表示不限制,默认值是-1(不限制)。生效模式是hot_reload(热加载,不用重启就能生效),数据类型是double:

    pipe_all_sinks_rate_limit_bytes_per_second=-1

    要是担心同步数据占用太多带宽,影响其他业务,可以把这个参数设为合适的值,比如设为1024000(每秒最多传1MB)。

    五、参数说明

    前面讲了很多例子和配置,下面给大家系统梳理一下source和sink的关键参数,包括参数的描述、取值范围、是否必填、默认值,方便大家查阅和配置。

    5.1 source 参数

    source参数主要用来配置数据抽取的相关规则,比如同步范围、数据路径、时间范围等,具体如下表:

    参数描述value 取值范围是否必填默认取值
    source 指定用哪个source插件,目前只有iotdb-source可选 String: iotdb-source 必填
    inclusion 用来指定同步范围,包括数据、元数据、权限这些 String: all, data(insert,delete), schema(database,timeseries,ttl), auth 选填 data.insert
    inclusion.exclusion 从inclusion指定的范围里排除某些操作,减少同步的数据量 String: all, data(insert,delete), schema(database,timeseries,ttl), auth 选填 空字符串
    mode.streaming 指定时序数据写入的捕获来源,只在mode.streaming为false的模式下生效,决定inclusion中data.insert数据的捕获方式。有两种策略:true:动态选择,根据下游处理速度自适应,优先保证延迟和吞吐量的平衡,适合大多数场景;false:固定按批捕获,只抓TsFile文件的封口请求,适合资源紧张的场景。注意:pipe启动时捕获的快照数据只会以文件方式供下游处理 Boolean: true / false true
    mode.strict 用time/path/database-name/table-name参数过滤数据时,是否严格按条件筛选:true:严格筛选,只保留符合条件的数据;false:非严格筛选,可能包含额外数据,适合对性能敏感的场景 Boolean: true / false true
    mode.snapshot 决定时序数据的捕获方式,影响inclusion中的data数据:true:静态捕获,启动pipe时一次性抓快照数据,快照消费完后pipe自动终止(会自动执行DROP PIPE);false:动态捕获,除了快照数据,还会持续抓后续的变更,pipe一直运行 Boolean: true / false false
    path 当sql_dialect为tree时可以指定(升级上来的pipe默认是tree),决定数据的捕获范围,影响data数据和部分元数据。只要数据的树模型路径能匹配上,就会被筛选出来 String: IoTDB标准的树路径模式,可以带通配符(比如root.db.**) 选填 root.**
    start-time 同步数据的开始event时间,包含这个时间点的数据 Long: [Long.MIN_VALUE, Long.MAX_VALUE] 选填 Long.MIN_VALUE
    end-time 同步数据的结束event时间,包含这个时间点的数据 Long: [Long.MIN_VALUE, Long.MAX_VALUE] 选填 Long.MAX_VALUE
    forwarding-pipe-requests 是否转发其他Pipe(通常是数据同步)写入的数据 Boolean: true, false 选填 true

    这里特别说一下mode.streaming取值true和false的差异,大家根据场景选:

    • true(推荐):实时处理和发送数据,特点是时效性高,但吞吐量相对低一点;
    • false:批量处理和发送(按底层数据文件),时效性低,但吞吐量高,适合大数据量、对时效要求不高的场景。

    5.2 sink 参数

    sink参数主要配置数据发送的相关信息,比如目标端地址、用的插件、压缩方式、加密配置等。常用的sink插件有iotdb-thrift-sink和iotdb-thrift-ssl-sink,咱们分别介绍它们的参数。

    5.2.1 iotdb-thrift-sink 参数

    这个插件是常用的sink插件,适合大多数数据同步场景,参数如下:

    参数描述value 取值范围是否必填默认取值
    sink 指定用iotdb-thrift-sink或iotdb-thrift-async-sink插件 String: iotdb-thrift-sink 或 iotdb-thrift-async-sink 必填
    node-urls 目标端IoTDB的任意多个DataNode节点的数据服务端口url,注意不能转发到自身服务 String. 例子:‘127.0.0.1:6667,127.0.0.1:6668’、‘127.0.0.1:6667’ 必填
    user/username 连接目标端的用户名,这个用户得有相应的操作权限(比如写入权限) String 选填 root
    password 对应的用户密码 String 选填 root
    batch.enable 是否开启日志攒批发送模式,开启后能提高传输吞吐,降低IOPS Boolean: true, false 选填 true
    batch.max-delay-seconds 开启攒批模式后生效,一批数据发送前的最长等待时间,单位是秒 Integer 选填 1
    batch.size-bytes 开启攒批模式后生效,一批数据的最大攒批大小,单位是字节 Long 选填 1610241024(16MB)
    compressor 选择rpc压缩算法,可以配置多个,按顺序压缩 String: snappy / gzip / lz4 / zstd / lzma2 选填 “”(不压缩)
    compressor.zstd.level 当compressor选zstd时,配置zstd的压缩等级 Int: [-131072, 22] 选填 3
    rate-limit-bytes-per-second 每秒最大允许传输的字节数(按压缩后的算),小于0表示不限制 Double: [Double.MIN_VALUE, Double.MAX_VALUE] 选填 -1
    load-tsfile-strategy 文件同步时,接收端请求返回发送端前,是否等接收端本地load tsfile执行完:sync:等执行结果返回;async:不等 String: sync / async 选填 sync
    format 数据传输的payload格式,有三种选择:hybrid:按processor传递的格式(tsfile或tablet),不转换;tsfile:强制转成tsfile发送,适合数据备份;tablet:强制转成tablet发送,适合发送端和接收端数据类型不完全兼容的场景 String: hybrid / tsfile / tablet 选填 hybrid
    5.2.2 iotdb-thrift-ssl-sink 参数

    这个插件支持SSL加密,适合对数据安全要求高的场景,大部分参数和iotdb-thrift-sink一样,差异主要在SSL相关的配置,具体如下:

    参数描述value 取值范围是否必填默认取值
    sink 指定用iotdb-thrift-ssl-sink插件 String: iotdb-thrift-ssl-sink 必填
    node-urls 和iotdb-thrift-sink一样,目标端DataNode的url,不能转发到自身 String. 例子:‘127.0.0.1:6667,127.0.0.1:6668’ 必填
    user/username 连接目标端的用户名,需有相应权限 String 选填 root
    password 对应密码 String 选填 root
    batch.enable 和iotdb-thrift-sink一致 Boolean: true, false 选填 true
    batch.max-delay-seconds 和iotdb-thrift-sink一致 Integer 选填 1
    batch.size-bytes 和iotdb-thrift-sink一致 Long 选填 1610241024
    compressor 和iotdb-thrift-sink一致 String: snappy / gzip / lz4 / zstd / lzma2 选填 “”
    compressor.zstd.level 和iotdb-thrift-sink一致 Int: [-131072, 22] 选填 3
    rate-limit-bytes-per-second 和iotdb-thrift-sink一致 Double: [Double.MIN_VALUE, Double.MAX_VALUE] 选填 -1
    load-tsfile-strategy 和iotdb-thrift-sink一致 String: sync / async 选填 sync
    ssl.trust-store-path 连接目标端DataNode需要的trust store证书路径 String. 例子:‘pki/trusted’ 必填
    ssl.trust-store-pwd 对应的trust store证书密码 Integer 必填
    format 和iotdb-thrift-sink一致 String: hybrid / tsfile / tablet 选填 hybrid

    到这里,IoTDB数据同步的所有核心内容就都讲完了。从功能原理到实际示例,再到参数配置和注意事项,应该能帮大家全面掌握数据同步的用法。实际使用的时候,大家可以根据自己的业务场景,参考相应的示例和参数说明来配置,遇到问题可以看看异常信息,或者检查一下配置是否正确。要是还有其他疑问,也可以去IoTDB的官方文档或者社区里找答案。

    🌐 附:IoTDB的各大版本

    📄 Apache IoTDB 是一款工业物联网时序数据库管理系统,采用端边云协同的轻量化架构,支持一体化的物联网时序数据收集、存储、管理与分析 ,具有多协议兼容、超高压缩比、高通量读写、工业级稳定、极简运维等特点。

    版本IoTDB 二进制包IoTDB 源代码发布说明
    2.0.5 – All-in-one- AINode- SHA512- ASC – 源代码- SHA512- ASC release notes
    1.3.5 – All-in-one- AINode- SHA512- ASC – 源代码- SHA512- ASC release notes
    0.13.4 – All-in-one- Grafana 连接器- Grafana 插件- SHA512- ASC – 源代码- SHA512- ASC release notes

    ✨ 去获取:https://archive.apache.org/dist/iotdb/

    联系博主

        xcLeigh 博主全栈领域优质创作者,博客专家,目前,活跃在CSDN、微信公众号、小红书、知乎、掘金、快手、思否、微博、51CTO、B站、腾讯云开发者社区、阿里云开发者社区等平台,全网拥有几十万的粉丝,全网统一IP为 xcLeigh。希望通过我的分享,让大家能在喜悦的情况下收获到有用的知识。主要分享编程、开发工具、算法、技术学习心得等内容。很多读者评价他的文章简洁易懂,尤其对于一些复杂的技术话题,他能通过通俗的语言来解释,帮助初学者更好地理解。博客通常也会涉及一些实践经验,项目分享以及解决实际开发中遇到的问题。如果你是开发领域的初学者,或者在学习一些新的编程语言或框架,关注他的文章对你有很大帮助。

        亲爱的朋友,无论前路如何漫长与崎岖,都请怀揣梦想的火种,因为在生活的广袤星空中,总有一颗属于你的璀璨星辰在熠熠生辉,静候你抵达。

         愿你在这纷繁世间,能时常收获微小而确定的幸福,如春日微风轻拂面庞,所有的疲惫与烦恼都能被温柔以待,内心永远充盈着安宁与慰藉。

        至此,文章已至尾声,而您的故事仍在续写,不知您对文中所叙有何独特见解?期待您在心中与我对话,开启思想的新交流。


         💞 关注博主 🌀 带你实现畅游前后端!

         🏰 大屏可视化 🌀 带你体验酷炫大屏!

         💯 神秘个人简介 🌀 带你体验不一样得介绍!

         🥇 从零到一学习Python 🌀 带你玩转Python技术流!

         🏆 前沿应用深度测评 🌀 前沿AI产品热门应用在线等你来发掘!

         💦 注:本文撰写于CSDN平台,作者:xcLeigh(所有权归作者所有) ,https://xcleigh.blog.csdn.net/,如果相关下载没有跳转,请查看这个地址,相关链接没有跳转,皆是抄袭本文,转载请备注本文原地址。


    在这里插入图片描述

         📣 亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(或者关注下方公众号,看见后第一时间回复,还有海量编程资料等你来领!),博主看见后一定及时给您答复 💌💌💌

    赞(0)
    未经允许不得转载:171主机测评 » Apache IoTDB 数据同步完全指南:从功能到实战,手把手教你搭建工业物联网数据链路
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址