🚐

Heroku PostgresからCockroachDB Serverlessに移行する方法

2023/04/06に公開約11,200字

https://www.cockroachlabs.com/blog/migrate-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_dumppsqlを使用するアプローチに焦点を当てます。

なお、Herokuでは20GBを超えるデータベースのエクスポートにはpg_dumpを推奨していません。Herokuの無料ユーザーであれば、これは問題ではないでしょう - Herokuの無料アカウントはデータベースストレージが1GBに制限されています。しかし、より大きなデータベースを持つ有料ユーザーだった場合、以下のステップではなくこれらのステップを実行する必要があります。

ステップ1:Heroku Postgresのスキーマとデータをダウンロードする。

まず、データベーススキーマのコピーと実際のデータのコピーの2つの別々のファイルをダウンロードする必要があります。

pg_dumpを使用してPostgresからこれらのダンプファイルを生成する方法に関するドキュメントはここにあります。HerokuはPGBackupsを介してpg_dumppg_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ファイルを実行します。

オプション2:クラウドストレージでIMPORTコマンドを使用する

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

ログインするとコメントできます