461
Help us understand the problem. What are the problem?

posted at

updated at

PlanetScaleというサーバレスDBが凄く勢いのあるサービスらしいのでQuick Startやってみた

PlanetScaleというサーバレスDBが凄く勢いのあるサービスと聞いて、公式にクイックスタートがあったのでやってみました。

環境

  • PC: MacBook Pro (Intel Core 2016)
  • OS: macOS Montery12.2.1

では概要から確認していきます。

サーバーレスDBとは

  • サーバがない、のではなく、サーバ管理や検討が不要
  • AWS Lambda(NoSQL)など

PlanetScaleとは

Screen Shot 2022-02-25 at 23.34.29.png

PlanetScale年表

  • 2010年頃
    • YouTubeが急激に成長し、データベースが爆発しそうになっていたので、Sugu氏ともう一人のYouTubeのエンジニアがオープンソースプロジェクト「Vitess.io」(ヴィテス)を立ち上げる
  • 2016年頃
    • MySQLでバイナリプロトコルを扱えるようにしたことで、VitessはYouTube以外の企業にとっても魅力的なシステムになり、引き合いが来るようになる
  • 2018年頃
    • Vitessの開発者Sugu Sougoumarane氏と、YouTubeのDBAマネージャーとしてVitessに関わったJitendra Vaidya氏が共同で設立
  • 2021年7月19日
  • 2021年11月
    • 総額1億500万ドル(約120億円)を調達

非常に勢いがありそうなのはなんとなく伝わります。

何を解決しようとしているのか

とある記事を見つけたので抜粋いたします。

PlanetScaleは、サーバーレスの現代において、クラウドベースのデータベースの単純性とパフォーマンスとスケーラビリティのバーを高くしました。データベースのデベロッパー体験は、あまりにも長く苦痛を感じるものでした。PlanetScaleは、その鎖を切ろうとしています。スケーラビリティと信頼性における長年の問題を、同社は極めてエレガントで趣味が良く便利な方法で解決しています。

出典元)https://jp.techcrunch.com/2021/06/24/2021-06-23-planetscale-raises-30m-series-b-for-its-database-service/

サービス概要

  • MySQL8を速くて簡単にスケーラブルに利用できるサービス
  • YouTubeやSlackなどでも利用されているVitess(ヴィテス)というMySQLの水平スケーリングシステムを利用しており、ノンブロッキングでスキーマ変更できる
  • ブランチ機能があり、GitのようにDBを管理できる
  • SQLはダッシュボード上か、CLI上で動かせてすぐ確認ができる
  • TablePlusなどのDBを確認できるツールと連携も可能
  • Rails / Laravel / Node.js / Prisma 向けのチュートリアルも充実している
  • 自動でバックアップも取る
  • 2022/02/25現在、日本語のソースはほとんどなさそう

水平スケーリングは、負荷の増減に合わせてサーバーの数を増やしたり(スケールアウト)減らしたり(スケールイン)する方法。クラウドと相性が良いアプローチだといえる。

ノンブロッキングとは、随時処理の確認と複数の処理を並行する処理。

ブランチ機能は面白そうだなと思いました。

利用事例

  • YouTube
  • Slack
  • Figma
  • GitHub
  • Square
  • New Relic
  • MyFitnessPal
  • Affirm
  • その他...

Screen Shot 2022-02-25 at 23.41.19.png

利用料金

  • 無料枠
    • ストレージ > 10GB
    • 読み込み > 1億回
    • 書き込み > 1000万回
    • コネクション > 1000
    • ブランチ > 3つ
    • 自動バックアップ > あり
    • オートスケーリング > なし
  • $29/月
    • ストレージ > 250GB
    • 読み込み > 5億回
    • 書き込み > 5000万回
    • コネクション > 10000
    • ブランチ > 10
    • 自動バックアップ > あり
    • オートスケーリング > あり
  • 以降は、$29/月の利用枠を超過した分だけ課金

個人で試してみるには無料枠でも十分そうです。

登録からDB作成まで

Screen Shot 2022-02-25 at 23.44.41.png

TOPページから「Sign in」をクリックすると、このような画面にくるので、
今回は「GitHub」と連携させてみます。

「GitHub」をクリックします。

Screen Shot 2022-02-25 at 23.45.18.png

利用規約を更新しました。更新された利用規約をお読みになり、同意してください。

と書かれているので「Accept Terms of Service」をクリックします。

