知识卡片
变更数据捕获的实现方式与日志压缩机制
内容
变更数据捕获(CDC)观察写入数据库的所有变更,把它们提取转换成可以复制到其他系统的形式,本质是让被捕获的数据库成为领导者、让搜索索引等其他组件变成追随者,用[[基于日志的消息代理分区偏移量与传统代理的权衡]]传输变更事件(能保留消息顺序,避免负载均衡加重传导致的乱序)。实现路径有两条:数据库触发器(在每次变更时把记录写入变更日志表)简单但脆弱、性能开销明显;解析复制日志或WAL(如Bottled Water解码PostgreSQL WAL、Maxwell/Debezium解析MySQL binlog)更稳健,但要处理模式变更等复杂情况。CDC天生是异步的:记录数据库不会等消费者应用完变更才提交,这带来运维优势(慢消费者不会拖累记录系统),但也引入了复制延迟问题。若只保留有限历史日志,每接入一个新的衍生数据系统就得重新做一次全量快照;日志压缩提供了更省事的替代方案——只要每条变更都带主键、且同一键的新变更覆盖旧值,压缩就只保留每个键的最新更新(用特殊的墓碑值表示删除),所需磁盘空间只取决于数据库当前内容而非历史写入总量,此后任何新消费者从压缩日志的偏移量0开始扫描,就能获得数据库内容的完整副本,不必再单独取一次快照。
参考来源
- 位置:《数据密集型应用系统设计》第十一章《流处理》"变更数据捕获""变更数据捕获的实现""初始快照""日志压缩"(源文件:_epub-src/ch11_split_001.html)
- 结论依据:原文说明CDC让数据库成为领导者、其他系统作追随者,列举触发器与解析复制日志两种实现方式及各自优劣,并说明日志压缩通过只保留每键最新值让新消费者无需全量快照即可重建数据库副本,直接支撑本卡片结论。
- 原始内容:变更数据捕获使得一个数据库成为领导者……解析复制日志可能是一种更稳健的方法……日志能保证包含数据库中每个键的最新值……你可以使用它来获取数据库内容的完整副本,而无需从CDC源数据库取一个快照。