12k
All articles

スケーラブルなMySQLデータベースのためのPlanetScaleの活用

PlanetScaleでMySQLをスケーラブルに運用。Vitessによる拡張、DBブランチ、deploy request、無停止のスキーマ移行を解説。

OpenReplay Team
OpenReplay Team
スケーラブルなMySQLデータベースのためのPlanetScaleの活用

MySQLを使ったフルスタックアプリケーションを構築している場合、いずれは誰もが直面する問題に出会うでしょう。ローカルのデータベースは開発中は問題なく動作するものの、本番環境向けのMySQLサーバーを自前で運用するとなると、バックアップ、稼働時間、コネクション数の制限、そしてアプリをオフラインにしかねないスキーママイグレーションといった課題に向き合うことになります。PlanetScale は、こうした運用負担の大部分を取り除くために設計されたマネージドMySQLプラットフォームですが、単なるホスト型MySQLにとどまりません。本記事では、PlanetScaleの何が他と異なるのか、コアとなるワークフローがどのように機能するのか、そしてどのような場合に実際に採用する価値があるのかを解説します。

重要なポイント

  • PlanetScaleはVitessを基盤とするマネージドなMySQL互換プラットフォームであり、標準のMySQLにはない水平スケーリングとコネクションプーリングを提供します。
  • データベースブランチングによって、Gitライクなワークフローでスキーマ変更を扱え、デプロイリクエストと非ブロッキングなマイグレーションにより本番環境を停止せずに済みます。
  • 外部キーは非シャード構成のデータベースでは利用できますが、シャード構成では参照整合性をアプリケーション層で担保する必要があります。
  • PlanetScaleはサーバーレスアプリケーションや、安全でレビュー可能なスキーマ変更を必要とするチームにとって特に有用ですが、予算が限られた小規模プロジェクトにはオーバースペックとなる場合があります。

PlanetScaleの実態(そして標準MySQLとの違い)

PlanetScaleは、YouTubeで開発されたオープンソースのデータベースクラスタリングシステムであり、MySQLを多数のサーバーにわたって水平にスケールさせる目的で生まれた Vitess を基盤とするマネージドなMySQL互換データベースプラットフォームです。

この区別は重要です。PlanetScaleは素のMySQLではありません。アプリケーションは標準的なMySQL接続文字列を使って接続し、ほとんどのSQLはそのまま期待通りに動作します。しかし内部的には、Vitessが標準のMySQLにはない機能を追加しています。すなわち、大規模なコネクションプーリング、水平シャーディングへの対応、そして非ブロッキングなスキーマ変更です。

ほとんどのフロントエンドおよびフルスタック開発者にとっての実践的な要点はこうです。PlanetScaleは、本来であれば専任のデータベース管理者が必要となるようなインフラの複雑さを引き受けてくれます。

Vitessが実現する水平スケーリング

単一のMySQLサーバーには厳しい制限があります。コネクション数、書き込みスループット、そしてクエリが遅くなる前にテーブルが成長できるサイズなどです。Vitessは、複数の基盤MySQLインスタンスにクエリを分散させるプロキシ層として機能することで、この問題に対処します。

実際のところ、これによりPlanetScaleはコネクションのスパイクをスムーズに処理できます。これは特に、Cloudflare WorkersVercel Functions のような関数が数千の同時接続を開く可能性のあるサーバーレス環境で有用です。Vitessは内部でこれらの接続をプーリングするため、データベースが圧倒されることがありません。

ここで明確にしておきたいのは、これがすべての制限を取り払う魔法のような水平スケーリングではないという点です。シャーディングには独自の複雑さが伴い、ほとんどの中小規模アプリケーションでは必要ありません。しかし、このアーキテクチャのおかげで、PlanetScaleはあとでプラットフォームを再構築する必要なくアプリケーションと共に成長できます。

データベースブランチングとデプロイリクエストのワークフロー

PlanetScaleの最も開発者フレンドリーな機能の1つが、データベースブランチングです。これはスキーマ変更のためのGitライクなワークフローを提供します。

実際の動作は以下のとおりです。

  1. 本番データベースは保護された本番ブランチ上で動作します。PlanetScaleは、本番ブランチに直接適用するのではなく、デプロイリクエストと安全なマイグレーションを通じてスキーマ変更を行うことを推奨します。
  2. スキーマの隔離されたコピーである開発ブランチを作成し、そこで変更を加えてテストします。
  3. 準備ができたら、スキーマ変更を本番にマージするためのデプロイリクエストをオープンします。
  4. PlanetScaleは非ブロッキングなスキーママイグレーションを使ってこれらの変更を適用するため、プロセス全体を通じて本番データベースはオンラインのままです。

このワークフローは、本番障害のよくある原因を排除します。すなわち、大きなテーブルに対して ALTER TABLE を実行して数分から数時間にわたって書き込みをロックしてしまう、という事態です。PlanetScaleなら、このリスクはプラットフォームレベルで管理されます。

外部キー、シャーディング、MySQL互換性に関する考慮点

