变更数据捕获(CDC)在 ETL 提取中识别并捕获源系统中自上次提取以来发生变更的数据。CDC 不是重新加载整个数据集,而是通过只关注新的、更新的或已删除的记录来最大程度地减少数据传输和处理。这种方法对于效率至关重要,尤其是在大规模系统中,全面数据转储是不切实际的。CDC 通过使用事务日志、时间戳或触发器等机制在源端跟踪变更(例如数据库的插入、更新或删除)。然后提取这些变更并进行暂存,以便转换并加载到目标系统,确保 ETL 管道仅处理相关数据。
CDC 通常采用三种方法:基于日志、基于触发器和基于时间戳的跟踪。基于日志的 CDC 读取数据库事务日志(例如 MySQL 的 binlog 或 PostgreSQL 的 Write-Ahead Log)来检测变更。这种方法效率高且非侵入性,因为它不需要修改 schema。基于触发器的 CDC 使用数据库触发器在数据变更时触发事件,并将详细信息捕获到 shadow table 中。虽然有效,但触发器会给事务系统增加开销。基于时间戳的 CDC 依赖于像 last_modified
这样的列来识别新的或更新的记录,但如果未使用软删除,则难以处理删除操作。每种方法都有权衡:基于日志的方法适用于低延迟场景,触发器提供精确性但会影响性能,而基于时间戳的方法简单但不完整,无法处理某些操作。
CDC 在需要近乎实时数据更新的场景中特别有用,例如金融系统或库存管理。例如,零售公司可以使用基于日志的 CDC 将库存变更流式传输到数据仓库,从而实现实时库存警报。CDC 还通过避免重复的全表扫描来减轻源系统的压力。Debezium(基于日志)或 AWS Database Migration Service 等云服务等工具可以自动化 CDC 的实现,处理日志解析和 schema 演变等复杂问题。通过隔离变更数据,CDC 优化了 ETL 资源的使用,并确保了及时的数据同步,使其成为现代数据集成管道的基石。