TPA rolling updates¶
tpaexec update-postgres
コマンドは、クラスター全体の操作を中断せずにPostgresおよび関連パッケージのマイナーバージョンの更新を実行します。更新中に個々のインスタンスが停止して再起動されますが、クエリはアプリケーションがデータベース操作を続行できるようにルーティングされます。
正確な手順はアーキテクチャ固有です。
BDR常にオン¶
BDRクラスターの場合、更新プロセスはクラスターインスタンスを1つずつ実行し、次を実行します。
1.サーバーがメンテナンス中であることをhaproxyに伝えます。
2.インスタンスがアクティブサーバーの場合、pgbouncerに再接続を要求し、アクティブなセッションが閉じられるのを待ちます。
Postgresを停止し、パッケージを更新して、Postgresを再起動します。
4.最後に、サーバーを再度「準備完了」としてマークして、haproxyを介して要求を受信します。
BDRロジカルスタンバイまたはフィジカルレプリカインスタンスは、haproxyまたはpgbouncerの相互作用なしで更新されます。クラスター内の非Postgresインスタンスはそのままです。
update_hosts
変数を定義することにより、クラスターのインスタンスが更新される順序を制御できます。
$ tpaexec update-postgres ~/clusters/speedy \
-e update_hosts=quirk,keeper,quaver
これは、アクティブなBDRプライマリインスタンスを最後にリストして、シャドウサーバーが最初に更新されるようにすることにより、更新中のリード/シャドウのスイッチオーバーを最小限に抑えるのに役立つ場合があります。
ご使用の環境で追加のアクションが必要な場合、 postgres-pre-update and postgres-post-update hooks
パッケージのインストール手順の前後にカスタムAnsibleタスクを実行できます。
M1¶
M1クラスターの場合、 update-postgres
は最初にストリーミングレプリカを1つずつ更新し、次に tpaexec switchover
プライマリからいずれかのレプリカに、プライマリを更新し、再度スイッチオーバーします。
パッケージバージョンの選択¶
クラスターの作成時にパッケージバージョン( Postgres、 BDR、
pglogicalなど)を明示的に指定しなかった場合、デフォルトでは、
tpaexec update-postgres
はインストールされたパッケージの利用可能な最新バージョンに更新します。
--xxx-package-version
オプション(postgres、bdr、pglogicalなど)のいずれかを使用することにより、または
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、 BDR、および pglogicalパッケージバージョンの組み合わせが賢明であることを確認するのはあなたの責任です。つまり、それらは連携するはずであり、インストールしたものから新しいバージョンへのアップグレードパスが必要です。
BDRクラスターの場合、パッケージマネージャーの依存関係の解決に頼って正しい依存関係を選択するのではなく、3つすべてのコンポーネント(Postgres、 BDR、pglogical)の正確なバージョンを明示的に指定することをお勧めします。
更新を実稼働で実行する前に、QA環境でテストすることを強くお勧めします。