PlanetScaleは非シャードデータベースでの外部キー制約をサポートしており、これはほとんどのユースケースをカバーします。シャーディングを有効にした場合、シャードをまたぐテーブル間での外部キーはサポートされません。これはVitessがデータを分散させる方法に起因する根本的な制約です。シャード構成では、参照整合性をアプリケーション層で担保する必要があります。

Prisma を使用している場合は、relationMode = "prisma" を設定することで、データベースレベルの外部キーに依存せずにリレーションをエミュレートでき、外部キー列にインデックスを手動で追加することで遅いクエリを回避できます。

PlanetScaleが適している場面と適さない場面

PlanetScaleが適しているのは次のような場合です。

  • 単一のデータベースサーバーを超えたスケーリングが必要なアプリケーションを構築している。
  • ツール自体を自分で管理することなく、非ブロッキングなスキーマ変更を行いたい。
  • 接続パターンが予測しにくいサーバーレス環境で開発している。
  • データベースのスキーマ変更について、構造化されたレビュー可能なワークフローを求めている。

一方、再考の余地があるのは次のような場合です。

  • アプリケーションが小規模で、AWS RDS のようなプロバイダや他の競合サービスの単一マネージドMySQLインスタンスを越える可能性が低い。
  • 予算が限られている。PlanetScaleの価格はエンタープライズグレードのプラットフォームに見合ったものになっています。
  • Vitessが完全にはサポートしていないMySQLの機能に大きく依存している。

アプリケーションの接続

PlanetScaleはブランチごとに標準的なMySQL接続文字列を提供します。これを環境変数として保存し、任意のMySQL互換ドライバやORMで接続できます。

DATABASE_URL='mysql://username:password@aws.connect.psdb.cloud/your-database?sslaccept=strict'

これは PrismaDrizzle ORM、生の mysql2 接続、その他ほとんどのMySQLクライアントで動作します。サーバーレス環境向けには、PlanetScaleは永続的なTCP接続を完全に回避するHTTPベースのサーバーレスドライバも提供しています。

まとめ

PlanetScaleは、フルスタック開発者に対して、プロダクションレディかつスケーラブルなMySQLプラットフォームを提供します。データベースブランチング、デプロイリクエスト、非ブロッキングマイグレーションといった開発者向けワークフローにより、スキーマ変更を本番に投入するリスクを軽減します。すべてのプロジェクトに最適なツールというわけではなく、Vitessを基盤としているため、MySQLと「同一」ではなく「互換」の動作を扱うことになります。しかし、スケールとスキーマの安全性が重要なアプリケーションにおいては、本来チームが負うべき多大な運用上の複雑さを取り除いてくれます。

FAQ

PlanetScaleはどのMySQL ORMやドライバでも利用できますか?

はい。PlanetScaleは標準的なMySQL接続文字列を公開しているため、Prisma、Drizzle ORM、TypeORM、Sequelize、mysql2のような生のドライバを含む、あらゆるMySQL互換クライアントが動作します。唯一の注意点は、PlanetScaleがVitess上で動作しているため、一部の高度なMySQL機能が異なる挙動を示す可能性がある点です。サーバーレスワークロード向けには、永続的なTCP接続を回避するHTTPベースのドライバも提供されています。

なぜPlanetScaleはシャードデータベースで外部キーを制限するのですか?

シャーディングが有効になっている場合、Vitessは複数のMySQLインスタンスにデータを分散します。そのため、別のシャード上の行を参照する外部キーをデータベースレベルで効率的に強制することはできません。これは水平スケーリングのためのアーキテクチャ上のトレードオフです。非シャードデータベースでは外部キーは通常通り動作します。シャード構成では、参照整合性をアプリケーションコードやORM層で担保することになります。

非ブロッキングなスキーママイグレーションは実際どのように機能しますか?

PlanetScaleはVitessを使い、元のテーブルをロックすることなくバックグラウンドでスキーマ変更を適用します。テーブルのシャドウコピーを作成し、そこで変更を適用し、データをコピーした上で、テーブルをアトミックに入れ替えます。これにより、大きなテーブルへのカラム追加やインデックス作成のような操作が、ダウンタイムや書き込みロックなしで行えます。ALTER TABLEを直接実行するのに比べて大幅な改善です。

PlanetScaleは小規模なサイドプロジェクトに適していますか?

適している場合もありますが、価格設定と機能セットはスケーリング、ブランチング、安全なマイグレーションの恩恵を受ける本番アプリケーションを念頭に置いて設計されています。トラフィックが予測可能な小規模なサイドプロジェクトであれば、AWS RDS、DigitalOcean、または類似のプロバイダの基本的なマネージドMySQLインスタンスの方がコスト効率が良いかもしれません。PlanetScaleは、そのワークフローやスケーリング特性が本当に必要な場合に選択しましょう。

DevTools for the frontend

Gain Debugging Superpowers

Unleash the power of session replay to reproduce bugs, track slowdowns and uncover frustrations in your app. Get complete visibility into your frontend with OpenReplay — the most advanced open-source session replay tool for developers.

Star on GitHub12k

We use cookies to improve your experience. By using our site, you accept cookies.