Heroku Postgres のメンテナンスウィンドウ
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2022年11月22日(火)
Table of Contents
メンテナンスタスクを実行するために、Heroku において Heroku Postgres データベースをオフラインにすることが必要な場合があります。典型的なタスクには、データベースの基盤となるインフラストラクチャの更新 (例: オペレーティングシステムや必要なライブラリへのパッチ適用) や Postgres 自体のアップグレードなどがあります。このメンテナンスは Heroku によって自動的に処理されます。
メンテナンスウィンドウは、すべての本番環境用データベースプランで利用できます。
データベースのメンテナンスが必要かどうかの確認
データベースのメンテナンスが必要かどうかは、pg:info
を使用して確認できます。
$ heroku pg:info -a sushi
=== 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
pg:maintenance
コマンドで確認することもできます。
$ heroku pg:maintenance DATABASE -a sushi
Maintenance scheduled for 2018-05-01 14:30:00 +0000, required by 2018-05-04 21:00:00 +0000, replacement currently being prepared, window is Tuesdays 14:30 to 18:30 UTC
メンテナンスウィンドウの設定
一部の Heroku Postgres プランでは、データベースのメンテナンスウィンドウを指定できます。ウィンドウが始まる曜日と時刻 (UTC) を指定できます。
$ heroku pg:maintenance:window DATABASE "Sunday 14:30" -a sushi
メンテナンスウィンドウを設定することで、メンテナンスがアプリケーションとユーザーに及ぼす影響を最小化できます。メンテナンスがビジネスに及ぼす影響が最も小さい時期を選ぶことをお勧めします。
メンテナンスウィンドウの長さは 4 時間です。Heroku では、指定されたウィンドウの開始時刻にできるだけ近い時間からメンテナンスを開始するよう配慮しています。メンテナンスの所要時間は不定ですが、通常、データベースがオフラインになるのは 10 ~ 60 秒だけです。
指定するウィンドウは、heroku pg:maintenance
コマンドによって示される required by
の時刻よりも早く終了する必要があります。
メンテナンスの再スケジュール
データベースのメンテナンスウィンドウは、pg:maintenance:window
コマンドをもう一度実行して、ウィンドウの新しい開始時刻を指定するだけで変更できます。
手動でのメンテナンス実行
利用中の Heroku Postgres プランでメンテナンスウィンドウがサポートされている場合、Heroku CLI を使用した手動でのメンテナンス実行もサポートされています。
手動でメンテナンスを実行する前に、まず、データベースに関連付けられているアプリをメンテナンスモードにすることをお勧めします。
メンテナンスモードが有効な場合
次のコマンドは、アプリをメンテナンスモードにして、関連付けられたデータベースで手動メンテナンスを実行する方法を示しています。
$ heroku maintenance:on -a sushi
Enabling maintenance mode for ⬢ sushi... done
$ heroku pg:maintenance:run DATABASE -a sushi
Starting maintenance for postgresql-clean-29349... done
$ heroku maintenance:off -a sushi
Disabling maintenance mode for ⬢ sushi... done
メンテナンスモードが無効な場合
最初にメンテナンスモードを有効にせずに手動メンテナンスを実行するには、--force
フラグが必要です。
$ heroku pg:maintenance:run DATABASE --force -a sushi
これにより、次の実行可能なウィンドウでメンテナンスが実行されます。
メンテナンスの種類
データベースのメンテナンスを実行するとき、Heroku では再起動、切り替え、フェイルオーバーのいずれかの戦略を使用します。使用される戦略は、メンテナンスの性質と、データベースに関連付けられたプランによって異なります。
たとえば、高可用性 (HA) プラン (Premium、Private、Shield) では、データベースが別のデータベースのフォロワーである場合を除き、Heroku は可能であれば常にフェイルオーバー戦略を使用します。HA 非対応プラン (Standard) と、すべてのフォロワーデータベース (プラン不問) では、Heroku は通常、切り替え戦略を使用します。
1 つ以上のフォロワーがあるデータベースでフェイルオーバーまたは切り替えのメンテナンスが発生した場合、Heroku はフォロワーのポイント先を代替データベースに変更しようとします。フォロワーのポイント先を代替データベースに変更するには、フォロワーデータベースを再起動する必要があります。
状況によって、フォロワーが代替データベースを指すようにすることができない場合は、別の代替データベースが自動的に準備されてプロモートされます。
切り替えメンテナンスの監視と開始
Heroku によってデータベースの切り替えメンテナンスがスケジュールされると、代替データベースの作成が始まります。データベースのサイズによっては、代替データベースの作成に時間がかかることがあります。
代替データベースの作成中、pg:maintenance
コマンドにより次の情報が表示されます。
$ heroku pg:maintenance DATABASE_NAME --app myapp
Maintenance scheduled for 2018-05-01 14:30:00 +0000, required by 2018-05-04 21:00:00 +0000, replacement currently being prepared, window is Tuesdays 14:30 to 18:30 UTC
この情報は、特定のメンテナンスでフェイルオーバーまたは再起動の戦略を使用している場合は表示されません。
代替データベースの準備ができてメンテナンスが続行可能になると、pg:maintenance
コマンドにより次の情報が表示されます。
$ heroku pg:maintenance DATABASE -a sushi
Maintenance scheduled for 2018-05-01 14:30:00 +0000, required by 2018-05-04 21:00:00 +0000, replacement ready, window is Tuesdays 14:30 to 18:30 UTC
制限
設定可能なメンテナンスウィンドウと手動でのメンテナンス実行は、本番環境プラン (Standard、Premium、Private、Shield) でのみ利用できます。
Heroku では、メンテナンスウィンドウに関するお客様の要望にお応えできるよう最善を尽くしますが、保証はいたしかねます。お客様のデータのセキュリティまたは整合性が脅かされる緊急事態が発生した場合、当社の裁量によって通常のウィンドウ以外の時期にメンテナンスを実行する場合があります。
よくある質問
どうしてメンテナンスが行われているのですか?
Heroku Postgres はマネージド型の Postgres オファリングであり、提供される最大の価値の 1 つは、セキュリティと機能更新のためのパッチが提供されることです。Heroku では、Heroku Postgres オファリングの一部としてセキュリティの脆弱性を監視し、積極的にパッチを適用します。
このメンテナンスはいつ実行されますか?
次回のメンテナンスウィンドウの間にメンテナンスが実行されることをお知らせするメールがお客様に届いているはずです。メンテナンスがいつ実行されるかは、heroku pg:maintenance
コマンドを使用して確認できます。メンテナンスがスケジュールされている日時と、メンテナンスを実行する準備ができているかどうかの情報が表示されます。
アプリのダウンタイムは発生しますか?
どのようなメンテナンスにも一定のダウンタイムは必要です。高可用性 (HA) プラン (Premium/Private/Shield 層) をご利用の場合、障害発生時に自らを保護するための手順をお客様が実行済みですので、お客様はすでにこのことを認識しています。HA プランをご利用でない場合、Heroku ではお客様のアプリケーションのダウンタイムができる限り短くなるよう努めます。HA プランでは、メンテナンス後、新しい HA フォロワーが作成されてキャッチアップするまでの間、HA をご利用いただけない時間が発生します。
メンテナンスによるダウンタイムの間、sql_error_code = 25006 ERROR: cannot execute INSERT in a read-only transaction
などのアプリエラーや、アプリケーションがデータベースに接続できないことを示す一般的なエラーが発生する場合があります。
ダウンタイムを最小化する方法は?
接続エラーへの弾力性をアプリに組み込む
多くの場合、メンテナンスのためのフェイルオーバーはすぐに発生しますが、アプリで接続を再確立するときの問題によって追加のダウンタイムが発生する可能性があります。このことが問題の場合は、データベースのメンテナンス後にアプリを自発的に再起動すると、接続に特有のエラーが発生しにくくなります。接続を再確立するときに指数バックオフを使用して、アプリ自体のエラー処理にそのような弾力性を組み込むこともできます。読み取り専用フォロワーを使用する
データベースフォロワーをプロビジョニングして、データベースへの読み取り専用アクセスを提供できます。アプリは “読み取り専用” モードをサポートする必要があり、フォロワーへのアクセスのみを要求するように設定する必要があります。ユースケースによっては、この設定により、メインデータベースでメンテナンスが実行されている間、読み取り専用に機能低下したモードでアプリの実行を継続できる場合があります。移行を実行する前にデータベースの準備ができていることを確認する
起動時に実行される移行がアプリにある場合は、まず、データベースへの読み書き可能な接続があることを_確認してから_、移行を実行します。読み取り専用の接続で移行を実行しようとすると、アプリがクラッシュする可能性があり、結果として、その復旧のためにダウンタイムが増加します。 アプリが読み取り専用モードでないことは、SQL コマンド `SELECT pg_is_in_recovery()` を使用して確認できます。メンテナンスを実行するために必要な手順はありますか?
メンテナンスには 3 つの実行方法があります。Heroku で自動的にメンテナンスを実行するのが最も一般的な方法です。Heroku では、お客様のデータベースメンテナンスウィンドウを使用して、このメンテナンスを自動的に実行するのに最適な時間を決定します。
メンテナンスの手動実行を希望する場合、2 つの方法があります。1 つ目は、heroku pg:maintenance --force
です。この場合、HA フォロワーまたは非表示のフォロワー (キャッチアップ済みの場合) にすぐにフェイルオーバーします。アプリケーションはすぐに再起動し、新しいフォロワーをポイントします。
もう 1 つの方法では、PostgreSQL フェイルオーバーを実行する前にアプリケーションをメンテナンスモードにします。この方法には、ユーザーのランディングページがクリーンになるなどの利点がありますが、メンテナンスモードの有効化と無効化を手動で行うことから、全体としてはダウンタイムが長くなる可能性があります。メンテナンスモードに関するページに、さらに詳しい情報があります。
このメンテナンスの実行方法には、Heroku が自動的に行うものと、お客様が手動で行うものの 2 つがあります。
自動実行
Heroku で自動的にメンテナンスを実行するのが最も一般的な方法です。Heroku では、お客様のデータベースのメンテナンスウィンドウを使用して、このメンテナンスを自動的に実行するのに最適な時間を決定します。自動で実行する場合、お客様の側で必要な手順はありません。メンテナンスプロセスの途中でアプリが再起動するため、ユーザーによってはエラーや 1 ~ 3 分の遅延が発生する場合があります。
注:
connection error
、pg is read only
などのエラーがログに記録される場合があります。これらは切り替えプロセスの生成物であり、すべてがオンラインに戻っていれば無視しても安全です。
お客様による手動実行
メンテナンス中のユーザーエクスペリエンスをより自由に制御したい場合、お客様自らの手でメンテナンスを実行できます。メンテナンスを実行するには、スケジュールされたメンテナンスの前にいつでも heroku pg:maintenance:run DATABASE --force -a sushi
コマンドを実行します。
ユーザーにできるだけエラーが表示されないよう、メンテナンスモードを使用して、メンテナンスの実行中はアプリをオフにすることができます。次に例を示します。
heroku maintenance:on
heroku pg:maintenance:run --force
heroku pg:wait
heroku maintenance:off
‘読み取り専用’ または ‘データベースに依存しない’ モードがアプリに組み込まれている場合、それらのモードも使用できます。
# for example
heroku config:set READ_ONLY=true
heroku pg:maintenance:run --force
heroku pg:wait
heroku config:set READ_ONLY=false
メンテナンスの手動実行についての詳細は、「メンテナンスの種類」を参照してください。
メンテナンスはどれくらいの頻度で発生しますか?
Postgres の重要なセキュリティパッチや、基盤となるソフトウェアおよびハードウェアのメンテナンスのため、Heroku Postgres データベースは定期的に更新されます。メンテナンスは少なくとも 90 日ごとに実行されます。データベースのメンテナンス履歴を確認できますか?
Heroku では、アプリケーションで実行されるメンテナンスの履歴は提供されません。お客様が検索できるすべてのメンテナンスの前に、Heroku からメールが送信されます。
スケジュールされたメンテナンスの時間を変更できますか?
はい。メンテナンスウィンドウを変更することで、所定の時間よりも前に、スケジュールされたメンテナンス時間を別の時間に変更できます。
DATABASE_URL または HEROKU_POSTGRESQL_<COLOR>_URL が変更されることはありますか?
ほとんどの場合、変更されません。アプリの新しいリリースが作成され、一部の環境設定が更新されたという通知があっても、値は同じままです。この変更があっても、アプリはそのまま再起動します。