超越合成测试:在 Airbnb 捕获并回放真实数据库工作负载
Airbnb 严重依赖与 MySQL 兼容的数据库来支撑其运营。在大规模管理这些数据库时,面临容量规划、升级期间的一致性保障以及生产环境故障排查等挑战。为解决这些问题,Airbnb 开发了一套用于捕获并回放真实生产数据库流量的系统。此前,Airbnb 的数据库查询捕获与回放系统碎片化严重,缺乏足够细节以支持准确回放,同时维护负担沉重且扩展性差。新系统的设计围绕三个核心目标:利用真实流量进行负载测试、确保升级过程中的查询兼容性,以及辅助性能调试。该系统架构利用 ProxySQL,这是一个位于应用与数据库之间的现有代理。这提供了一个单一且与客户端无关的捕获点,无需修改应用程序。系统由三个内部组件构成:日志移动器(Log Mover)、日志处理器(Log Processor)和日志回放器(Log Replayer)。日志移动器作为 ProxySQL 的侧车(sidecar)部署,负责收集查询日志并将其传输至云对象存储。日志处理器是一个离线任务,用于解析、分组并排序这些日志,为每个集群生成可回放的数据集。它还将查询按时间戳分桶,以实现细粒度控制,并重写查询以维持自增行为的兼容性。日志回放器将捕获的流量回放至目标数据库。用户可指定源集群、时间范围、目标端点以及回放模式。回放器支持“仅回放”模式,用于负载测试和容量规划;以及“回放并对比”模式,用于兼容性测试。回放任务调度器将作业拆分为任务,并管理其执行过程,以保留原始的时序和并发特性。回放任务工作节点可水平扩展,以对目标数据库执行已记录的查询。该框架对于测试数据库升级(如从 MySQL 5.7 升级至 8.0)至关重要,能够早期识别性能回退和正确性问题。它使团队能够在生产部署前确保性能基线得以保持,并实现向后兼容的行为。