Heroku Postgres データベースのプランまたはインフラストラクチャの変更
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2024年05月29日(水)
この記事では、Heroku Postgres データベースのプランまたは基礎となるインフラストラクチャを変更するために使用可能な方法について説明します。
この記事では、PostgreSQL プランとインフラストラクチャをアップグレードするプロセスについて説明しますが、それにより、場合によっては PostgreSQL バージョンも変更される可能性があります。PostgreSQL バージョンのアップグレードのみを行いたい場合は、「Heroku Postgres データベースのバージョンのアップグレード」を参照してください。
Heroku では、Postgres プランとインフラストラクチャを変更するための 3 つの方法がサポートされています。いずれの方法でも、更新中のデータ損失を防ぐために、ある程度のアプリケーションのダウンタイムが必要です。
アップグレード方法 | 説明 |
---|---|
heroku addons:upgrade | 説明: メジャー PostgreSQL バージョンを保持しながら、本番データベースのプランとインフラストラクチャを更新します。 互換性のあるプラン: すべての Heroku Postgres プランで動作します。このコマンドを使用すると、Essential 層のデータベースをその層内の別のプランに変更できます。Essential 層のデータベースを他の層のプランにアップグレードするには、代わりに pg:copy を使用します。必要なダウンタイム: 代替データベースを準備するための最大数時間 (その間、アプリケーションをアクティブなままにすることができる) と、切り替え中の 1 分未満のダウンタイムが必要です。 フォロワーデータベース: すべてのデータベースフォロワーが新しいプライマリを再び指すようにします。 |
フォロワーの切り替え | 説明: メジャー PostgreSQL バージョンを保持しながら、本番データベースのプランとインフラストラクチャを更新します。 互換性のあるプラン: Standard、Premium、Private、または Shield 層のデータベースでのみ動作します。 バージョンアップグレード: PostgreSQL のマイナーバージョンを最新の使用可能なバージョンにアップグレードするために使用できます。 必要なダウンタイム: フォロワーデータベースを準備するための最大数時間 (その間、アプリケーションをアクティブなままにすることができる) と、切り替え中の 1 分未満のダウンタイムが必要です。 フォロワーデータベース: 新しいプライマリを指すようにするには、フォロワーの再作成が必要です。 一般には、フォロワーが再び指すだけであることや、メンテナンス実行のための Heroku で制御されるメカニズムのために、 addons:upgrade の方がフォロワーの切り替えより推奨されます。 |
pg:copy | 説明: すべての更新シナリオで動作します。非推奨 mini または basic データベースに関連するすべてのバージョン変更のため、または Essential 層のデータベースを別の層のプランにアップグレードするために必要です。バージョンアップグレード: メジャー PostgreSQL バージョンをアップグレードするために使用できます。 必要なダウンタイム: GB あたり約 3 分のダウンタイムが必要ですが、この量は大きく変動する場合があります。 フォロワーデータベース: 新しいプライマリを指すようにするには、フォロワーの再作成が必要です。 |
addons:upgrade での更新
Essential 層
Essential 層のデータベースプランを同じ層の別のプランに変更するには、addons:upgrade
を実行すると、定期的なメンテナンスを待ったり実行したりすることなく、すぐにアップグレードが開始されます。
$ heroku addons:upgrade HEROKU_POSTGRESQL_CRIMSON_URL heroku-postgresql:essential-0 -a example-app
Changing HEROKU_POSTGRESQL_CRIMSON_URL on example-app from heroku-postgresql:mini to heroku-postgresql:essential-0... done, ~$0.007/hour (max $5/month)
Your database's plan is being changed from mini to essential-0.
addons:upgrade
を実行して essential-*
プランにアップグレードすると、データベースは読み取り専用モードに設定されるため、アップグレード中に書き込みは行われません。アップグレードを開始する前にアプリをメンテナンスモードにして、アップグレードプロセス中にデータベースに新しいデータが書き込まれないようにすることもできます。このアップグレードにより、選択した Essential プランの新しいデータベースにデータが転送され、環境設定が新しい Essential データベースを指すように更新されます。
Standard 層およびそれ以上
addons:upgrade
でデータベースを更新するには、次のようにします。
- データベース上で
heroku addons:upgrade
を実行します。 - スケジュールされたメンテナンスを実行する (または待機する)
addons:upgrade
での更新にはアプリのダウンタイムはほとんど必要ありません (通常は 1 分未満)。ただし、切り替えの前に、代替データベースの準備に数時間かかる (その間、アプリケーションは引き続きアクティブなまま) 場合があるため、それに応じて計画してください。
1.heroku addons:upgrade
コマンドを実行する
このコマンドは、データベースをプランのアップグレードのために準備します。このプロセスは即時的ではなく、大規模なデータベースの場合は数時間かかる可能性があります。
$ heroku addons:upgrade HEROKU_POSTGRESQL_LAVENDER_URL heroku-postgresql:premium-4 -a example-app
Changing HEROKU_POSTGRESQL_LAVENDER_URL on tc-data-test from heroku-postgresql:standard-0 to heroku-postgresql:premium-4... done, ~$1.042/hour (max $750/month)
Your database's plan is being changed.
This triggers a maintenance that you can run with `heroku data:maintenances:run`.
データベースでアップグレードの準備ができると、データベースの次回のスケジュールされたメンテナンスに関するメールを受信します。
2. スケジュールされたメンテナンスを実行する (または待機する)
準備ができると、addons:upgrade
コマンドは、データベースでアップグレードを実行するメンテナンスのためにデータベースをスケジュールします。
このプロセスは、「Heroku Postgres のメンテナンスウィンドウ」で説明されているメンテナンスメカニズムと同じです。
データベースでメンテナンスを実行する準備ができたら、「Running maintenance manually」(手動でのメンテナンス実行) を参照してください。メンテナンスが完了すると、データベースは、新しいプランに一致するハードウェア上で動作します。
データベースに 1 つ以上のフォロワーがある場合は、アップグレードメンテナンスが発生すると、Heroku はそれらのフォロワーが代替データベースを指すようにしようとします。フォロワーが代替データベースを指すようにするには、フォロワーデータベースを再起動する必要があります。状況によって、フォロワーが代替データベースを指すようにすることができない場合は、別の代替データベースが自動的に準備されてプロモートされます。
アップグレードを停止する場合は、このヘルプ記事を参照してください。
フォロワーの切り替えでの更新
フォロワーの切り替えでデータベースを更新するには、次のようにします。
- 変更先のプランでフォロワーデータベースをプロビジョニングし、それがプライマリデータベースに追いつくまで待ちます。プランの基礎となるハードウェアを更新するための変更を行う場合は、データベースの現在のプランと同じプランを選択します。
- アプリをメンテナンスモードにします。
- フォロワーをフォロー解除して、プライマリデータベースにプロモートします。
- メンテナンスモードを終了します。
フォロワーの切り替えにアプリのダウンタイムはほとんど必要ありません (1 分未満)。ただし、切り替えの前に、フォロワーデータベースの準備に数時間かかる (その間、アプリケーションは引き続きアクティブなまま) 場合があるため、それに応じて計画してください。
1. フォロワーデータベースをプロビジョニングする
データベースのフォロワーを作成し、そのフォロワーがプライマリデータベースに追いつくまで待ちます。
$ heroku addons:create heroku-postgresql:standard-2 --follow HEROKU_POSTGRESQL_LAVENDER_URL --app sushi
Creating heroku-postgresql:standard-2 on sushi... $200/month
! WARNING: Follower will become available for read-only queries when up-to-date.
Use `heroku pg:wait` to track status.
postgresql-shaped-12345 is being created in the background. The app will restart when complete...
Use heroku addons:info postgresql-shaped-12345 to check creation progress
$ heroku addons:wait
Creating postgresql-shaped-12345... done
Created postgresql-shaped-12345 as HEROKU_POSTGRESQL_WHITE_URL
フォロワーは、プライマリデータベースまで 200 コミット以内のときに “追いついた” と見なされます。フォロワーが遅れているコミット数は、pg:info
コマンドを使用して確認できます (フォロワーデータベースの Behind By
行を参照)。
$ heroku pg:info --app sushi
=== HEROKU_POSTGRESQL_LAVENDER
Plan: Standard 0
Status: Available
...
=== HEROKU_POSTGRESQL_WHITE
Plan: Standard 2
Status: Available
...
Following: HEROKU_POSTGRESQL_LAVENDER (DATABASE_URL)
Behind By: 125 commits
2. データベースの書き込みを防止するためにメンテナンスモードにする
アップグレードプロセス中に、新しいデータは新しいデータベースに転送されないため、現在のプライマリデータベースに新しいデータが書き込まれないようにすることが重要です。これを行うには、アプリをメンテナンスモードにします。スケジューラージョブも実行されている場合は、これを無効にします。
メンテナンスモードでは、dyno が自動的にはスケールダウンされません。どの接続もデータベースにデータを書き込んでいないようにするために、Web dyno や Web 以外の dyno をスケールダウンします (heroku ps:scale worker=0
など)。
更新しているデータベースが Heroku Connect で使用されている場合は、この接続がデータベースにデータを書き込まないようにするために、この時点で同期を一時停止してください。手順は、「Heroku Connect: データベースのアップグレード」に記載されています。
アップグレードプロセスのこの時点で、アプリケーションは起動できなくなります。
$ heroku maintenance:on
Enabling maintenance mode for sushi... done
3. フォロワーデータベースをプロモートする
メンテナンスモードになり、プライマリデータベースに追加データが書き込まれていない状態になったので、フォロワーデータベースをプロモートして現在のプライマリデータベースから引き継ぐことができます。
フォロワーデータベースがプライマリに完全に追いつくまで待ちます (0 commits
遅れていることで示される)。
$ heroku pg:info --app sushi
=== HEROKU_POSTGRESQL_LAVENDER_URL
Plan: Standard 0
Status: available
...
=== HEROKU_POSTGRESQL_WHITE_URL
Plan: Standard 2
Status: available
...
Following: HEROKU_POSTGRESQL_LAVENDER_URL (DATABASE_URL)
Behind By: 0 commits
フォロワーが追いつき、新しいデータが生成されなくなったら、unfollow
コマンドを発行して、フォロワーを完全な書き込み可能なデータベースに変換します。
$ heroku pg:unfollow HEROKU_POSTGRESQL_WHITE_URL --app sushi
▸ WARNING: Destructive action
▸ postgresql-shaped-12345 will become writeable and no longer follow HEROKU_POSTGRESQL_LAVENDER. This cannot be undone.
▸
▸ To proceed, type sushi or re-run this command with --confirm sushi
> sushi
postgresql-shaped-12345 unfollowing... done
フォロー解除が成功すると、pg:info
により、データベースがその親のフォークになったことが示されます (Forked From: HEROKU_POSTGRESQL_LAVENDER
)。
新しいデータベースで読み書き可能な接続の準備ができると false
を返す SQL コマンド SELECT pg_is_in_recovery();
を実行することによって、データベースが読み取り専用モードでなくなったことも確認できます。
次に、それをプロモートして、アプリケーションによって使用されるプライマリデータベース (場所は DATABASE_URL
) として設定します。
$ heroku pg:promote HEROKU_POSTGRESQL_WHITE_URL --app sushi
Promoting HEROKU_POSTGRESQL_WHITE_URL to DATABASE_URL on sushi... done
これで、フォロワーデータベースがプライマリデータベースになりました (ただし、アプリケーションはまだ新しいリクエストを受信していない)。
元のプライマリデータベースが複数のアプリにアタッチされていた場合は、heroku addons:attach
を使用して新しいデータベースをこれらのアプリにアタッチする必要があります。
切り替えの後、元のプライマリデータベースの他のフォロワーは、新しいプライマリのフォローを自動的に開始するようにはなりません。新しいプライマリデータベースを指すようにフォロワーを再作成する必要があります。
必要に応じて、新しいプライマリデータベースのフォロワーを作成してください。
$ heroku addons:create heroku-postgresql:standard-0 --follow DATABASE_URL -a sushi
古いフォロワーが必要なくなったら、必ずプロビジョニング解除してください。
古いプライマリが接続プールを使用していて、デフォルト名の DATABASE_CONNECTION_POOL
でアタッチされていた場合、プロモートにより、接続プーラーは同じ名前 DATABASE_CONNECTION_POOL
で新しいプライマリに再アタッチされます。
デフォルト以外の名前のアタッチメントは再アタッチされません。新しいプライマリでも、古いプライマリと同じデフォルト以外の名前で接続プールを使用する場合は、新しいプライマリで接続プールをアクティブ化する必要があります。
$ heroku pg:connection-pooling:attach DATABASE_URL --as MY_DATABASE_CONNECTION_POOL -a sushi
4. メンテナンスモードを終了する
通常のアプリケーション動作を再開するには、Web dyno 以外のスケールを元のレベルに戻します。たとえば、worker
dyno を以前スケールダウンした場合、heroku ps:scale worker=1
を使用してそれを今度は元の状態にスケールアップします。
最後に、メンテナンスモードをオフにします。
$ heroku maintenance:off
Disabling maintenance mode for sushi... done
アプリケーションが、更新されたデータベースインスタンスへのリクエストを受信するようになりました。heroku pg:info
を実行して、メンテナンスモードがオフになっていることを確認できます。DATABASE_URL
で示されるデータベースはプライマリデータベースとみなされます。
Heroku Postgres データベースが Heroku アプリケーションに接続されていない場合は、HEROKU_POSTGRESQL_WHITE_URL
を取得し、それをプライマリデータベースとして使用するようにアプリケーションを更新する必要があります。
pg:copy での更新
pg:copy
コマンドでは、サポートされているすべての Heroku Postgres プランおよびバージョン間での更新がサポートされます。さらに、これは 非推奨 mini
または basic
Essential 層のデータベース に関連するバージョン変更のため、または Essential 層のデータベースを別の層のプランにアップグレードするためにサポートされている唯一の方法です。
pg:copy
を使用するための手順は、「Upgrading Heroku Postgres Databases」(Heroku Postgres データベースのアップグレード) で参照できます。
古いプライマリデータベースのプロビジョニング解除
フォロワーの切り替えまたは pg:copy
のどちらかでデータベースを更新した後、古いプライマリデータベースを必ずプロビジョニング解除してください。
$ heroku addons:destroy HEROKU_POSTGRESQL_LAVENDER_URL
古いプライマリデータベースに関連付けられていたデータクリップを新しいデータベースに再割り当てする必要があります。すべての回復可能なデータクリップを解決するには、「Dataclip recovery」(データクリップのリカバリ) の手順に従ってください。