TPA rolling updates

tpaexec update-postgres コマンドは、クラスター操作全体を中断することなく、Postgresおよび関連パッケージのマイナーバージョン更新を実行します。更新中に個々のインスタンスが停止して再起動しますが、クエリはアプリケーションがデータベース操作を続行できるようにルーティングされます。

正確な手順はアーキテクチャ固有です。

BDR-Always-ON

PGDクラスターの場合、更新プロセスはクラスターインスタンスを1つずつ調べて、次のことを行います。

1.サーバーがメンテナンス中であることをhaproxyに伝えます。

2.インスタンスがアクティブサーバーだった場合、pgbouncerに再接続を要求し、アクティブなセッションが閉じられるのを待ちます。

  1. Postgresを停止し、パッケージを更新して、Postgresを再起動します。

4.最後に、サーバーを再度「準備完了」としてマークし、haproxyを介してリクエストを受信します。

PGDロジカルスタンバイまたはフィジカルレプリカインスタンスは、haproxyまたはpgbouncerの相互作用なしで更新されます。クラスター内の非Postgresインスタンスはそのまま残されます。

update_hosts 変数を定義することで、クラスターのインスタンスが更新される順序を制御できます。

$ tpaexec update-postgres ~/clusters/speedy \
  -e update_hosts=quirk,keeper,quaver

これは、アクティブなPGDプライマリインスタンスを最後にリストして、シャドウサーバーが最初に更新されるようにすることにより、更新中のリード/シャドウのスイッチオーバーを最小限に抑えるのに役立つ場合があります。

ご使用の環境で追加のアクションが必要な場合、 postgres-pre-update and postgres-post-update hooks

パッケージのインストール手順の前後にカスタムAnsibleタスクを実行できます。

M1

M1クラスターの場合、 update-postgres は最初にストリーミングレプリカを1つずつ更新し、次に tpaexec switchover

プライマリからレプリカの1つに、プライマリを更新し、再度スイッチオーバーします。

パッケージバージョンの選択

クラスターの作成時にパッケージバージョン(Postgres、PGD、またはpglogicalなど)を明示的に指定しなかった場合、デフォルトでは、tpaexec update-postgres はインストールされたパッケージの利用可能な最新バージョンに更新します。

たとえば、 --xxx-package-version オプション(postgres、bdr、pglogical)のいずれかを tpaexec configure 使用するか、 config.ymlでxxx_package_version 変数を定義することにより、特定のバージョンを選択した場合、インストールされたパッケージはすでに要求されたバージョン。

この場合、 config.ymlを編集し、バージョン設定を削除して、 tpaexec provision を再実行する必要があります。更新は、利用可能な最新のパッケージをインストールします。以下に示すように、コマンドラインでバージョンを指定することにより、特定のバージョンに更新できます。

$ tpaexec update-postgres ~/clusters/speedy -vv         \
  -e postgres_package_version="2:11.6r2ndq1.6.13*"      \
  -e pglogical_package_version="2:3.6.11*"              \
  -e bdr_package_version="2:3.6.11*"

ここでのバージョン構文は、OSディストリビューションとパッケージマネージャーによって異なることに注意してください。特に、yumは*xyz* ワイルドカードを受け入れますが、aptはxyz* のみを認識します(上記の例のように)。

注: tpaexec-configure のpackage_versionでワイルドカードを使用する場合の制限を参照してください。

要求するPostgres、PGD、およびpglogicalパッケージバージョンの組み合わせが賢明であることを保証するのはあなたの責任です。つまり、それらは連携して動作するはずであり、インストールしたものから新しいバージョンへのアップグレードパスが必要です。

PGDクラスターの場合、パッケージマネージャーの依存関係解決に依存して正しい依存関係を選択するのではなく、3つすべてのコンポーネント(Postgres、PGD、pglogical)の正確なバージョンを明示的に指定することをお勧めします。

本番環境で実行する前に、QA環境でアップデートをテストすることを強くお勧めします。