※このブログは2024年7月25日に公開された英語ブログ「Effective Online DDL: Making Critical Database Schema Changes with Zero Downtime」の拙訳です。
オンライン・データ定義言語 (DDL) は、現代のデータベースにとって重要な機能です。この機能により、大幅なダウンタイムやロッキングを伴わないスキーマ変更が可能になり、データベースの運用が中断されることがなくなります。つまり、これらの操作は、データベースが読み取りや書き込みが可能な状態を維持しながら実行されるため、ダウンタイムを最小限に抑え、実行中の処理の中断を避けることができます。
オンラインDDLは、高可用性を必要とするアプリケーションや、メンテナンスウィンドウが実現不可能であったり、あまりにも混乱を招くアプリケーションにとって特に重要です。この機能は、ユーザーエクスペリエンスやサービスの可用性に影響を与えることなく、拡張、進化、スキーマ変更を行う必要がある大規模な運用データベースにとって極めて重要です。
このブログでは、オンラインDDLとは何かを探り、分散SQLデータベースであるTiDBがオンラインDDLオペレーションを効率的に処理する方法について掘り下げていきます。
オンラインDDLとは?
オンラインDDLは、データベースの可用性とパフォーマンスへの影響を最小限に抑えながら、カラムの追加、インデックスの作成、テーブル構造の変更などのスキーマ変更を実行します。リレーショナルデータベース管理システム (RDBMS) における従来のDDL操作は、テーブルをロックする必要がある場合が多く、ダウンタイムやパフォーマンスの低下につながりますが、オンラインDDLはこれらの問題を軽減することを目的としています。
TiDBは、Google F1の論文で紹介されたプロトコルを使用してオンラインDDLを実装しています。要するに、DDLの変更は小さな移行段階に分割されるため、データ破損のシナリオを防ぐことができ、システムは個々のノードが同時に1つのDDLバージョンまで遅れていることを許容します。
オンラインDDLの主要な側面
- ノンブロッキング操作:テーブルの長期ロックを回避します。
- 最小限のダウンタイム:スキーマの変更中もデータベースを利用可能な状態に保ちます。
- 同時実行:同時にDML (データ操作言語) 操作が可能です。
- 段階的アプローチ:複数の段階に分けて変更を行い、影響を軽減します。
MySQLがオンラインDDLを処理する方法
MySQL、特にInnoDBストレージエンジンを利用した場合は、オンラインDDLを強力にサポートしています。ここでは、MySQLがオンラインDDLにどのように対応しているかを説明します:
ブロッキング・スキーマの変更
MySQLのInnoDBエンジンでは、テーブルへのアクセスをブロックすることなく多くのスキーマ変更が可能です。例えば、カラムの追加やインデックスの作成は、以下のようにテーブル全体をロックすることなく行われます。
- メタデータの更新:MySQLは新しいカラムを含むようにテーブルのメタデータを更新します。
- バックグラウンド処理:InnoDBエンジンはバックグラウンドで新しいカラムの追加を実行します。既存の行は、読み取りや書き込み操作をブロックすることなく、新しい列を含むようにインクリメンタルに更新されます。
- 同時実行:バックグラウンド・タスクの実行中も、テーブルは他の操作のために完全にアクセス可能な状態に保たれます。新しいデータには新しいカラムが含まれ、既存のデータは徐々に更新されます。
オンライン・インデックス作成
MySQLはインデックスの同時作成をサポートしており、インデックスが作成されている間もテーブルの読み取りと書き込みが可能です。
- メタデータの更新:MySQLはテーブルのメタデータを更新し、インデックス定義を追加します。
- インデックスの構築プロセス:InnoDBエンジンがバックグラウンドでインデックスを構築し、既存のテーブルデータを読み込みながら段階的にインデックスを生成します。
- 中断を最小限に:インデックス構築中も、テーブルへのアクセスは継続されます。クエリや更新処理がブロックされることはなく、インデックスが完全に構築され有効化された後にのみ新しいインデックスが使用されます。
段階的アプローチ
MySQLでは、スキーマの変更を適用する際に段階的なアプローチを採用しているため、中断を最小限に抑え、パフォーマンスを維持することができます:
- 準備フェーズ:
- メタデータの更新、スキーマ変更の初期準備を行います。
- 変更が安全にシステム全体に伝搬することを保証します。
- 再編成フェーズ:
- 実際の変更はバックグラウンドで適用されます。例えば、カラムを追加するとき、データは少しずつ補完されます。
- このフェーズでは、大きな影響を与えることなく、読み取りと書き込み操作を同時に行うことができます。
- コミットフェーズ:
- スキーマの変更が確定し、アクティブになります。
- メタデータは新しいスキーマを反映するように更新され、変更を目に見える形にして運用を開始します。
これらの機能によって、MySQLデータベースはスキーマ変更中でも利用可能な状態を維持し、パフォーマンスを損なうことがありません。この特性により、多くのアプリケーションにおいて信頼性の高い選択肢となります。基盤となるプロセスを把握することで、ユーザーはMySQLのオンラインDDL操作が持つ効率性と信頼性をより深く理解することができます。
TiDBがオンラインDDLを処理する方法
オンラインDDLは、ダウンタイムやサービスの中断をせずにスキーマを変更するための重要な機能です。この仕組みによりデータベースの可用性とパフォーマンスが更新中も維持されます。ここでは、TiDBにおけるオンラインDDL管理の仕組みを詳しく見ていきます。3段階のスキーマ変更プロトコルを取り上げ、一般的なDDL操作の例を紹介します。
3段階のスキーマ変更プロトコル
TiDBはオンラインDDL操作を処理するために3段階のアプローチを採用しています:
1. 準備フェーズ:
- TiDBはメタデータを更新し、スキーマ変更の準備を行います。
- 変更が安全にシステム全体に伝搬することを保証します。
2. 再編成フェーズ:
- 実際の変更はバックグラウンドで適用されます。
- 例えば、新しいインデックスを構築したり、カラムを段階的に追加したりします。
- DMLの同時実行を可能にし、データベースの完全な稼働を保証します。
3. コミットフェーズ:
- スキーマの変更が確定され、アクティブになります。
- メタデータは新しいスキーマを反映して更新され、変更が可視化されます。
TiDBにおけるオンラインDDLの例
このセクションでは、TiDBにおけるオンラインDDL操作の一般的な例をいくつか紹介します。
カラムの追加
TiDBでカラムを追加する際、このプロセスはテーブルロックを回避し、継続的な可用性を保証します。技術的な仕組みは以下の通り:
- 準備フェーズ:TiDBは新しいカラム定義を含むようにテーブルのメタデータを更新します。この変更はクラスタ内のすべてのノードに伝搬し、一貫性を確保します。
- 再編成フェーズ:新しいカラムがバックグラウンドで追加されます。TiDBはバックグラウンドタスクを使用して、既存の行のカラムデータをインクリメンタルに補完します。このフェーズでは、新しいカラムデータを含む新しい書き込みが行われ、テーブルは読み書き可能な状態を維持します。
- コミットフェーズ:データの補完が完了すると、TiDBはスキーマの変更を確定します。メタデータは新しいスキーマを反映するように更新され、新しいカラムは完全にアクティブになり、以降のすべての操作で見えるようになります。
この手法により、TiDBは長時間のロックを避けつつカラムを追加でき、実行中の操作への影響を極力抑えることが可能です。
インデックスの作成
TiDBでのインデックスの作成もオンラインDDLの恩恵を受ける一般的な操作です。このプロセスにより、検索と更新がスムーズに行われるようになります:
- 準備フェーズ:TiDBはメタデータを更新し、変更がクラスタ全体に分散されるようにすることで、インデックス作成の準備をします。
- 再編成フェーズ:インデックスはバックグラウンドで作成されます。TiDBは既存のデータを処理してインデックスをインクリメンタルに作成し、読み取りと書き込みを同時に実行できるようにします。
- コミットフェーズ:新しいインデックスが確定され、アクティブになります。メタデータが更新され、インデックスがクエリの最適化に利用できるようになり、ダウンタイムを発生させることなくパフォーマンスが向上します。
カラムの変更
カラムのタイプや属性の変更など、カラムの変更も同様の効率で処理されます:
- 準備フェーズ:TiDBはテーブルのメタデータを更新し、カラム定義の変更を反映させます。
- 再編成フェーズ:実際のデータ変換はバックグラウンドで実行されます。例えば、カラムをINTからBIGINTに変更する場合、既存のデータをインクリメンタルに変換し、テーブルへのアクセスを確保します。
- コミットフェーズ:スキーマの変更が確定されます。メタデータは新しいカラムタイプを反映するように更新され、変更が完全に有効になります。
TiDBにおけるオンラインDDLの利点
オンラインDDL操作は、特に高可用性の大規模データベース環境において大きなメリットをもたらします。TiDBはオンラインDDLを活用してパフォーマンスと信頼性を強化しています。このセクションでは、高可用性の維持、スケーラビリティの確保、運用の柔軟性など、TiDBのオンラインDDLの実装が提供する具体的な利点を探ります。
- 高可用性:データベースの読み取りと書き込みが可能な状態を維持します。
- スケーラビリティ:大規模な分散データセットにおけるスキーマ変更を効率的に処理します。
- 運用の柔軟性:ダウンタイムを計画することなく、スキーマ変更を機能させます。
課題と留意点
TiDBのオンラインDDLには多くの利点がありますが、潜在的な課題や考慮すべき点を認識しておくことが重要です。これらを理解することで、スキーマ変更をより効果的に計画・実行することができます。このセクションでは、TiDBでオンラインDDLを使用する際のリソース使用への影響、特定のスキーマ変更の複雑さ、バージョン互換性の重要性について説明します。
- リソースの使用:オンラインDDL操作はリソースを大量に消費する可能性があります。パフォーマンスの問題を防ぐには、リソースの監視と管理が重要です。
- 複雑なスキーマの変更:変更によっては、慎重な計画と実行が必要になる場合があります。
- バージョンの互換性:TiDBのバージョンが、必要な特定のオンラインDDL操作をサポートしていることを確認してください。
結論
オンラインDDLは、現代のデータベースにおいて欠かせない機能であり、スキーマ変更を最小限のサービス中断で実現します。TiDBの堅牢な実装は、3段階のアプローチと同時実行操作のサポートにより、スキーマ変更中でも高い可用性とパフォーマンスを維持します。この機能を活用することで、組織は運用の柔軟性とスケーラビリティを確保でき、大規模な分散データベースの管理に最適な選択肢となります。
TiDBのオンラインDDLを理解し活用することで、データベース運用の効率性と信頼性を大幅に向上させることが可能です。これにより、企業は変化する要件に迅速に対応し、柔軟性を保つことができます。データベース管理戦略を検討する際、TiDBの高度な機能は、パフォーマンスや可用性を損なうことなくシームレスなスキーマ変更を実現する魅力的なソリューションを提供します。
データベース運用の効率性と信頼性を向上させたいですか?以下の詳しいガイドをご覧ください。ダウンタイムやサービス中断を解消し、ビジネスを妨げる要因に別れを告げましょう。
TiDB Cloud Dedicated
TiDB Cloudのエンタープライズ版。
専用VPC上に構築された専有DBaaSでAWSとGoogle Cloudで利用可能。
TiDB Cloud Serverless
TiDB Cloudのライト版。
TiDBの機能をフルマネージド環境で使用でき無料かつお客様の裁量で利用開始。