拓冰建站拓冰建站
首页 / 资讯中心 / 正文

TDengine到Doris数据同步实践:DataX与DolphinScheduler调度

最近在帮一个物联网项目做数据中台改造碰到一条很典型的链路设备产生的时序数据全部落在 TDengine 里但业务分析侧希望把数据搬到 Doris 做更灵活的 OLAP 分析。中间要打通同步和调度我最终用的是 AllData 做平台入口DolphinScheduler 负责工作流调度实际数据抽取用 DataX目标端用 Doris 的 Stream Load。这条链路跑通之后我把它整理成一篇实操复盘也算给自己留个记录。如果你正在做物联网数据集成或者想把 TDengine 的数据同步到 Doris这篇文章应该能帮你少踩不少坑。内容会覆盖从环境搭建、建表设计、DataX 任务编写一直到 DolphinScheduler 编排调度的完整流程附带我实际遇到的几个问题和排查思路。整个方案不依赖商业版软件全部基于开源组件可以照着落地。1. 项目背景与整体链路设计1.1 为什么是 TDengine 到 Doris 这条链路TDengine 是时序数据库在物联网场景里处理设备点位数据极有优势写入快压缩率高按时间维度做范围查询非常流畅。但它不是万能的跨设备、跨业务的关联分析多表 Join、复杂子查询在 TDengine 上写起来非常费劲查询性能也会随着数据形态复杂化明显下降。Doris 是 MPP 架构的实时数仓适合做大规模明细数据的多维分析。把 TDengine 里的设备原始数据按照业务需要的粒度同步到 Doris 之后分析团队就可以用标准 SQL 做任意维度组合的统计比如故障率、能耗趋势、设备上下线分布等。所以这不是为了同步而同步而是解决“时序存储与分析型存储分工”的问题。还有一个现实因素很多物联网平台不只用到 TDengine还会把业务库MySQL、日志数据放在别处最后需要统一到一个分析入口。Doris 就是那个统一入口TDengine 只是其中一个上游。这条链路完成后所有来源的数据才能在一个地方做交叉分析。1.2 AllData 和 DolphinScheduler 各自干了什么AllData 是一个开源的数据中台集成平台它把元数据、数据集成、数据开发、调度等能力做了一层整合。它本身不是调度引擎但通过适配 DolphinScheduler能在页面上纳管数据同步任务、测试数据源连通性、查看任务运行状态。对团队来说AllData 提供了统一入口不需要直接面对一堆 YAML 配置和零散的脚本。DolphinScheduler 是 Apache 开源的工作流任务调度系统用来定义和处理同步任务之间的依赖关系、定时触发、失败告警。在实际落地时我把 DolphinScheduler 当成调度底座AllData 负责把任务配置与资源管理做可视化两边通过 API 和共享数据库对接。简单说AllData 解决的是“平台化和入口统一”的问题DolphinScheduler 解决的是“任务什么时候跑、跑挂了怎么办”的问题数据同步任务本身的执行是交给 DataX 去做的。这条链路每一层的分工非常清楚后续排查问题时能顺着层次快速定位。1.3 技术选型的几个关键取舍先说同步工具。我最终选了 DataX而不是自己去写 Shell 脚本或者用 Seatunnel。原因有几点DataX 的 DorisWriter 插件很成熟支持 Stream Load 方式写入性能高还能处理 CSV 和 JSON 格式。TDengine 这边用它的 RESTful 接口或者官方 JDBC 驱动把数据读出来DataX 的 Reader 侧可以通过自定义 JDBC 实现工作量可控。DolphinScheduler 自带 DataX 任务节点可以在页面上直接配置 JSON 文件路径不用自己造轮子管理进程。Seatunnel 其实也不错流批一体配置模型更简洁。但考虑到 DolphinScheduler 的 DataX 节点已经有现成界面不需要额外引入一个翻译层我暂时没用 Seatunnel。如果后面需要更复杂的整库多表同步Seatunnel 的整库同步能力会更香但那是另一个话题了。再就是数据同步策略。物联网数据几乎都是时间序列对同步延迟有要求但对精确到秒的“完全一致”没有强需求。所以我在 Doris 侧建表时统一把 TDengine 的时间戳转成 DATETIME 类型按时间分区同步时以时间窗口做增量保证批与批之间不重叠也不漏数据。全量初始化单独跑一个时间范围足够大的窗口不会影响后续增量任务。2. 环境准备四套系统的安装与基础配置2.1 TDengine 社区版的安装与初始化TDengine 社区版是免费可用的直接解决了很多团队“TDengine 太贵了”的顾虑。我用的是 3.x 版本安装方式很常规CentOS 上用 rpm 包安装Ubuntu 上也可以用 apt 或 tarball。装完以后第一步不是写 SQL而是确认两个端口6030 是原生连接端口6041 是 RESTful 端口。DolphinScheduler 和 DataX 要连接 TDengine这两个端口都有可能用到。装好后先启动服务并初始化配置。需要改的配置项主要是 dataDir、logDir 和 serverPort如果服务器内存不大适当调整内存参数。初始化数据时注意 TDengine 3.x 的建库语法和 2.x 有差异我习惯用下面的方式建库systemctl start taosd systemctl status taosd # 进入命令行 taos CREATE DATABASE iot_db MODEtsdb REQUIRED_TIMESTAMP 30000; USE iot_db; CREATE TABLE device_points ( ts TIMESTAMP, device_id NCHAR(32), point_name NCHAR(64), value DOUBLE, status INT ) TAGS (location NCHAR(64));这里的 REQUIRED_TIMESTAMP 表示写入时间戳必须落在最新时间的前后 30 秒内防止非常老的数据意外写入。当然这个值要根据你的业务场景调整如果允许补录历史数据就不要设这么小。配置好 taosAdapter 之后RESTful 接口默认在 6041 端口可以用 curl 快速验证curl -u root:taosdata -H Content-Type: application/json \ -d SELECT * FROM iot_db.device_points LIMIT 1 \ http://127.0.0.1:6041/rest/sql如果返回带 column_meta 和 data 的 JSON说明 RESTful 通了。这一步验证很重要因为后续同步如果走 HTTP 方式用的就是这个接口。2.2 Doris 集群部署与建表设计Doris 部署相对简单分为 FE 和 BE 两种角色。FE 负责元数据和查询规划BE 负责数据存储和查询执行。小规模场景下可以一台机器起一个 FE、一个 BE但对生产环境我建议至少两个 FE配合 ELB 做负载和两个 BE保证数据副本。安装包直接去 Doris 官网下载二进制发行版解压后改 conf/fe.conf 和 conf/be.conf 里的内存参数即可。FE 启动之后通过 MySQL 协议连接 Doris 执行建库建表。注意 Doris 的 SQL 客户端就是 MySQL 命令行端口默认 9030。建表方法我给出实际用到的例子CREATE DATABASE IF NOT EXISTS iot_ods; CREATE TABLE IF NOT EXISTS iot_ods.device_points_sync ( ts DATETIME, device_id VARCHAR(32), point_name VARCHAR(64), value DOUBLE, status INT, location VARCHAR(64) ) DUPLICATE KEY(ts) PARTITION BY RANGE(ts) ( PARTITION p202501 VALUES LESS THAN (2025-02-01), PARTITION p202502 VALUES LESS THAN (2025-03-01) ) DISTRIBUTED BY HASH(device_id) BUCKETS 10 PROPERTIES( replication_num 1, light_schema_change true );设计要点有两个一个是 DUPLICATE KEY物联网原始点位数据不需要更新所以不选 UNIQUE 也不选 AGGREGATE保留明细后面在 Doris 里用视图或物化视图做聚合。另一个是时间分区按月份分区方便后续清理历史分区数据。DISTRIBUTED BY HASH 选 device_id 作为分桶键能保证同一设备的数据尽量落在同一分桶查询时裁剪效率更高。2.3 DolphinScheduler 安装与数据源配置DolphinScheduler 3.x 的部署可以走 docker-compose也可以二进制部署。我这边因为要和 AllData 做更深度的对接采用了二进制部署依赖 Zookeeper 和 MySQL。Zookeeper 用来做调度中心的高可用和分布式锁MySQL 用来存工作流定义和任务实例元数据。安装完成后在 DolphinScheduler Web UI 里第一件事是配置数据源。我分别配置了 TDengine 数据源和 Doris 数据源。配置 TDengine 数据源时JDBC 连接串要注意用原生连接走jdbc:TAOS://ip:6030/iot_db用 RESTful 走jdbc:TAOS-RS://ip:6041/iot_db。两者的驱动类也不一样一个是com.taosdata.jdbc.TSDBDriver一个是com.taosdata.jdbc.restful.RestfulDriver。Doris 数据源配置相对简单走 MySQL 协议JDBC URL 是jdbc:mysql://ip:9030/iot_ods。这里其实有个小坑DolphinScheduler 默认的 MySQL 驱动版本和 Doris 兼容性有时会有问题如果连接报错优先检查驱动版本换成 8.x 的 MySQL Connector/J 一般能解决。2.4 AllData 接入集群配置AllData 的接入方式取决于你用的版本。我用的版本里配置中心里有“集群管理”页面需要把 DolphinScheduler 的 API 地址和认证 token 填进去。填完之后 AllData 会自动拉取 DolphinScheduler 里已有的工作流和任务定义也能反向创建工作流。这一步容易遇到的问题有两个一是 AllData 和 DolphinScheduler 的接口版本不匹配导致拉不到任务列表解决办法是先查 AllData 官方文档里适配的 DolphinScheduler 版本二是网络隔离导致 AllData 访问不到 DolphinScheduler 的 API 端口需要确认安全组和防火墙放行。3. 同步方案选型与 DataX 任务编写3.1 同步工具的血泪对比在这条链路上我其实先试过三种方式Shell curl、DataX、Seatunnel。最终选择 DataX但从踩坑角度我把三种方式都说清楚。Shell curl 的思路很直观先用 curl 调 TDengine 的 RESTful 接口拿 JSON再把 JSON 转成 CSV最后用 Doris 的 Stream Load HTTP 接口把 CSV 推过去。优点是任何服务器都能跑不依赖额外软件缺点是 JSON 转换那一步非常痛苦TDengine 返回的嵌套结构不固定写脚本来解析要处理各种边界情况。如果只是临时的数据补录可以这么干我不建议作为长期同步方案。DataX 的优点是插件体系比较完整TDengine 侧用 JDBC 直连或 RESTful 接口做 ReaderDoris 侧用 DorisWriter 做 Writer整个任务通过一个 JSON 配置串起来可维护性比 Shell 脚本高很多。DolphinScheduler 又提供了 DataX 任务节点直接把 JSON 文件路径填进去就能跑配合度非常好。Seatunnel 在配置模型上更现代支持多 Source 多 Sink 的 DAG而且不少人在生产环境验证过。但当时我们需要快速落地DataX 的学习成本更低加上 DolphinScheduler 原生支持 DataX所以选 DataX 最稳。3.2 TDengine 侧数据读取的两种姿势TDengine 数据读取有两种姿势我建议按你的场景来选。第一种是 JDBC 原生驱动。官方提供的 taos-jdbcdriver 支持直接以原生协议访问 TDengine这种方式的延迟更低适合 DataX Reader 使用。DataX 的 JdbcReader 可以用这个驱动配合标准 SQL 查询。连接串要写完整jdbc:taos://192.168.1.20:6030/iot_db?userrootpasswordtaosdata第二种是 RESTful 驱动。如果你不想在每个同步节点上安装 TDengine 客户端依赖就用jdbc:taos-rs://192.168.1.20:6041/iot_db这种连接方式。它的本质是把 SQL 封装成 HTTP 请求发到 taosAdapter再由 taosAdapter 转发给 taosd。这种方式跨平台更容易部署代价是每次请求多一层 HTTP 开销。数据量不大或同步频率不高的场景完全够用。我实际生产环境数据量比较大所以采用 JDBC 原生驱动连接 TDengine。需要把 taos-jdbcdriver 的 jar 包放到 DataX 插件目录或者 DolphinScheduler 的 lib 目录下这个细节后面在坑里会重点说。3.3 Doris 侧导入方式与表结构设计Doris 支持多种数据导入方式最常用的是 Stream Load 和 Broker Load。Stream Load 适合小批量高频率导入直接通过 HTTP 接口走数据在内存里流转Broker Load 适合大规模批量导入需要依赖一个 Broker 组件。我们同步任务是分钟级或者小时级的小窗口用 Stream Load 最合适。DataX 的 DorisWriter 插件内部就是封装了 Stream Load。它会把读到的数据块通过 HTTP 推送到 Doris 的 BE 或 FE 的 8030 端口Doris 在内存中完成数据写入和副本分发。这个过程中有几个参数直接影响性能我在实际使用中调过的参数包括loadUrlStream Load 的 HTTP 地址一般是ip:8030。username和passwordDoris 的账号密码默认 root 无密码。column指定写入的字段顺序。preSql和postSql写入前和后执行的 SQL比如临时清空分区数据。maxBatchRows单批导入的最大行数我一般设置 500000。maxBatchBytes单批导入的最大字节数我一般设置 104857600也就是 100MB。另外要强调一点Doris 表结构里的字段类型要跟 DataX 里配置的字段类型对齐。TDengine 的 TIMESTAMP 在 Doris 侧对应 DATETIMETDengine 的 NCHAR 对应 VARCHARTDengine 的 DOUBLE 直接对应 DOUBLESTATUS 对应 INT。提前在 DDL 阶段对齐类型后面同步就不会频繁遇到类型转换异常。3.4 DataX 同步任务 JSON 配置详解下面把 DataX 任务的关键配置贴出来这是全流程里最有分量的部分。{ job: { content: [ { reader: { name: jdbcreader, parameter: { username: root, password: taosdata, column: [ {name: ts, type: DATE}, {name: device_id, type: STRING}, {name: point_name, type: STRING}, {name: value, type: DOUBLE}, {name: status, type: INT}, {name: location, type: STRING} ], connection: [ { jdbcUrl: [jdbc:taos://192.168.1.20:6030/iot_db], table: [device_points], where: ts ${sync_begin} AND ts ${sync_end} } ] } }, writer: { name: doriswriter, parameter: { username: root, password: , connection: [ { table: [device_points_sync], jdbcUrl: [jdbc:mysql://192.168.1.21:9030/iot_ods] } ], loadUrl: [192.168.1.21:8030], column: [ ts, device_id, point_name, value, status, location ], maxBatchRows: 500000, maxBatchBytes: 104857600 } } } ], setting: { speed: { channel: 4, byte: 1048576 } } } }这个 JSON 里我做了几件比较关键的事Reader 侧用 where 条件拼了${sync_begin}和${sync_end}两个占位符实际执行时由 DolphinScheduler 的变量替换机制填入具体时间。这样同一个 JSON 可以同时承担全量同步和增量同步。Writer 侧指定了 loadUrl 和 jdbcUrl注意 DorisWriter 需要同时知道查询协议的地址9030和数据导入的地址8030。channel 数设成 4表示 4 个并发通道。并发并不是越高越好太高会压垮 TDengine太低又发挥不了 Doris 的导入性能。这个值要根据 TDengine 数据量和服务器核数综合调整。保存 JSON 文件之后可以先用 DataX 的命令行直接跑一遍验证python bin/datax.py job/tdengine_to_doris.json -p -Dsync_begin2025-01-01 00:00:00 -Dsync_end2025-02-01 00:00:00如果能够成功写入再把它挂到 DolphinScheduler 上做周期性调度。4. DolphinScheduler 工作流编排与调度实战4.1 创建工作流与任务节点DolphinScheduler 的工作流概念很像常见的 DAG 编排工具一个工作流由多个任务节点组成节点之间可以设置依赖关系。对于 TDengine 到 Doris 的同步我一开始只建了一个 DataX 任务节点后来发现针对于一个时间段的数据量比较大单节点跑太久就改成了三个节点并行同步任务节点执行 DataX从 TDengine 抽取指定时间窗口的数据。校验任务节点执行 SQL比较 TDengine 和 Doris 在相同时间窗口内的记录数。清理任务节点如果同步失败清理 Doris 里残留的部分写入数据避免重复。工作流设置好之后保存并上线。上线之后才允许被调度触发。这是一个容易忽略的点因为只在页面上保存而不上线定时调度是不会生效的。4.2 增量同步与全量初始化的落地设计全量初始化是最简单的把同步时间窗口设成一个很大的范围比如从 2020-01-01 到 2099-12-31跑一次就行。但实际跑下来会发现全量初始化时 DataX 单任务跑几千万行数据可能要好几个小时而且中间任何一处报错都要重来。所以我改用了一个更稳妥的做法把全量初始化拆成多个时间片段比如按天拆分然后在一个 DolphinScheduler 工作流里用循环或子流程方式跑。DolphinScheduler 的 shell 任务里可以写 for 循环也可以直接用参数化运行里传入连续日期列表。我的做法是写一个 shell 任务生成从 start_date 到 end_date 的日期列表然后对每一天调用一次 DataX 同步任务某个日期失败不会影响其他日期最后通过告警日志定位是哪一天的数据有问题。增量同步的核心思路是记住上一次成功同步的时间点。DolphinScheduler 里我维护了一张同步位点表每次同步开始前查一次该表拿到 last_sync_ts 作为 sync_begin同步完成后把任务里实际传入的 sync_end 更新为新的 last_sync_ts。这里要注意位点表本身可以放在 Doris 里也可以放在 MySQL 里我用 Doris 的原因是分析师可以直接在同一个分析平台上查看同步状态。增量同步的 SQL 里其实有一个容易忽略的问题就是数据延迟。设备数据到达 TDengine 的时间可能落后于设备本地时间如果只按 TDengine 的写入时间 ts 做增量会漏掉“迟到一小时”的数据。我最后在增量 SQL 里增加了一个 offset把 sync_begin 往前推 15 分钟也就是重复扫描最近 15 分钟的数据Doris 表是明细模型重复写入没关系后到的数据天然可以在下一次被捞出来业务查询时按时间去重即可。4.3 定时调度、参数传递与告警设置定时调度依赖 DolphinScheduler 的 cron 表达式我在页面上配置的是每天每 30 分钟跑一次增量同步。cron 表达式是0 */30 * * * ? *因为它内部用的 Quartz 语法秒和年的位置和传统 cron 有点差异。刚开始我用熟悉的 Linux cron 表达式结果调度没有触发后来查文档才发现 DolphinScheduler 的 cron 是基于 Quartz 的7 位格式写。参数传递是 DolphinScheduler 场景里很有用的一个特性。我通过全局参数定义了sync_begin、sync_end、last_sync_ts然后在 DataX 任务节点里引用。工作流启动时这些参数会被替换到 JSON 文件的占位符里。关键点是参数类型要设置正确last_sync_ts我用的是 String 类型因为 DataX 里 where 条件直接拼字符串如果选了 Date 类型格式会被转成带时区的 ISO 字符串跟 SQL 的写法不匹配容易报错。告警设置我直接用 DolphinScheduler 内置的邮件告警。任务失败时会发邮件到运维列表内容包括失败节点和日志链接。生产环境中我还配了一个钉钉机器人告警通过 shell 任务调用 curl 发送通知这个不麻烦但确实能缩短故障响应时间。需要说明的是告警信息里最好包含同步时间窗口否则收到告警后还要去平台里翻日志才能定位是哪个时间段的数据出问题。5. 踩坑实录与问题排查5.1 依赖包和插件路径问题最常见的坑来自 DolphinScheduler 执行 DataX 任务时的依赖路径。DataX 本身有 lib 目录DolphinScheduler 安装目录下也有 lib 目录而 DorisWriter 插件又是一个独立目录。默认情况下DolphinScheduler 的 DataX 任务只会加载 DataX 自带的 reader 和 writer 插件如果你把 doriswriter 放在了别的目录运行时会直接报“找不到插件”之类的错误。解决方法是把 doriswriter 整个目录复制到 DataX 的plugin/writer/目录下同时确认 doriswriter 的依赖 jar比如 fastjson、httpclient都放到了该插件的 lib 目录里。不要偷懒把所有 jar 都丢到 DataX 根目录 lib 下这样虽然能启动但可能会被其他插件扫描时产生 classloader 冲突表现就是莫名其妙的 NoClassDefFoundError。TDengine 驱动也一样taos-jdbcdriver 要放到 DataX 的 lib 目录如果 DolphinScheduler 的 DataX 任务是独立进程还要注意这个进程能不能找到 taos 的客户端库。我踩过的一个坑是只在 DataX lib 里放了 taos-jdbcdriver.jar但本地没有安装 TDengine 客户端动态库导致连接 TDengine 时报 native library 错误。后来我直接改用 RESTful 驱动来连接绕开了动态库依赖问题部署上也省了很多事。5.2 时间字段与时区问题时序数据同步最容易踩的坑就是时间字段类型和时区。TDengine 的 TIMESTAMP 是纳秒精度DataX 读取的时候如果直接映射成 DATE 类型会丢弃毫秒和纳秒部分Doris 的 DATETIME 默认只能到秒。对于大多数分析场景可以接受但如果你需要精确到毫秒级的排序Doris 的 DATETIME 就不够了要升级成 DATETIME(3) 或 DATETIME(6)DataX 的 column 配置里也要对应改成 DATE 或 TIMESTAMP。时区问题更隐蔽。TDengine 返回的 timestamp 默认是服务器时区偏移后的值如果 TDengine 服务器、Doris 服务器、DataX 执行机器三者时区不一致同步到 Doris 的数据可能会偏移 8 个小时或更多。我踩过的一次事故就是因为调度机用了 UTCTDengine 用了 Asia/Shanghai导致同步过去的数据整体慢了 8 小时。排查方式很简单在同步 JSON 的 reader 配置里显式加上connectExtra或session参数设置时区。JDBC 连接串里加timezoneAsia/Shanghai或者在查询 SQL 里用CONVERT_TZ转换。建议一开始就在所有环节统一使用同一种时区不要依赖默认值。5.3 同步性能与 Doris 慢查询优化兄弟这个问题必须单独拉出来说。刚开始我把 channel 数直接设成 8觉得 Doris 是大规模并行写入引擎应该并发越高越好。结果跑了半小时TDengine 的 CPU 被打满Doris 侧倒是正常。后来我把 channel 降到 4同时把 DataX 的byte限速调小问题就消失了。同步性能优化不是单纯调大并发而是要同时考虑源端、目标端和网络带宽三者的承受能力。Doris 慢查询优化是同步完成后的第二件事。数据导进去之后分析师反馈有些查询很卡排查下发现主要问题出现在分桶键上。物联网数据几乎总是按设备和时间查询但分桶键只有 ts没有 device_id导致大量查询要跨分桶扫描。我把建表 DDL 改成DISTRIBUTED BY HASH(device_id)之后按设备维度查询的耗时降了一个数量级。如果你也遇到类似问题重点检查分桶键和分区键是否匹配你的查询 pattern。还要提一个 Doris 的细节表里的数据如果长期不合并版本会出现大量的小文件影响查询性能。Doris 后台会自动做 compaction但如果导入频率过高compaction 速度跟不上就得手动触发或调整 compaction 参数。我在生产环境里设置了compaction_policytime_series对时序数据场景更友好。5.4 其他常见问题速查表我在同步链路中遇到的其他问题整理成一张速查表方便兄弟们排查问题现象可能原因解决办法DataX 任务找不到 doriswriter插件没放到 DataX 的 plugin/writer 目录复制插件目录确认 jar 完整JDBC 连接 TDengine 报 no taos缺少 taos 客户端动态库用 taos-rs RESTful 驱动绕过本地库依赖同步过去的时间少了 8 小时调度机、源库、目标库时区不一致统一时区连接串指定 timezone 参数Doris 导入后数据量对不上Stream Load 有部分失败被忽略开启 DorisWriter 的strictMode或增加校验任务DolphinScheduler 调度不触发cron 用了 Linux 语法实际是 Quartz 语法改为 7 位 Quartz 格式保存后重新上线TDengine 查询超时查询条件没走时间索引同步 SQL 必须带 ts 范围过滤避免全表扫描5.5 校验与监控机制最后说说校验。我不建议同步跑完就直接相信数据对了一定要在 Doris 侧做记录数校验。做法很简单DolphinScheduler 工作流里在 DataX 任务后面加一个 SQL 节点执行一条对比查询SELECT COUNT(1) FROM iot_ods.device_points_sync WHERE ts ${sync_begin} AND ts ${sync_end};把这个 COUNT 和 TDengine 里同条件查询的 COUNT 对比。如果差异超过阈值我这边设置的是 0.5%就把该时间窗口标记为失败触发补数任务。数据同步这件事最怕的不是慢而是错。加了校验和告警之后至少能在业务查询之前发现问题。我之前在文章里反复提到“不要相信默认值”这句话实践下来真不虚。默认时区、默认并发、默认插件路径每一个都可能是一个坑最好在落地初期就把这些参数显式列清楚。6. 最后的经验总结这条 TDengine 到 Doris 的同步链路最终成为我们大数据平台的基础设施之一。AllData 提供统一入口DolphinScheduler 负责调度和告警DataX 做数据搬运Doris 做分析承载。整套方案全部使用开源组件成本可以忽略但效果并不比商业同步工具差。我个人在实际操作中最深刻的体会是数据同步类任务的重点不是“跑起来”而是“可持续跑”。一次跑通过不难难的是每天定时稳定跑偶尔遇到幺蛾子还能快速定位。所以从一开始就不要省掉校验、告警和参数规范化的时间这些前期投入会在后续运维里十倍返回来。最后再分享一个小技巧给所有同步任务打上同一个 tag比如“tdengine-doris-sync”这样在 DolphinScheduler 的任务列表里可以快速过滤出所有相关任务告警邮件里也会带上 tag排查问题的时候一眼就能识别出任务族。这种细节看起来不起眼但团队协作的时候特别好用。如果你正在搭类似的管道我建议你从第一天就这么做。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门