Bytebase はオープンソースのデータベース DevOps ツールです。ソフトウェア開発ライフサイクル (SDLC) を通じてデータベースを管理する「GitLab」のような存在として、開発者と DBA が安全かつ効率的にデータベース変更を協働・実行できるウェブベースのワークスペースを提供します。
データベーススキーママイグレーションは、開発者と DBA にとって最もよくある操作の 1 つです。同時に最も難しい操作の 1 つでもあります。さらに厄介なことに、大規模テーブルではスキーママイグレーションに数時間、ときには数日かかります。通常のスキーママイグレーションはテーブルをロックし、サービスを停止させてしまいます。多くのビジネスにとって、これほどのダウンタイムは許容できません。これを解決するために、業界はさまざまなオンラインスキーマ変更ソリューションを生み出してきました。
これらを採用することで、チームはスキーママイグレーションのダウンタイムを数日や数時間から数秒にまで縮められます。一方で、これらのツールの運用には依然として高い専門性が要求され、利用は熟練 DBA に限られがちです。開発者は DBA に依頼してオンラインスキーマ変更を代行してもらうしかありませんでした。
Bytebase は DevOps チームのためのデータベースツールであり、この強力なオンラインスキーマ変更能力を開発者の手にも届けたいと考えています。
本記事では、gh-ost をベースにした Bytebase のオンラインスキーママイグレーションソリューション (ベータ版) を紹介します。Bytebase は段階的な UI と継続的な進捗更新を備え、マイグレーションのプロセス全体を見渡せます。
なぜ gh-ost を選んだか
既存のオンラインスキーマ変更ソリューションは、おおむね共通のワークフローを持ちます。

- 元テーブルとまったく同じスキーマを持つ新しい空テーブル (ghost/shadow テーブル) を作成する
- ghost テーブルにスキーママイグレーションを適用する
- 元テーブルから既存行を ghost テーブルへコピーする
- 進行中の元テーブルへの変更を捕捉し、継続的に ghost テーブルへ適用する
- 元テーブルと ghost テーブルを入れ替える
なぜ Bytebase に gh-ost を統合することにしたのか? 最大の理由は、gh-ost が MySQL 向けのトリガレスのオンラインスキーママイグレーションソリューションだからです。gh-ost はバイナリログストリームを使ってテーブル変更を捕捉し、それを非同期で ghost テーブルに適用します。これにより、トリガやロック競合に起因する性能オーバーヘッドを避けられます。さらに、gh-ost はマイグレーションプロセスへの制御性が高く、Bytebase はその制御を活用して、gh-ost のパラメータを通じた良い UX と進捗の可視化を実現できます。
大規模テーブルでオンラインスキーママイグレーションを行うには
Bytebase は 2 種類のスキーママイグレーションを提供します: 通常のマイグレーションと gh-ost。Issue を作る 3 ステップで操作できます。ここでは gh-ost を使ってスキーマを変更する例を見ていきます。
下のスクリーンショットは、スキーママイグレーション適用前のテーブル「sbtest1」の情報です。カラムは 4 つ、データは 694 MB あります。

ステップ 1: gh-ost Issue を作成する
-
データベース詳細ページで Alter Schema をクリック。

-
Online migration を選んで Next をクリック。

-
タスク「Sync data」用の SQL ステートメントを入力し、レビュワーを選んで Create をクリック。

ステップ 2: タスク「Sync data」を実行する。
指定されたレビュワーが Approve をクリックすると、タスク「Sync data」が走ります。下のスクリーンショットでは「Sync data」の進捗が 59% です。

ステップ 3: タスク「Switch tables」を実行する。
下のスクリーンショットでは最初のタスクが完了しています。

次に指定されたレビュワーが Approve をクリックして、2 つ目のタスク「Switch tables」を実行します。

gh-ost の結果はこちら。データベースで gh-ost が成功したことを示しています。

さらに学ぶ
Bytebase は gh-ost をベースにした大規模テーブル向けオンラインスキーママイグレーションを提供します。gh-ost はトリガレスのオンラインスキーママイグレーションソリューションで、アプリケーションのダウンタイムを数時間から数秒に削減できます。段階的な UI と継続的な進捗更新により、マイグレーションプロセス全体を見渡せます。詳しくはドキュメントをご覧ください。
ご意見・ご感想はGitHub の Issue ボードからお寄せください。