Heroku PostgresからCockroachDB Serverlessに移行する方法
まだご存知ないかもしれませんが、Herokuは無料プランを終了します。
この変更により、多くの開発者はHerokuが提供していたものを他の無料サービスに置き換えるために奔走することになりました。CockroachDBはHerokuの無料枠が提供するすべてを置き換えるわけではありませんが、Herokuが提供する無料のクラウドのPostgresデータベースを置き換えたい開発者は、すでにCockroachDB Serverlessという優れた代替品にアクセスできます。
なぜCockroachDBに移行するのか?
無料枠が充実している
Heroku Postgresの無料枠が存在した当時は無料でクラウドのPostgresインスタンスを提供していましたが、かなり多くの制限がついていました。例えばストレージの上限は1GB、行数の上限は10,000です。
CockroachDB Serverlessの無料枠では5GBの無料ストレージを使用でき、行数の制限もありません。無料ユーザーは毎秒100リクエストユニットの最低パフォーマンスを保証され、さらに毎月1000万RUの「バーストキャパシティ」が追加され、多くの小規模アプリを本番で無料で実行するのに十分です。
CockroachDB Serverlessはそのレベルのパフォーマンスが必要になったときのために、より柔軟な有料プランも提供しています。Herkouがあらかじめ定義された有料プラン(月額50ドル以下のものは1つだけ)しか提供しなかったのに対し、CockroachDB Serverlessではユーザーが自分のクラスタのカスタム月額リソース制限を設定し、使用状況に応じてその金額まで(ただしそれ以上は)月ごとに支払うことができます。
スケールアップが容易
CockroachDBはクラウドネイティブの分散データベースであるため、Postgresにはない方法で自動スケールのために構築されています。Heroku Postgresのスケーリングがアクティブ・パッシブ構成に依存しているのに対し、CockroachDBはアクティブ・アクティブで、サーバーレスデータベースは使用状況や事前に設定した支出限度額に基づいて自動的にスケールアップとダウンします。
CockroachDBとPostgresの比較については詳細を掘り下げたこのブログ記事をご覧ください。
pg_dumpを使用してHeroku Postgresからデータベースをエクスポートする方法
ありがたいことにHerokuからPostgresデータベースをエクスポートしてCockroachDB Serverlessにインポートするのはそれほど複雑ではありません。方法はいくつかありますが、この記事では多くのPostgresユーザーがすでに慣れ親しんでいるであろうpg_dump
とpsql
を使用するアプローチに焦点を当てます。
なお、Herokuでは20GBを超えるデータベースのエクスポートにはpg_dumpを推奨していません。Herokuの無料ユーザーであれば、これは問題ではないでしょう - Herokuの無料アカウントはデータベースストレージが1GBに制限されています。しかし、より大きなデータベースを持つ有料ユーザーだった場合、以下のステップではなくこれらのステップを実行する必要があります。
ステップ1:Heroku Postgresのスキーマとデータをダウンロードする。
まず、データベーススキーマのコピーと実際のデータのコピーの2つの別々のファイルをダウンロードする必要があります。
pg_dump
を使用してPostgresからこれらのダンプファイルを生成する方法に関するドキュメントはここにあります。HerokuはPGBackupsを介してpg_dump
とpg_restore
の両方をサポートしているので、Herokuでpg_dump
コマンドを実行してファイルを生成することができます:
heroku run 'pg_dump -s $DATABASE_URL' > schema.sql
heroku run 'pg_dump -a $DATABASE_URL' > data.sql
これで2つの.sql
ファイルが生成されます。1つはあなたのデータベースのスキーマで、もう1つはデータです。これはまさにデータとスキーマをCockroachDBにインポートするために必要なものです。
別の方法としてはHerokuからバックアップをダウンロード
psql
を使いたくない場合はHerokuを使ってバックアップを生成し、ダウンロードすることも可能です。(ただし、この場合はデータとスキーマの両方を含む1つのファイルが生成されることに注意してください。データベースのサイズによっては、後のステップでCockroachDBのスキーマ変換ツールを使うために手動で分離する必要があるかもしれません。)
heroku pg:backups:capture --app example-app
heroku pg:backups:download --app example-app
これは.dumpファイルをダウンロードするので、pg_restore
を使用してこれを.sqlファイルに素早く変換する必要があります(以下のパスとファイル名は、それぞれ.sqlファイルと.dumpファイルの希望のパスと実際のファイル名に置き換えてください):
pg_restore -f /path/file.sql /path/file.dump
CockroachDB Serverlessにデータベースをインポートする方法
ステップ2:CockroachDBクラウドアカウントを作成する
開始するには無料のCockroachDBクラウドアカウントを作成する必要があります。シングルサインオンのオプション(Google、Github、Microsoft)がいくつかあり、電子メールアドレスを使用してアカウントを作成することもできます。
ステップ3:無料のサーバーレスクラスターをスピンアップする
アカウントを作成したらログインしてクラスターページに移動します。"Create Cluster"ボタンをクリックし、次に以下のような希望するオプションを選択することになります:
- サーバーレスまたは専用 - 無料アカウントでは、サーバーレスを選択する必要があります。
- クラウドプロバイダー - AWSまたはGCPをどちらがよいか選択肢です。
- リージョン - 地理的に最も近いリージョンを選択することをお勧めします。
- 使用限度額 - 無料アカウントを作成するため、この設定を0ドルにしておきます。(リソース限度額を高く設定しても、5GBのストレージと2億5000万リクエストユニット(計算)を無料で利用できることに変わりはなく、ある月に無料の許容量を超えて使った分だけが請求されます。)
- クラスター名 - デフォルトの名前が生成されますが、必要に応じてカスタマイズすることができます。
オプションを選択したら"Create your free cluster"をクリックしてクラスターが作成されるのを5~10秒待ちます。
ステップ4:接続文字列を取得する
クラスターが作成されると接続ウィンドウが表示され、SQLのユーザー名を作成し、そのユーザー用のパスワードを生成するよう促されます。
このチュートリアルで必要なのは一般的な接続文字列で、接続ウィンドウの "Select language/option > general connection string" で確認できます。
これは次のようなものです(ただし、ユーザー名、パスワード、数字などは、先ほど作成したクラスタに固有のものです):
postgresql://username:password@free-tier11.gcp-us-east1.cockroachlabs.cloud:00000/defaultdb?sslmode=verify-full&options=--cluster%3Dcluster-name-0000
あとはその文字列を安全な場所にコピーして次のステップに進むだけです。
ステップ5:スキーマ移行ツールを使ってスキーマをインポートする
あるリレーショナル・データベースから別のデータベースへデータベース・スキーマをインポートするのは通常は手作業であり、苦痛を伴うことがあります。CockroachDBにはPostgresデータベースのこのプロセスをよりスムーズにするスキーマ変換ツールがあるので、手動でスキーマを調整するのではなく、それを使うことにします。
これを行うにはクラスターページから始めて、移行したい特定のクラスタをクリックします。
クラスターのページに移動すると左側のナビゲーションメニューに"Migrations"タブが表示されます。これをクリックすると次のようなマイグレーションページが表示されます:
このページでは.sql
ファイルを灰色のアップロードボックスにドラッグ&ドロップするだけで移行を開始することができます。
ファイルのアップロードは4MBに制限されていることに注意してください。大きなデータベースを使用している場合、ファイルの容量がこれより大きくなる可能性があります。しかし、心配しないでください。データベースをインポートすることができます!
PostgreSQLではスキーマのみのデータベースダンプをエクスポートすることができます(この方法の詳細についてはPostgresのドキュメントを参照してください)。これによりデータベーススキーマのみを含む、より小さな.sql
ファイルが作成されるはずです。スキーマ変換ツールを使用して、これをインポートすることができます。スキーマ変換ツールはINSERT
文やCOPY
文を処理しませんので、ステップ2で別途データをデータベースに取り込むことになりますが、まずスキーマを移行する必要があります。
.sql
ファイルをアップロードするとスキーマ変換ツールの処理に少し時間がかかり、次のようなページが表示されます:
データベーススキーマはそれぞれ異なるため移行ごとに結果は異なりますが、このページでは常に以下の2つを表示します:
- エラーの数。エラーの数は、移行を確定する前に解決する必要があります。
- 提案の数。これらは様々な理由で対処したい問題ですが、移行を確定するために対処する必要はありません。
ここから上部の"Statements"タブ、または下部の"View Statements"ボタンをクリックすると、このようなページが表示されます:
このページでは対処したい各記述について説明し、編集ボタンを押すことでこのページで直接調整することができます。
このページの記述はデータベースごとに異なるため、現時点ではステップバイステップの説明はできません。しかし、スキーマ変換ツールは何をする必要があるかを明確にし、その変更を容易にするはずです。
例えば、これらのスクリーンショットではHeroku Postgresを使用していたアプリケーションからダンプした実際のデータベースを移行していますが、唯一遭遇したエラーはそのデータベースにはCockroachDBクラスタにまだ存在しないユーザがいるということです。
"Add User"をクリックすると行方不明のユーザーのパスワードを生成するよう促されるので、これを実行するとすべてのエラーがクリアされます。
エラーがすべて処理されたらページの一番上までスクロールして"Retry Migration"をクリックします。移行が再び処理され、すべてのエラーがクリアされたので"Finalize Schema"ボタンをクリックすることができるようになります。
すると、スキーマにエラーがないことを確認するウィンドウが表示されます:
次をクリックすると新しいデータベースに名前(この場合はtest_db
)を付け、データベースを所有するユーザーを指定するよう求める別のウィンドウが表示されます。編集した.sql
ファイル(エラーが解決されたPostgresデータベースダンプのバージョンと、ステートメントページで行ったその他の変更点)をダウンロードすることもできますのでご注意ください。これはオプションで、このファイルはスキーマを確定した後でも利用できます:
"Finalize"をクリックすると詳細ページに戻りますが、左側のナビゲーションにある"Migrations"タブをクリックすると、メインの移行ページに戻り、移行が確定したことを確認することができます:
上の画像のStatus列にあるFINALIZED
という値に注目してください。
移行が完了したことをさらに確認するために左側のナビゲーションメニューから"Databases"をクリックするとtest_db
が表示され、正しい数のテーブルがリストされていることがわかります。
しかし、実際にデータベースに問い合わせるとテーブルには実際のデータがないことがわかります。これはスキーマ移行ツールがINSERT文やCOPY文を解釈しないためです。スキーマが正しく設定されたので、そのデータも取り込みましょう!
ステップ6:CockroachDB Serverlessにデータをインポートする
新しいデータベースのスキーマが設定されたらデータのインポートを行うにはさまざまな方法があります。以下に最も一般的な方法をいくつか紹介します。
オプション1:SQLシェルを使ってローカルファイルをインポートする
Postgresのdata.sql
ファイルのようなローカルに保存されたデータをシェルを使ってCockroachDBクラスタに直接インポートすることができます。(これは約15MB以下の小さなデータベースにのみ推奨されることに注意してください。より大きなデータベースの場合はIMPORTコマンドを使用するかAWS DMSを使用します)。
この方法ではCockroachDBのSQLクライアントをインストールする必要があります(まだインストールしていない場合)。どのクラスタのページからも"Connect"ボタンを押すとクライアントのダウンロードとインストールのためのコマンドにすぐにアクセスできます(まだインストールしていない場合)。
以下はこのコマンドがどのように見えるかの例ですが、Web上のCockroachDBクラウドアカウントに移動し、クラスタのページから"Connect"ボタンを押して正しいコマンドを取得するようにしてください、あなたがこの記事を読んでいる頃にはクライアントの最新バージョンが変更されているかもしれないからです。
curl https://binaries.cockroachdb.com/cockroach-v22.1.8.darwin-10.9-amd64.tgz | tar -xz; sudo cp -i cockroach-v22.1.8.darwin-10.9-amd64/cockroach /usr/local/bin/
一度インストールすれば、ローカルファイルからのインポートは非常に簡単です。このタスクにアプローチする方法はいろいろありますが、最もシンプルなのは先ほどインストールしたSQLクライアントをコマンドラインで使用して、次のように.sql
ファイルをデータベースにパイプすることでしょう:
cockroach sql --url "cluster connection string" < filepath/file.sql
上記のコマンドでは"cluster connection string"
を独自の接続文字列に置き換え、defaultdb
をスキーマの移行時に作成したデータベースの名前に置き換えておく必要があることを確認してください。このコマンドは、接続文字列で指定されたクラスタとデータベース内でステートメント.sqlファイルを実行します。
IMPORT
コマンドを使用する
オプション2:クラウドストレージでPostgresからのデータベース・ダンプを扱う場合、CockroachDBではIMPORT
コマンドを使用することができます。データを含む.sql
ファイルをどのようにインポートするかは、そのデータが保存されている場所によって異なります。以下では3つの主要なクラウドストレージプロバイダーそれぞれからPostgresまたはMySQLから.sql
ファイルをインポートするための基本コマンドを実行します。以下のコマンドではアカウントとアクセスのパラメータをすべて置き換えるだけでなく、.sql
ファイル名を実際の.sql
ファイルの名前に置き換える必要があることを覚えておいてください。
これらのコマンドはCockroachDB SQLシェル内、またはサーバーレスクラスターに接続してSQL文を実行できる他のツールから実行できます。
Amazon S3に格納されている場合
IMPORT PGDUMP 's3://{BUCKET NAME}/{customers.sql}?AWS_ACCESS_KEY_ID={ACCESS KEY}&AWS_SECRET_ACCESS_KEY={SECRET ACCESS KEY}'
WITH ignore_unsupported_statements;
Google Cloud Storageに保存されている場合
IMPORT PGDUMP 'gs://{BUCKET NAME}/{employees.sql}?AUTH=specified&CREDENTIALS={ENCODED KEY}'
WITH ignore_unsupported_statements;
Azure Storageに保存されている場合
IMPORT PGDUMP 'azure://{CONTAINER NAME}/{employees.sql}?AZURE_ACCOUNT_NAME={ACCOUNT NAME}&AZURE_ACCOUNT_KEY={ENCODED KEY}'
WITH ignore_unsupported_statements;
オプション3:AWS DMSなど他のツールを使う
CockroachDB Serverlessにデータを取り込む方法は他にもいろいろあります。例えば、より大規模で本番用のデータベースの場合はAWS DMSを使用することをお勧めします。
また、組み込みのPostgresツールのpsql
など他のツールを使用することも可能です:
psql 'your-connection-string-here' -f /path/file.sql
これを動作させるためにはyour-connection-string-here
を接続文字列(一重引用符の中)に、/path/file.sql
を.sqlファイルの正しいファイルパスに置き換える必要があります。
これで終わりです!
おめでとうございます!Heroku PostgresデータベースをCockroachDB Serverlessにインポートしました。アプリケーション内の適切な接続情報を変更して、新しいCockroachDBクラスタを指すようにします(さまざまな言語のクイックスタート手順はこちら)!
私たちはまたCockroachDB Serverlessがどのように機能するかについてもっと学ぶためにチェックアウトすることができる無料のサーバーレスデータベースとCockroachDB Serverless入門コースを用意しており、その過程でいくつかの無料のスワッグを得ることができます(この執筆時点では)!
Discussion