Vitess: 大規模スキーマ変更の実踐と技術解析

引言

現代のクラウドネイティブ環境では、データベースのスケーラビリティと可用性が極めて重要です。特に、大規模なデータベースシステムにおいては、スキーマ変更という操作がシステムの運用に大きな影響を及ぼします。Vitessは、MySQLをベースにした分散型データベースソリューションであり、水平分片と垂直分片をサポートし、高可用性と拡張性を実現しています。本記事では、Vitessが大規模スキーマ変更をどのように解決し、その技術的詳細を解説します。

技術の定義と基本概念

Vitessのアーキテクチャ

Vitessは、MySQLを拡張した分散型データベースシステムであり、以下のコンポーネントから構成されています。

  • Tablet: 各MySQLノードに付隨するコントロールコンポーネントで、データベース操作(起動/停止、バックアップ)とトラフィック管理を擔當します。
  • Vitigate: クエリエンジン、ロードバランサー、ルーターとして機能し、アプリケーション側のエントリポイントとして動作します。後端の複數のMySQLクラスターを隠蔽します。
  • Topology Server: 分片の構成情報を保存し、クエリルーティングとクラスター管理に使用します。
  • 分片戦略: ビジネスニーズに応じて分片ルールを設定し、動的な分片構成の調整をサポートします。

キャンバスの拡張性

Vitessは、水平分片と垂直分片をサポートし、大規模なデータベースのスケーラビリティを実現します。また、高可用性を確保するため、複數のVitigateインスタンスと冗長な分片構成を採用しています。

大規模スキーマ変更の課題

伝統的なMySQLの制限

  • 大規模なテーブル(例:新規カラムの追加、インデックスの作成)の変更では、テーブルロックにより長時間のダウンタイムが発生します。
  • オンラインDDL機能は限られており、すべての変更ニーズを満たすことはできません。

多分片環境の複雑性

  • 各分片ごとに変更を獨立して処理する必要があります。
  • 異步的な変更により、各分片のデータ構造が不一致になる可能性があります。

Vitessの解決策

1. オンラインスキーマ変更メカニズム

  • プロセス:
    1. 空の「シャドウテーブル」を作成し、軽量なDDL操作を実行します。
    2. 原始テーブルのデータとリアルタイムの書き込みトラフィックをシャドウテーブルに同期します。
    3. 両テーブルが同期された後、アプリケーショントラフィックを新しいテーブルに切り替えます。
  • 利點:
    • テーブルロックを迴避し、ダウンタイムを最小限に抑えます。
    • 動的な分片構成の調整をサポートします。

2. 分片レベルの変更管理

  • Idempotency(項目無関係性):
    • 唯一のジョブIDを使用して変更リクエストを管理し、重複実行を防ぎます。
    • 聲明型マイグレーション(Declarative Migrations): CREATE TABLEDROP TABLE を使用して目標狀態を定義し、各分片が獨立して必要な変更を計算します。
  • 一貫性処理:
    • 延滯完了(Postpone Completion): 各分片が同期後、すべての分片が変更を完了するのを待機します。
    • 阻害クエリの強制終了: 切換前にロックを佔有しているクエリを終了し、切り替えを確実に実行します。

3. 多変更の並行処理

  • 並行マイグレーション:
    • 複數の変更タスクを同時に実行し、一部の操作は真に並行可能ですが、一部はリソース競合を避けるためシリアル化されます。
    • SHOW VT MIGRATIONS を使用して各分片の狀態を監視し、COMPLETENESS コマンドで同期切り替えを発行します。

技術的キーポイント

  • 分片ルーティング: Vitigateは分片構成に基づいてクエリをルーティングし、データの正しくな配置を確保します。
  • ステートドリブン設計: 聲明型マイグレーションにより、変更の目標狀態をデプロイの基準とし、具體的なコマンドではなく狀態を管理します。
  • 高可用性: 複數のVitigateインスタンスと冗長な分片構成により、サービスの中斷を防ぎます。
  • 拡張性: 動的な分片數と構成の調整をサポートし、さまざまなビジネスニーズに応じて適応します。

分片マイグレーションと同期メカニズム

  • 分片同期戦略:

    • SHOW VT MIGRATIONS を使用して各分片の狀態を確認し、ready_to_complete フィールドが1であることを確認します。
    • ALTER VT MIGRATION COMPLETE コマンドを使用してすべての分片を同期切り替えします。
    • 某分片が重複クエリやデータ量の増加により遅延している場合、Vitessは切り替えを妨げるクエリを強制的に終了します。
  • 多マイグレーションの並行実行:

    • 複數のマイグレーションを同時に実行し、各分片は変更を並行して適用します。
    • POSTPONE MIGRATIONCOMPLETE ALL コマンドを使用してマイグレーションフローを制御し、過剰な負荷(例:同時に30個の大テーブルの処理)を迴避します。
    • マイグレーション完了までの時間差は、分片數とデータ量に応じて數秒から數十秒です。

容錯と復舊メカニズム

  • 障害復舊:
    • VReplicationを使用してデータマイグレーションの狀態(バイナリログ位置、データ範囲)を追跡します。
    • メインノード障害時、Vitessは新しいメインノードを選挙し、中斷ポイントからマイグレーションを復舊します。
    • REVERT MIGRATION メカニズムにより、マイグレーションを元のテーブルに戻すことができ、挿入/更新されたデータを保持します。

安全性とリスク管理

  • 一意インデックスとデータ一貫性:
    • 一意インデックスのカラムを編集する際、データの整合性を確認する必要があります。
    • Vitessはschemaデータベースとツールを提供し、元のスキーマと目標スキーマを比較し、データ喪失のリスク(例:カラム削除、範囲縮小)を識別します。
    • 外部キー制約の直接処理はできません。自前のMySQLバージョンで--allow-foreign-keysフラグを有効にすることを推奨します。

MySQLの制限とマイグレーション操作

  • 外部キー処理:

    • MySQL InnoDBは外部キーを直接置き換えることができないため、自前のMySQLブランチを使用する必要があります。
    • ALTER TABLE を使用して構造変更を行い、VReplicationでデータ同期を管理することを推奨します。
  • マイグレーション切り替え操作:

    • RENAME TABLE を使用して分片切り替え(A→C、B→A、C→B)を行い、データの完全な同期を確保します。
    • ツールがロックと狀態チェックを自動的に処理し、データの不一致を防ぎます。
    • エンジニアが手動で切り替えをトリガー(POSTPONE COMPLETION)できますが、すべての分片の狀態がready_to_completeであることを確認する必要があります。

並行処理とパフォーマンス最適化

  • マイグレーションの並行制御:
    • マイグレーションタスクは並行して実行できますが、一部の操作(データ同期)はシリアル化されます。
    • マイグレーションプロセスでは、データトラフィック、レプリケーション遅延、サービス負荷を考慮し、操作ステップを自動的に調整します。
    • 過度な並行(例:同時に大量の大テーブルの処理)を避けることで、システムの安定性を維持します。

結論

Vitessは、大規模なスキーマ変更を効率的かつ安全に実行するための強力なツールです。オンラインDDL、分片レベルの変更管理、並行マイグレーションなどの機能により、高可用性と拡張性を実現します。ただし、外鍵制約の処理や複雑なマイグレーションフローには注意が必要です。Vitessを導入する際には、これらの特性を理解し、適切な設計と運用が求められます。