引言
进入工业物联网(IIoT)时代,如何把海量时序数据用起来、挖出新价值,已经成为企业推进数字化转型的关键一环。以后产生的数据规模会持续激增。在这样的背景下,怎样在多集群、跨地域的场景下实现数据高效、稳定同步,也就成了必须解决的难题。
Apache IoTDB 是一款专门面向时序数据场景打造的开源数据库,它自带的 Pipe 数据同步功能,采用 "抽取 - 处理 - 发送" 三段式设计,能够以毫秒级的延迟完成数据复制和灾备,很好地应对了跨节点、跨区域的数据同步需求。
Apache IoTDB 时序数据库【系列篇章】:
本文将从Pipe机制的工作原理,讲解IoTDB数据同步的全流程操作。涵盖功能概述、任务管理、插件扩展,友友们可参考并构建高可靠、低延迟的时序数据同步链路。
1. 功能概述
1.1 Pipe三阶段架构
一个数据同步任务包含 3 个阶段:

抽取(Source)阶段:该部分用于从源 IoTDB 抽取数据,在 SQL 语句中的 source 部分定义
处理(Process)阶段:该部分用于处理从源 IoTDB 抽取出的数据,在 SQL 语句中的 processor 部分定义
发送(Sink)阶段:该部分用于向目标 IoTDB 发送数据,在 SQL 语句中的 sink 部分定义
通过 SQL 语句声明式地配置 3 个部分的具体内容,可实现灵活的数据同步能力。目前数据同步支持以下信息的同步,您可以在创建同步任务时对同步范围进行选择(默认选择 data.insert,即同步新写入的数据)

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,关闭元数据自动创建功能。
-
开启元数据同步时,不支持使用自定义插件。
-
在进行数据同步任务时,请避免执行任何删除操作,防止两端状态不一致。
2. 创建任务
数据同步任务有三种状态:RUNNING、STOPPED 和 DROPPED
任务状态转换图:

创建后任务会直接启动,同时当任务发生异常停止后,系统会自动尝试重启任务。
使用 CREATE PIPE 语句来创建一条数据同步任务,下列属性中PipeId和sink必填,source和processor为选填项,输入 SQL 时注意 SOURCE与 SINK 插件顺序不能替换。
示例:
sql
CREATE PIPE [IF NOT EXISTS] <PipeId> -- PipeId 是能够唯一标定任务的名字
-- 数据抽取插件,可选插件
WITH SOURCE (
[<parameter> = <value>,],
)
-- 数据处理插件,可选插件
WITH PROCESSOR (
[<parameter> = <value>,],
)
-- 数据连接插件,必填插件
WITH SINK (
[<parameter> = <value>,],
)
IF NOT EXISTS 语义:用于创建操作中,确保当指定 Pipe 不存在时,执行创建命令,防止因尝试创建已存在的 Pipe 而导致报错。
注意:V2.0.8-beta 起,创建一个全量数据同步 Pipe (例如 Pipeid : alldatapipe)时,系统会自动将其拆分为两个独立的 Pipe:
历史 Pipe:PipeId 为原名称加 _history后缀(如 alldatapipe_history),source 参数默认携带 'realtime.enable'='false', 'inclusion'='data.insert', 'inclusion.exclusion'=''
实时 Pipe:PipeId 为原名称加 _realtime后缀(如 alldatapipe_realtime),source 参数默认携带 'history.enable'='false' ,若配置了元数据同步,则由实时 Pipe 负责发送
创建成功后,原 PipeId(如 alldatapipe)将不再作为有效标识符。在进行启动、停止、删除、查看等任务操作时,必须使用拆分后的独立 PipeId(即 *_history或 *_realtime)
3. 开始与停止任务
语法
sql
START PIPE<PipeId>
示例
启动任务,使用START PIPE语句手动启动任务
sql
START PIPE Beijing_To_Shanghai;
停止任务,使用STOP PIPE语句暂停任务
sql
STOP PIPE Beijing_To_Shanghai;
状态监控
使用SHOW PIPES命令查看所有任务
sql
SHOW PIPES;
结果
text
+---------------------+---------+---------------------+---------------------+
| PipeName | Status | CreateTime | LastActiveTime |
+---------------------+---------+---------------------+---------------------+
| Beijing_To_Shanghai | RUNNING | 2025-09-27 08:30:00 | 2025-09-27 08:35:22 |
+---------------------+---------+---------------------+---------------------+
如果需要查看特定任务,使用SHOW PIPE语句获取信息
sql
SHOW PIPE Beijing_To_Shanghai;
4. 删除和查看任务
4.1 删除任务
语法
sql
DROP PIPE [IF EXISTS] <PipeId>
示例
删除任务,使用DROP PIPE语句删除任务
sql
DROP PIPE IF EXISTS Beijing_To_Shanghai;
强制清理,使用CLEAN_EXPIRED_DATA清理过期数据
sql
CALL CLEAN_EXPIRED_DATA();
IF EXISTS 语义:用于删除操作中,确保当指定 Pipe 存在时,执行删除命令,防止因尝试删除不存在的 Pipe 而导致报错。
删除任务不需要先停止同步任务。
4.1 删除任务
语法
查看所有任务
sql
SHOW PIPES
查看指定任务
sql
SHOW PIPE <PipeId>
结果示例
text
+--------------------------------+-----------------------+-------+----------+-------------+-----------------------------------------------------------+----------------+-------------------+-------------------------+
| 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:同步任务的状态
PipeSource:同步数据流的来源
PipeProcessor:同步数据流在传输过程中的处理逻辑
PipeSink:同步数据流的目的地
ExceptionMessage:显示同步任务的异常信息
RemainingEventCount(统计存在延迟):剩余 event 数,当前数据同步任务中的所有 event 总数,包括数据和元数据同步的 event,以及系统和用户自定义的 event
EstimatedRemainingSeconds(统计存在延迟):剩余时间,基于当前 event 个数和 pipe 处速率,预估完成传输的剩余时间
5. 插件同步
了使得整体架构更加灵活以匹配不同的同步场景需求,支持在同步任务框架中进行插件组装。系统预置了一些常用插件可直接使用,同时也可以自定义 processor 插件 和 Sink 插件,并加载至 IoTDB 系统进行使用
查看系统中的插件(含自定义与内置插件)的语句
sql
SHOW PIPEPLUGINS
结果
text
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| |
+------------------------------+----------+--------------------------------------------------------------------------------------------------+----------------------------------------------------+
预置插件详细介绍

总结
Apache IoTDB的Pipe数据同步机制通过三阶段架构实现了高效、可靠的数据复制能力。从基本配置到高级调优,从单机部署到云边协同,本文详细解析了数据同步的全流程操作。通过六大实战案例与最佳实践,帮助读者构建高可用、低延迟的时序数据同步链路。
随着物联网技术的不断发展,IoTDB将持续演进,提供更加智能、高效的数据管理能力。通过持续关注IoTDB的最新发展,企业可以始终保持在时序数据管理领域的技术领先地位,实现数字化转型的深度需求。