Screen Shot 2022-02-25 at 23.46.03.png

すると、

GitHubに登録してあるメールアドレスへ承認メールを送ったよ

と言われるのでメールを確認します。

Screen Shot 2022-02-25 at 23.47.20.png

メールを確認すると、画像のようなメールが届いており、

アカウントの作成を完了するために、Eメールを確認してください。

と記載されているので、
Confirm email」をクリックします。

すると、以下のような画面に飛びます。

Screen Shot 2022-02-25 at 23.48.31.png

hogehogeというあなたのための組織を作りました。別の名前を使いたいですか?
と聞かれているので、別の名前を使う場合は、「use a different name」をクリックします。

今回はそのままで良いので、「See how PlanetScale works」をクリックしました。

ここからはPlanetScaleについて色々解説が始まります。
一応1つ1つ見てみます。

Screen Shot 2022-02-25 at 23.50.04.png

サーバーレスデータベース
MySQLの信頼性とオープンソースVitessのスケールを備えたフルマネージドデータベースを、わずか10秒で導入できます。内蔵のコネクションプーリングは、データベースへの接続制限に陥ることがないことを意味します。

Screen Shot 2022-02-25 at 23.54.35.png

PlanetScale独自のデータブランチ機能
データベースをコードのように扱う。本番データベースを即座にブランチして、スキーマの変更をテストするためのステージング環境を作成します。

Screen Shot 2022-02-25 at 23.55.31.png

ノンブロッキングスキーマの変更
PlanetScaleのノンブロッキングスキーマ変更機能により、スキーマ変更を本番環境に安全にデプロイすることができます。CI/CDプロセスの一部としてスキーマ管理を簡単に自動化できます。

Screen Shot 2022-02-25 at 23.56.46.png

デプロイリクエスト
デプロイリクエストは、スキーマの変更を提案し、チームからフィードバックを得ることができます。一行ごとのスキーマ差分により、変更点を簡単に確認することができます。
デプロイリクエストと GitHub プルリクエストをペアにして、コードとスキーマの変更を並行してレビューすることができます。

Screen Shot 2022-02-25 at 23.58.07.png

スキーマの変更をデプロイする
スキーマの変更が承認されると、デプロイメントキューに追加されます。PlanetScale はデプロイメントのタイムラインを提供し、キューに入れられたスキーマ変更がどれも衝突しないようにします。

Screen Shot 2022-02-25 at 23.58.43.png

インサイトとモニタリング
データベースの読み取りと書き込みを追跡するグラフで、本番環境のトラフィックを把握することができます。クエリ統計機能により、遅いクエリを特定し、最適化することができます。
データベースを作成し、PlanetScale ワークフローを開始します。

解説はここまでです。

Create your first database」をクリックします。

DB名とRegionを決める

DB作成のモーダルが表示されるので、Regionを「Asia Pacific Tokyo」にして、
Nameを任意のDB名にします。

Screen Shot 2022-02-25 at 23.59.46.png

DB名は、小文字の英数字でダッシュまたはアンダースコアを使用することもできます。

Screen Shot 2022-02-26 at 0.01.11.png

今回は「my-database」というDB名にしました。

これで、「Create Database」をクリックします。

Screen Shot 2022-02-26 at 0.01.59.png

しばらく待っているとDBが作成されてこのような画面になります。

上部のタブメニューは左から「概要 / リクエストのデプロイ / ブランチズ / 統計のクエリ / 設定」となっています。

画面左側は、「過去6時間」の状況が確認できます。
過去どこまで遡るかは、プルダウンで選択できます。

画面右側は、「テーブル / ブランチ数 / 接続数」が確認できます。

その下には、「毎月の使用量は7日間でリセットされます。プランのアップグレードで制限解除」
と記載されています。

さらにその下には、「次のバックアップは19時間後に実行されます。まだバックアップは実行されていません。」と記載されています。

Backupされている時の表示

Screen Shot 2022-02-26 at 0.03.21.png

Backupされていると、いつバックアップされたかが表示されます。

Quick Startやっていく

ここからは公式ドキュメントに「Quick Start」があったのでやっていきます。

とりあえずクエリを叩いてみる

まずは、ダッシュボードからクエリを叩いてみましょうということで、
タブメニューの「Branches」から「main」をクリックします。

Screen Shot 2022-02-26 at 0.05.12.png

