こんにちは。テクニカルサポート課の森本です。
先日、RDS PostgreSQL の Blue/Green Deployments において物理レプリケーションがサポートされるアップデートがありました。 実は re:Invent 2024 前に発表されていた機能ですが、検証しようしようと思っていたらあっという間に新年を迎えてしまいました。 今回はこちらの機能について確認、検証してみました。
これまで
従来、PostgreSQL の Blue/Green Deployments の Blue/Green 間のレプリケーションには論理レプリケーションが採用されていました。 論理レプリケーションはデータベースエンジンのメジャーバージョンが異なってもレプリケーションが実施可能であるなどの柔軟性がある一方、DDL の変更がターゲットに連携されないことをはじめとする様々な制約がありました。今回、物理レプリケーションが利用可能になったことで、論理レプリケーションの制約にとらわれることなくBlue/Green Deployments が使用可能になりました。
その他、論理レプリケーションによる代表的な制約についてはこちらに記載があります。
Limitations and considerations for blue/green deployments - Amazon Relational Database Service
物理レプリケーションが使用可能な条件
RDS PostgreSQL におけるレプリケーション方式を決定するのは、ソース側のエンジンバージョン、および Blue/Green Deployments 環境作成時にメジャーバージョンアップグレードを伴うかどうかの2点です。
PostgreSQL replication methods for blue/green deployments - Amazon Relational Database Service
特に Blue/Green Deployments 環境作成の際にいずれかのレプリケーション方式を選択する必要はなく、基本的には物理レプリケーションが優先的に使用されます。Green 環境でBlue環境と異なるメジャーバージョンを使用する場合(=メジャーバージョンアップグレードを伴う場合)は従来の論理レプリケーションが使用されます。
物理レプリケーションの制約
論理レプリケーション側の制約に比べると少ないですが、物理レプリケーションを用いた Blue/Green Deployments には以下のような制約があります。
- 物理レプリケーションを使用した環境におけるGreen側の DB インスタンスをメジャーバージョンアップグレードすることはできない
- Green 側のスキーマ変更を行うことができない
動作確認
どちらのレプリケーションでも、Blue 側には以下のようなテーブルをあらかじめ作成した上でそれぞれの環境を作成します。
postgres=> create table t1 (id int primary key, note varchar(256)); CREATE TABLE postgres=> insert into t1 values (1, 'note1'); INSERT 0 1 postgres=> insert into t1 values (2, 'note2'); INSERT 0 1 postgres=> insert into t1 values (3, 'note3'); INSERT 0 1
物理レプリケーション側の動作確認
Blue/Grenn Deployments における物理レプリケーションについて、事前にパラメータ値を変更する必要はありません。 そのため、Blue側のパラメータグループはデフォルトのパラメータグループを使用します。
Blue側の変更(DML)はGreen側へレプリケートされます。 またBlue側のデーブル作成(DDL)も、Green 側でもレプリケートされることが確認できます。
#Blue側 postgres=> show wal_level; wal_level ----------- replica postgres=> insert into t1 values (100, 'physical replication'); INSERT 0 1 postgres=> create table t2 (id int primary key, note varchar(256)); CREATE TABLE #Green側 postgres=> select * from t1; id | note -----+---------------------- 1 | note1 2 | note2 3 | note3 100 | physical replication (4 rows) postgres=> \dt List of relations Schema | Name | Type | Owner --------+------+-------+---------- public | t1 | table | postgres public | t2 | table | postgres (2 rows)
また、Green側のセッションパラメータにて default_transaction_read_only=off にしたとしても、Green 環境に書き込みを行うことはできません。
#Green側 postgres=> SET default_transaction_read_only=off; SET postgres=> show default_transaction_read_only; default_transaction_read_only ------------------------------- off (1 row) postgres=> create table t3 (id int primary key, note varchar(256)); ERROR: cannot execute CREATE TABLE in a read-only transaction
論理レプリケーション側の動作確認
こちらは、Blue 環境で事前にパラメータグループをアタッチし、rds.logical_replication を 1 に設定した上で環境を作成し確認を行います。
#Blue側 postgres=> show wal_level; wal_level ----------- logical postgres=> insert into t1 values (100, 'logical replication'); INSERT 0 1 #Green側 postgres=> select * from t1; id | note -----+--------------------- 1 | note1 2 | note2 3 | note3 100 | logical replication (4 rows)
また、推奨はされませんがGreen 側のセッションパラメータにて default_transaction_read_only=off を設定すると、Green環境へも書き込みが可能になります。
#Green側 postgres=> SET default_transaction_read_only=off; SET postgres=> show default_transaction_read_only; default_transaction_read_only ------------------------------- off (1 row) postgres=> create table t3 (id int primary key, note varchar(256)); CREATE TABLE postgres=> \dt; List of relations Schema | Name | Type | Owner --------+------+-------+---------- public | t1 | table | postgres public | t3 | table | postgres (2 rows)
まとめ
今回は、RDS PostgreSQL の Blue/Green Deployments において物理レプリケーションがサポートされるようになったことについての確認、検証を行いました。基本的には利用可能な場合においては特別な設定を必要とせずに物理レプリケーションが優先的に使用されるとのことで、論理レプリケーションにおける制約を受けずに使用できるよいアップデートである印象です。
一方で、現時点ではユーザ側では任意のレプリケーション方式を選択できないため、例えば同一メジャーバージョン間の Blue/Green Deployments において、Green側のみ特定のスキーマ変更を行いたいなどの要件には対応しておりません。そのため、このような場合は手動の論理レプリケーションを利用する必要があるなどのケースがあるかなと思います。 このあたり、任意のレプリケーション方法が選択できるなどのアップデートがあると良いですね。
この記事がどなたかのお役に立てば幸いです。