DB⚡ パフォーマンス・速度

GitHub

GitHub、肥大化したメインMySQLクラスタをVitessで機能単位に分割

単一巨大MySQLクラスタVitessによる垂直シャーディング

GitHub.comの中核データを支える巨大なMySQLクラスタが限界に近づき、Vitessの垂直シャーディング機能を使いテーブル群をサービス無停止で別クラスタへ移動した。

課題

単一クラスタmysql1が2019年時点で秒間95万クエリを処理し限界に近づいていた

アプローチ

スキーマドメインで論理分割しVitessの垂直シャーディングでクラスタを本番無停止で分離

効果

2019〜2021年で合計秒間120万クエリを処理する体制へ、ホスト負荷は平均半減

背景

GitHubは当初、Ruby on Railsと単一のMySQLデータベースで構築されていた。10年以上の成長を経て、メインクラスタ「mysql1」に依存が集中する構成は深刻な問題を生んでいた。2019年時点でmysql1は平均秒間95万クエリを処理していたが、スケーリング圧力は急速に高まっており、単一障害点となったこのクラスタの問題はユーザープロフィール、リポジトリ、Issue、プルリクエストなどコア機能全体に波及するリスクを抱えていた。

移行のプロセス

GitHubのデータベースエンジニアリングチームは段階的なアプローチを採用した。

  • 関連テーブルを論理的にグループ化する「スキーマドメイン」を`db/schema-domains.yml`で定義し、例えばGist機能ではgists、gist_comments、starred_gistsを同一ドメインに属させた
  • SQLリンターを実装してクロスドメインクエリを開発段階で検出し、ActiveRecordに新メソッドを追加して`/* cross-schema-domain-query-exempted */`によるアノテーション対応も可能にした
  • データ移行では、MySQL用のスケーリングレイヤーであるVitessの垂直シャーディング機能と、独自開発した書き込みカットオーバープロセスを併用した
  • 書き込みカットオーバープロセスはMySQLのGTIDを活用し、cluster_aからcluster_bへの切り替えをわずか数十ミリ秒で実現した

結果

2019年から2021年にかけて、テーブル群は複数クラスタへ分散された。

  • 合計で秒間120万クエリ(レプリカが秒間112.5万クエリ、プライマリが秒間7.5万クエリ)を処理する体制になった
  • 各ホストの平均負荷は半減した
  • データベース関連インシデントも大幅に減少した

学び

GitHubは信頼性を最優先し「退屈で実証済み」の技術を活用する方針を重視した。Vitess単一依存のリスクを避けるため複数の独立したツールを保有する戦略を採り、今後は水平シャーディングとの組み合わせで長期的なスケーラビリティを確保していくとしている。

2022-03-01
他の事例も見る