すると、次の画面になります。

Screen Shot 2022-02-26 at 0.07.55.png

このデータベースには本番ブランチないけど、ブランチを本番環境に昇格させますか

というようなことが書かれているのですが一旦無視をして「Console」タブをクリックします。

テーブルの作成

すると、mainブランチに対して接続中という状態でコンソールが表示されますので、
クイックスタートに書かれている通りのクエリを入力してEnterを押してみます。

Screen Shot 2022-02-26 at 0.06.44.png

CREATE TABLE `users` (
  `id` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `email` varchar(255) NOT NULL,
  `first_name` varchar(255),
  `last_name` varchar(255)
);

続いては、テーブルが作成されたか確認します。

show tables;

Screen Shot 2022-02-26 at 0.08.34.png

無事テーブルが作成されました。

データの投入(INSERT)

テーブルが作成されたので、次はインサートしていきます。

Screen Shot 2022-02-26 at 0.10.09.png

INSERT INTO `users` (id, email, first_name, last_name)
VALUES  (1, 'hp@test.com', 'Harry', 'Potter');

SELECT * FROM users;

DESCRIBE users;

無事にハリーポッターがインサートされました。

mainブランチを本番用にして保護する

mainブランチを本番用にして、誤って削除などができないように保護します。
PlanetScaleではブランチを本番用にすることで、CREATEやDELETEなどができないように保護されます。

Screen Shot 2022-02-26 at 0.11.23.png

タブメニューの「Overview」をクリックして、mainブランチであることを確認したら、
Promote a branch to production」をクリックします。

すると、以下の画像のようなモーダルが出ますので、
Promote branch」をクリックします。

Screen Shot 2022-02-26 at 0.13.14.png

ここでは、以下の文言が書かれています。

本番用ブランチには、開発用ブランチと比較して、さらに多くのメリットがあります。
・スキーマの直接変更から保護される
・高い可用性
・自動定期バックアップ
この操作は元に戻すことができません。
管理者のみがプロダクションブランチを削除することができます。

新しい開発用ブランチを作成する

mainブランチが本番用に切り替わると、以下の画像のような画面になります。

Screen Shot 2022-02-26 at 0.14.40.png

画面真ん中には「mainはプロダクションブランチです」と書かれています。

その下は左から

プロダクションブランチとは何ですか?
本番用ブランチは、可用性が高いブランチです。削除は組織管理者のみ可能で、スキーマの変更はデプロイリクエストを経由する必要があります。

接続方法を教えてください。
上の接続メニューから、本番環境のアプリケーションをこのブランチに接続してください。

アップデートはどのように行うのですか?
mainブランチでスキーマを変更し、デプロイリクエストを発行してください。

と書かれています。

まずは、開発用のブランチを作りたいので「Create new branch」をクリックします。

ブランチ作成のモーダルが以下のように表示されますので、
今回は「develop」という名前で新規作成します。

Screen Shot 2022-02-26 at 0.16.40.png

Gitと同じように Base branch が選択できます。

入力内容に問題がなければ「Create branch」をクリックします。

無事作成されると以下のようになります。

Screen Shot 2022-02-26 at 0.18.22.png

DBに接続

続いては、DBに接続してみます。

先程の画面右上の「Connect」をクリックします。

Screen Shot 2022-02-26 at 0.19.23.png

すると、以下のようなモーダルが表示されます。

Screen Shot 2022-02-26 at 0.20.17.png

記載されている内容は以下の通りです。

以下は、このデータベースに接続するための詳細です。より詳細な情報が必要な場合は、ドキュメントを参照するか、サポートに連絡してください。

データベース認証の認証情報
初期作成後のパスワードは表示できません。

pscale CLI を使用して、ターミナルからデータベースを管理し、接続します。

今回、PlanetScale CLIを使うためインストールします。

PlanetScale CLIのインストール

今回はhomebrewで入れます。

brew install planetscale/tap/pscale

エラーが出た

インストール時に以下のようなエラーになりました。

原文
Error: Your Command Line Tools are too outdated.
Update them from Software Update in System Preferences or run:
  softwareupdate --all --install --force

If that doesn't show you any updates, run:
  sudo rm -rf /Library/Developer/CommandLineTools
  sudo xcode-select --install

Alternatively, manually download them from:
  https://developer.apple.com/download/all/.
