

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确保边侧和云侧的数据完全一致(包括全量数据、元数据和权限)。
咱们逐个看每个集群的配置:
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,实际部署时要填正确的地址
)
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的部署情况
)
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同步过来的数据。

咱们分两步配置:
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,实际地址按需改
)
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参数主要用来配置数据抽取的相关规则,比如同步范围、数据路径、时间范围等,具体如下表:
| 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插件,适合大多数数据同步场景,参数如下:
| 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相关的配置,具体如下:
| 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 是一款工业物联网时序数据库管理系统,采用端边云协同的轻量化架构,支持一体化的物联网时序数据收集、存储、管理与分析 ,具有多协议兼容、超高压缩比、高通量读写、工业级稳定、极简运维等特点。
| 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/,如果相关下载没有跳转,请查看这个地址,相关链接没有跳转,皆是抄袭本文,转载请备注本文原地址。

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

