Airbnbにおける合成テストを超えて:実際のデータベースワークロードのキャプチャとリプレイ
Airbnbは、その運用においてMySQL互換データベースに大きく依存しています。これらのデータベースを大規模に管理することは、キャパシティプランニング、アップグレード中の整合性の確保、本番環境のインシデントのデバッグにおいて課題をもたらします。これらの問題に対処するため、Airbnbは本番データベーストラフィックのキャプチャとリプレイのためのシステムを開発しました。以前のAirbnbのデータベースクエリキャプチャおよびリプレイシステムは断片的で、正確なリプレイに必要な詳細が不足していました。また、メンテナンスの負担が大きく、スケーラビリティも低かったです。新しいシステムは、リアルなトラフィックでの負荷テスト、アップグレード時のクエリ互換性の確保、パフォーマンスデバッグの支援という3つの主要な目標を持って設計されました。システムアーキテクチャは、アプリケーションとデータベースの間に配置される既存のプロキシであるProxySQLを活用しています。これにより、アプリケーションの変更を必要としない、単一のクライアント非依存のキャプチャポイントが提供されます。システムは、Log Mover、Log Processor、Log Replayerという3つの社内コンポーネントで構成されています。Log MoverはProxySQLのサイドカーとしてデプロイされ、クエリログを収集し、クラウドオブジェクトストレージに転送します。Log Processorはオフラインジョブであり、これらのログを解析、グループ化、順序付けして、各クラスタのリプレイ可能なデータセットを作成します。また、きめ細かな制御のためにクエリをタイムスタンプでバケット化し、オートインクリメントの動作の一貫性を維持するためにクエリを書き換えます。Log Replayerは、キャプチャされたトラフィックをターゲットデータベースに対してリプレイします。ユーザーは、ソースクラスタ、時間範囲、ターゲットエンドポイント、およびリプレイモードを指定します。リプレイヤーは、負荷テストとキャパシティプランニングのための「Replay only」と、互換性テストのための「Replay and compare」をサポートしています。Replay Task Schedulerは、ジョブをタスクに分割し、元のタイミングと同時実行性を維持しながらその実行を管理します。Replay Task Workersは水平方向にスケーリングして、ログに記録されたクエリをターゲットデータベースに対して実行します。このフレームワークは、MySQL 5.7から8.0へのデータベースアップグレードなどのテストにおいて、パフォーマンスの低下や正当性の問題を早期に特定するために不可欠でした。これにより、チームは本番環境へのデプロイ前に、パフォーマンスのベースラインが維持され、後方互換性のある動作が保証されていることを確認できます。