You should download the Command Line Tools for Xcode 13.2.1.
翻訳
エラーが発生しました。コマンドラインツールが古すぎます。
システム環境設定のソフトウェア・アップデートから更新するか、以下を実行してください。
  softwareupdate --all --install --force

これでアップデートが表示されない場合は、実行してください。
  sudo rm -rf /Library/Developer/CommandLineTools
  sudo xcode-select --install

または、手動で以下からダウンロードしてください。
  https://developer.apple.com/download/all/。
Xcode 13.2.1用のコマンドラインツールをダウンロードする必要があります。

なので、 softwareupdate --all --install --force を実行します。
終わったら、もう一度 brew install planetscale/tap/pscale を実行します。

私の環境下ではそれでもエラーが解消されなかったので、以下を実行して完了までしばらく待ちます。

sudo rm -rf /Library/Developer/CommandLineTools
sudo xcode-select --install

みたび brew install planetscale/tap/pscale を実行します。

やっとインストールできたので、念のため pscale --version で確認します。

pscale --version

すると以下のように表示されました。

pscale version 0.89.0 (build date: 2022-01-24T18:17:47Z commit: 6405542)

無事インストールされていましたので、次のコマンドを叩きます。

pscale auth login
もしくは、
pscale signup
pscale signupの時はConnectをクリックした時の情報をターミナルで入力が必要

pscale auth login を叩くと、ブラウザ側で以下のサイトが開きます。

Screen Shot 2022-02-26 at 0.30.34.png

Confirm code」をクリックします。

するとターミナル側で Successfully logged in. と表示されており、
これだけでログインが完了します。

CLIで接続確認

ログインが完了したら、先に接続確認をしてみます。

ターミナルで以下のコマンドを実行します。

pscale shell <DB_name> <Branch_name>

今回例: pscale shell my-database develop

接続ができたら以下のようになります。

Screen Shot 2022-02-26 at 0.37.56.png

<DB_name>/<Branch_name> のように表示されていると思います。

インストール時に、もしMySQLがないと言わられたらインストールしましょう。

brew install mysql-client

再度データの投入をしておく

先ほど、 mainブランチ から新しく developブランチ を作成しましたが、データの中身は別 だったので、再度データを投入しておきます。

use users;

INSERT INTO `users` (id, email, first_name, last_name) VALUES  (1, 'hp@example.com', 'Harry', 'Potter');

select * from users;

exit

サンプルのNode.jsでDBへ接続する

続いては、サンプルのNode.jsからDBへ接続してみます。

以下のドキュメントを確認します。

GitHubからサンプルを取得することになるので取得します。

git clone https://github.com/planetscale/express-example.git

express-sampleフォルダが取得できるので、依存関係をインストールします。

npm install

以下のコマンドで接続を試みます。

pscale connect <DATABASE_NAME> <BRANCH_NAME> --execute 'node app.js'

今回例: pscale connect my-database develop --execute 'node app.js'

ちなみに、サンプルのapp.jsの中身は以下のような感じです。

require('dotenv').config();
const express = require('express')
const app = express()
const port = process.env.PORT || 3000

const mysql = require('mysql2')
const connection = mysql.createConnection(process.env.DATABASE_URL);

connection.connect()

app.get('/', (req, res) => {
  connection.query('SELECT * FROM users', function (err, rows, fields) {
    if (err) throw err

    res.send(rows)
  })
})

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`)
})

localhost:3000/ が立ち上がりますので、http://localhost:3000/ を開きます。

すると、先ほどインサートしたデータが表示されます。

Screen Shot 2022-02-26 at 0.46.56.png

.envファイルを作成してから接続する方法

先ほどのコマンドからではなく、.envで環境変数を用意してからの接続方法もあります。

mv .env.example .env で .env ファイルを作成して、中身を書き換えます。

"mysql://<USERNAME>:<PLAIN TEXT PASSWORD>@<ACCESS HOST URL>/<your-db-name>?ssl=true"

pscale password create <DATABASE_NAME> <BRANCH_NAME> <PASSWORD_NAME>

詳細は公式ドキュメントをご確認下さい。

まとめ(感想)

  • 個人で試すには無料枠でも十分なので試しやすい
  • ブラウザのダッシュボード上での操作やCLIから色々できたり使いやすそう
  • 自動バックアップは嬉しい
  • ブランチ機能ちゃんと理解して使うと良さそう

文献一覧

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
461
Help us understand the problem. What are the problem?