Heroku Postgres のメンテナンス
最終更新日 2024年04月15日(月)
Table of Contents
Heroku では、Heroku Postgres データベースのメンテナンスタスクを実行する場合があります。一般的なタスクには、データベースの基礎となるインフラストラクチャの更新があります。たとえば、オペレーティングシステムや必要なライブラリへのパッチ適用、Postgres 自体のアップグレードなどがあります。Heroku ではこれらのメンテナンスタスクを自動的に処理します。
また、データメンテナンス CLI プラグインのコマンドを使用して、メンテナンスウィンドウを指定したり、手動でメンテナンスを実行したりできます。この記事の data:maintenances:*
コマンドを実行する前にプラグインをインストールしてください。
メンテナンスを実行するには 3 つの方法があります。
メンテナンスウィンドウは、Essential 層プランを除くすべての Heroku Postgres データベースプランで使用できます。
データメンテナンス CLI プラグインのコマンドは、pg:maintenance
コマンドの機能を改善および拡張したものです。pg:maintenance
コマンドはまだ使用できますが、Heroku では、これらを非推奨にしてデータメンテナンス CLI プラグインのコマンドに置き換えることを計画しています。
必要なメンテナンスの確認
データベースのメンテナンスが必要かどうかは、pg:info
を使用して確認できます。
$ heroku pg:info -a example-app
=== DATABASE_URL
Plan: Standard 4
Status: Available
Data Size: 26.1 MB
...
Maintenance: required by 2018-05-04 21:00:00 +0000
Maintenance: scheduled for 2018-05-01 14:30:00 +0000, required by 2018-05-04 21:00:00 +0000, replacement currently being prepared
Maintenance window: Tuesdays 14:30 to 18:30 UTC
data:maintenances:info
コマンドで確認することもできます。
$ heroku data:maintenances:info DATABASE -a example-app
Fetching maintenance... done
addon_attachments: DATABASE_URL
addon_description: Standard Non-HA
addon_kind: heroku-postgresql
addon_name: postgresql-octagonal-1234
addon_plan: standard-0
addon_window: Mondays 14:30 to 18:30 UTC
app_name: example-app
method: changeover
reason: routine_maintenance
required_by: 2023-06-30T10:10:13.831+00:00
scheduled_for: 2023-06-12T14:30:00.000+00:00
server_created_at: 2023-05-10T14:52:33.871+00:00
status: preparing
window: Mondays 14:30 to 18:30 UTC
Postgres の重要なセキュリティパッチや、基盤となるソフトウェアおよびハードウェアのメンテナンスのため、Heroku Postgres データベースは定期的に更新されます。メンテナンスタスクは少なくとも 90 日ごとに実行されます。
メンテナンスウィンドウの設定
データベースをプロビジョニングすると、デフォルトのメンテナンスウィンドウは月曜日から金曜日の 18:00 ~ 23:00 UTC (10:00 ~ 15:00 PT) に設定されます。Standard、Premium、Private、Shield の Heroku Postgres プランのメンテナンスウィンドウを指定できます。ウィンドウが始まる曜日と時刻 (UTC) を指定できます。
$ heroku data:maintenances:window:update DATABASE Sunday 14:30 -a example-app
メンテナンスウィンドウを設定すると、メンテナンスがアプリケーションとユーザーに及ぼす影響が最小化されます。メンテナンスイベントがビジネスに及ぼす影響が最も小さい時期を選ぶことをお勧めします。
次回のメンテナンスウィンドウの日時を知らせるメールが届きます。日時は heroku data:maintenances:info
コマンドを使用して確認できます。このコマンドは、メンテナンスイベントのスケジュールがいつに設定されているか、また実行の準備ができているかどうかを示します。
メンテナンスウィンドウの長さは 4 時間です。Heroku では、ウィンドウの開始時刻にできるだけ近い時間からメンテナンスを開始するよう配慮しています。メンテナンスイベントの所要時間は不定ですが、通常、データベースがオフラインになるのは 10 ~ 60 秒だけです。
指定するウィンドウは、heroku data:maintenances:info
コマンドによって示される required by
の時刻よりも早く終了する必要があります。
メンテナンスウィンドウの再スケジュール
データベースのメンテナンスウィンドウは、data:maintenances:window:update
コマンドをもう一度実行して、ウィンドウの新しい開始時刻を指定すると変更できます。
手動でのメンテナンスの実行
手動でメンテナンスを実行する前に、まず、データベースに関連付けられているアプリをメンテナンスモードにすることをお勧めします。この記事の data:maintenances:*
コマンドを実行する前にプラグインをインストールしてください。
自動実行
メンテナンスを実行する最も一般的な方法は、Heroku で自動的に実行することです。Heroku では、お客様のデータベースのメンテナンスウィンドウを使用して、メンテナンスを自動的に実行するのに最適な時間を決定します。メンテナンスイベントの途中でアプリが再起動するため、ユーザーによってはエラーや数分の遅延が発生する場合があります。
connection error
、pg is read only
などのエラーがログに記録されることがあります。これらのエラーは切り替えプロセスの生成物であり、すべてがオンラインに戻っていれば無視しても安全です。
メンテナンスモードが有効な場合
次のコマンドは、アプリをメンテナンスモードにして、関連付けられたデータベースでメンテナンスを手動で実行する方法を示しています。
$ heroku maintenance:on -a example-app
Enabling maintenance mode for ⬢ example-app... done
$ heroku data:maintenances:run DATABASE -a example-app
Starting maintenance for postgresql-clean-29349... done
$ heroku maintenance:off -a example-app
Disabling maintenance mode for ⬢ example-app... done
この方法では、PostgreSQL フェイルオーバーを実行する前にアプリケーションをメンテナンスモードにします。この方法には、ユーザーのランディングページがクリーンになるなどの利点がありますが、メンテナンスモードの有効化と無効化を手動で行うことから、全体としてはダウンタイムが長くなる可能性があります。
メンテナンスモードが無効な場合
最初にメンテナンスモードを有効にせずにメンテナンスを手動で実行するには、アプリ名を指定した --confirm
フラグが必要です。
$ heroku data:maintenances:run DATABASE --confirm example-app
このコマンドはすぐにメンテナンスイベントを開始します。
read-only
または database-independent
モードがアプリに組み込まれている場合、それらのモードも使用できます。
# for example
heroku config:set READ_ONLY=true
heroku data:maintenances:run --confirm example-app
heroku pg:wait
heroku config:set READ_ONLY=false
メンテナンスの種類
データベースのメンテナンスタスクを実行するとき、Heroku では再起動、切り替え、フェイルオーバーのいずれかの戦略を使用します。Heroku が使用する戦略は、メンテナンスタスクの種類と、データベースプランによって異なります。
たとえば、高可用性 (HA) プラン (Premium、Private、Shield) では、データベースが別のデータベースのフォロワーである場合を除き、Heroku は可能であれば常にフェイルオーバー戦略を使用します。HA 非対応プラン (Standard) と、すべてのフォロワーデータベース (プラン不問) では、Heroku は通常、切り替え戦略を使用します。
1 つ以上のフォロワーがあるデータベースでフェイルオーバーまたは切り替えのメンテナンスイベントが発生した場合、Heroku はフォロワーのポイント先を代替データベースに変更しようとします。フォロワーのポイント先を代替データベースに変更するには、フォロワーデータベースを再起動する必要があります。
状況によって、フォロワーが代替データベースを指すようにすることができない場合は、別の代替データベースが自動的に準備されてプロモートされます。
切り替えメンテナンスイベントの監視と開始
Heroku によってデータベースの切り替えメンテナンスイベントがスケジュールされると、代替データベースの作成が始まります。データベースのサイズによっては代替データベースの作成に時間がかかります。
代替データベースの作成中、data:maintenances:info
コマンドにより次の情報が表示されます。
$ heroku data:maintenances:info DATABASE --app example-app
Fetching maintenance... done
addon_attachments: DATABASE_URL
addon_description: Standard Non-HA
addon_kind: heroku-postgresql
addon_name: postgresql-octagonal-41284
addon_plan: standard-0
addon_window: Mondays 14:30 to 18:30 UTC
app_name: example-app
method: changeover
reason: customer_request
required_by: 2023-06-30T10:10:13.831+00:00
scheduled_for: 2023-06-12T14:30:00.000+00:00
server_created_at: 2023-05-10T14:52:33.871+00:00
status: preparing
window: Mondays 14:30 to 18:30 UTC
この情報は、メンテナンスでフェイルオーバーまたは再起動の戦略を使用している場合は表示されません。
代替データベースの準備ができてメンテナンスが続行可能になると、data:maintenances:info
コマンドにより次の情報が表示されます。
$ heroku data:maintenances:info DATABASE --app example-app
Fetching maintenance... done
addon_attachments: DATABASE_URL
addon_description: Standard Non-HA
addon_kind: heroku-postgresql
addon_name: postgresql-octagonal-41284
addon_plan: standard-0
addon_window: Mondays 14:30 to 18:30 UTC
app_name: example-app
method: changeover
reason: customer_request
required_by: 2023-06-30T10:10:13.831+00:00
scheduled_for: 2023-06-12T14:30:00.000+00:00
server_created_at: 2023-05-10T14:52:33.871+00:00
status: ready
window: Mondays 14:30 to 18:30 UTC
制限
メンテナンスウィンドウの設定とメンテナンスの手動実行は、Standard、Premium、Private、Shield プランでのみ行うことができます。
Heroku では、メンテナンスウィンドウに関するお客様の要望にお応えできるよう最善を尽くしますが、保証はいたしかねます。お客様のデータのセキュリティまたは整合性が脅かされる緊急事態が発生した場合、当社の裁量によって通常のウィンドウ以外の時期にメンテナンスを実行する可能性があります。