Datadog从搜索延迟7秒到1秒的实战出发,打造了支持多租户、低延迟、高可用的CDC数据复制平台,用异步复制+自动化+Schema兼容性控制实现大规模数据流动。
在硅谷一线大厂里,数据库从来不只是存东西的“仓库”,而是一台轰鸣的引擎。当用户点击你产品的某个页面,背后可能触发数十个服务协同运转——而所有这一切,最终都依赖于数据能不能准时、准确、低延迟地从一个系统跑到另一个系统。如果数据库变成性能瓶颈,用户等得越久,流失率越高,产品就离崩盘不远了。
Datadog这家市值超过500亿美元的可观测性巨头,就经历过一次“数据库濒临崩溃”的危机。而他们靠的不是堆服务器、也不是换数据库,而是重构了整个数据复制的底层逻辑。
今天我们就来深度拆解这篇由Datadog工程师Sanketh Balakrishna和Andrew Zhang撰写的重磅技术博客——《Replication Redefined》,看看他们如何从一个7秒加载的页面,演进出一个能服务数千租户、毫秒级复制延迟、支撑全公司数据流动的CDC(Change Data Capture,变更数据捕获)平台。
起初,Datadog的多个关键产品页面都依赖一个共享的PostgreSQL数据库。这种架构在早期确实省心省力:ACID事务保障、开发上手快、成本低廉,对于一家还在快速增长但用户量尚未爆炸的公司来说,是个合理选择。页面加载飞快,基本控制在100毫秒以内,用户体验丝滑。
但问题就出在“增长”二字上——当Datadog客户数量激增,单个组织(org)的指标数量突破5万甚至8万时,数据库的性能曲线开始剧烈恶化。
拿他们的“Metrics Summary”页面举例:每次加载都需要将82,000条活跃指标与817,000条配置记录做JOIN操作。这种复杂查询在小数据量下无伤大雅,但到了这个规模,p90延迟直接飙到7秒!用户每点一次筛选条件(facet),系统就要重新跑一次昂贵查询,结果就是I/O打满、CPU飙升、VACUUM操作频繁阻塞写入——整个数据库像被拖进泥潭,越陷越深。
更可怕的是,这不是个别现象。
PostgreSQL本身在OLTP(在线事务处理)场景下表现优异,但一旦掺杂了OLAP(在线分析处理)类的聚合、多表JOIN、高基数筛选,性能就会断崖式下跌。垂直扩展(加CPU加内存)早就到达收益递减点,而备份、故障切换、跨区域复制这些运维动作,在TB级数据面前变得极其脆弱。
Datadog用自家的APM监控工具清晰看到:这些查询开始吃掉不成比例的系统资源,成为整个服务链路的瓶颈。用户抱怨页面卡顿、筛选失灵,工程师疲于救火——典型的“技术债”爆发前夜。
面对这种局面,团队没有选择“优化查询”这种治标不治本的方案,而是做了一个大胆决定:把搜索和聚合这类分析型负载,彻底从PostgreSQL里剥离出去!他们引入了一个专用的搜索平台(很可能是基于Elasticsearch或类似Lucene生态的系统),然后通过CDC技术,将PostgreSQL里的数据实时复制过去,并在复制过程中完成“数据扁平化”——也就是把原来分散在多张表里的关联字段,提前合并成一个完整的文档。
这样一来,搜索平台就不再需要做任何JOIN,直接按文档检索即可。结果?页面加载时间从原来的30秒(极端情况)骤降到1秒左右,复制延迟稳定在500毫秒。
这不仅救活了产品体验,更验证了一个核心理念:不同数据负载,必须跑在最适合它的引擎上,而高效的数据复制,就是连接这些引擎的桥梁。
但问题来了:单个复制管道好搞,如果全公司几十个团队、几百个服务、上千个数据表都要这么干,怎么办?
早期Datadog工程师都是手动搭复制链路——开逻辑复制、建用户权限、配Debezium、起Kafka Topic、调Sink Connector……每个步骤都不能出错,而一旦出错,排查起来耗时耗力。更麻烦的是,这些操作分散在不同团队,标准不一,文档缺失,新人上手几乎等于重新发明轮子。随着数据源和目标系统的数量指数级增长,这种“点对点”的复制方式迅速变成运维噩梦。
团队意识到:必须把复制这件事平台化、自动化、产品化!
他们的解决方案是——引入Temporal。
Temporal是一个开源的分布式工作流编排引擎,特别适合处理需要长时间运行、具有状态、需要容错和重试的复杂任务。
Datadog将整个复制管道的创建流程拆解成一系列原子任务:比如“启用PostgreSQL逻辑复制(设置wal_level=logical)”、“创建具有REPLICATION权限的数据库用户”、“注册Debezium连接器”、“自动创建Kafka Topic”、“部署心跳表监控WAL保留”等等。
每个任务都被封装成Temporal中的一个Activity,然后用Workflow把它们串起来。
这样一来,任何团队只需要调用一个API,填几个参数(比如源数据库、目标索引名、是否需要过滤),平台就能自动完成整套部署。不仅效率提升十倍,而且一致性、可审计性、可回滚性全部拉满。
更重要的是,工程师再也不用手动拼接各种中间件,可以把精力真正放在业务逻辑上。这种“基础设施即服务”的思路,正是现代云原生架构的核心精髓。
在平台设计之初,Datadog团队面临一个根本性抉择:用同步复制,还是异步复制?同步复制的好处是强一致性——写操作必须等所有副本确认才返回成功,数据绝对不丢、不乱。但代价是高延迟、低吞吐,一旦某个副本网络抖动或宕机,整个写入链路就会卡住,严重拖累主业务。而异步复制则相反:主库写完立刻返回成功,副本在后台慢慢同步。虽然存在短暂的数据延迟(通常几百毫秒),但换来的是极高的可用性和扩展性——系统可以轻松扛住数千TPS,容忍网络分区,甚至跨大洲部署也不怕。
Datadog作为一家以“高可用”为生命线的SaaS公司,毫不犹豫选择了异步复制。他们的逻辑很清晰:对于绝大多数应用场景(比如搜索、报表、缓存预热),几百毫秒的数据延迟完全可以接受;但系统卡死、请求超时,用户是零容忍的。
于是,整个平台的基石就建立在“最终一致性”之上,用可用性换强一致。技术栈上,他们重度依赖Debezium(开源CDC工具,支持PostgreSQL、MySQL、MongoDB等)和Kafka Connect(可扩展的数据集成框架)。Debezium负责从数据库日志(WAL)里实时抓取变更事件,写入Kafka;Kafka Connect则作为管道中枢,负责将消息从Kafka分发到各种下游系统——Elasticsearch、Iceberg、另一个PostgreSQL实例,甚至自研存储。
这套组合拳,既利用了成熟开源生态的稳定性,又通过平台层封装了复杂度,真正做到了“开箱即用”。
然而,异步复制最大的敌人不是延迟,而是Schema变更。在高速迭代的互联网公司,数据库表结构每周甚至每天都在变:加字段、删字段、改类型、设NOT NULL……这些操作在单体应用里可能无感,但在分布式复制链路中,却可能引发雪崩。比如,假设某天你给一个字段加上了NOT NULL约束,但此时Kafka里还堆积着旧版本的消息(该字段为空),下游消费者一解析就报错,整个管道就断了。更糟的是,如果多个团队共用一个Topic,一个团队的“无心之失”可能导致其他团队的数据流全部瘫痪。
为了解决这个问题,Datadog构建了双保险机制。第一道防线是前置Schema验证。他们开发了一套内部的SQL迁移分析工具,在任何ALTER TABLE语句真正执行前,先静态扫描其风险。例如,系统会自动拦截这样的语句:
sql
ALTER TABLE metrics_config ALTER COLUMN owner SET NOT NULL;
因为无法保证所有正在传输中的CDC消息都包含owner字段的值。这种变更会被标记为“高危”,需要DBA和平台团队人工介入,协调一个安全的灰度方案(比如先补全数据,再加约束)。
第二道防线是Kafka Schema Registry + 向后兼容策略。
所有CDC事件都以Avro格式序列化,每个字段都有明确的Schema定义。Schema Registry会存储每个Topic的Schema历史,并强制要求新Schema必须与旧版本“向后兼容”——这意味着你可以安全地添加可选字段、删除字段,但不能修改字段类型或把可为空变成不可为空。
当Debezium捕获到表结构变化,它会自动将新Schema注册到Registry,并附在后续的消息中。下游消费者(无论是标准Sink Connector,还是自定义代码)都能根据Schema版本正确解析数据,避免解析失败。
这一套组合拳,让Datadog在保持敏捷迭代的同时,牢牢守住了数据管道的稳定性底线。
光有稳定还不够,平台必须足够灵活,才能支撑不同业务团队的多样化需求。有些团队只需要复制特定字段;有些需要把多张表JOIN后输出;还有些要在数据里加组织ID、租户标签、时间戳等元信息。如果平台只提供“原样复制”这一种模式,很快就会被业务甩在身后。Datadog的应对策略是:在标准化基础上,开放可编程接口。
他们充分利用了Kafka Connect的“Single Message Transform”(SMT)机制。SMT允许在消息从Source到Sink的途中,对每条记录进行轻量级转换。比如:
- 用ValueToKey SMT把某个字段提升为Kafka消息的Key,方便分区
- 用InsertField SMT动态添加时间戳或租户ID
- 用ReplaceField SMT重命名或删除敏感字段
- 用Concat SMT合并多个字段生成复合主键
这些转换用JSON配置即可完成,无需写代码。对于更复杂的需求(比如调用内部服务做实时查表补全),Datadog则提供了标准化的Enrichment API。这个API作为独立服务运行,复制管道在写入最终存储前,可以调用它来获取额外字段。比如,原始事件只有user_id,Enrichment API可以返回user_name、department、region等信息,并注入到事件中。通过集中管理这些逻辑,Datadog避免了每个团队重复造轮子,也确保了数据语义的一致性。
此外,他们还维护了部分Kafka Connect Connector的定制分支,植入Datadog特有的鉴权、限流、监控埋点等逻辑。这种“上游开源+内部增强”的模式,既享受社区红利,又能深度适配自身架构,是大厂基础设施团队的常见打法。
从最初只为解决一个搜索页面卡顿的小管道,到如今支撑PostgreSQL跨库同步、Cassandra复制、Iceberg数仓入湖、跨区域灾备等数十种场景的多租户平台,Datadog的CDC平台完成了华丽转身。它的核心价值早已不是“复制数据”,而是提供了一种标准化、自动化、可观测的数据流动范式。
工程师不再需要关心Debezium怎么配、Kafka Topic怎么建、Schema怎么兼容——他们只需声明“我要从A表复制到B系统,过滤条件是X,字段映射是Y”,剩下的交给平台。这种抽象层级的提升,释放了巨大的生产力。
回顾整个演进过程,Datadog做了几个关键取舍:
1. 将分析负载从OLTP数据库剥离,用专用引擎处理专用问题;
2. 坚持异步复制,用最终一致性换取系统可用性和扩展性;
3. 用Temporal实现全流程自动化,消灭手动操作;
4. 通过Schema验证+Registry保障兼容性,在敏捷与稳定间找平衡;
5. 开放Transform和Enrichment能力,满足业务多样性而不牺牲平台统一性。
这些经验,对于任何正在构建大规模数据基础设施的团队,都极具参考价值。尤其是在AI基础设施爆发的今天,训练数据、日志、特征、模型参数的跨系统流动需求爆炸式增长,一个高效可靠的复制平台,可能就是决定AI产品迭代速度的关键一环。
Datadog的故事告诉我们:基础设施的终极目标,不是炫技,而是让上层业务“无感”——无感于复杂性,无感于延迟,无感于故障。当工程师能像调用一个函数那样轻松地移动数据时,创新才真正开始加速。而这,或许就是下一代数据基础设施该有的样子。