- AWSが開発して公開した、PostgreSQL向けのアクティブ-アクティブ複製拡張
- 複数のPostgreSQLインスタンスでデータの書き込み・更新が必要なとき、特定のインスタンスだけが変更を受け付ける従来のアクティブ-スタンバイモデルではなく、複数インスタンスで同時変更と複製が可能な構成を構築できる
- 複数リージョンでの高可用性データベース構成や、書き込み遅延の最小化、アプリケーションのブルー/グリーンアップデート、双方向データマイグレーションのようなシナリオに適している
- 論理複製を活用し、競合検出、書き込み競合の解決、ターゲットデータベースのフォーマット変換などをサポート
アクティブ-アクティブ複製の概念
- 複製(Replication) は、データベース間で変更内容を同期する技術
- 従来のPostgreSQLのアクティブ-スタンバイ構成は、1つのインスタンスだけが変更を受け付け、他は読み取り専用となるため、1か所が単一のデータソースとして機能する
- pgactiveはアクティブ-アクティブ複製トポロジーを提供することで、複数インスタンスで同時にデータ書き込みを許可する
- この方式は、複数の書き込み地点が必要な環境、たとえばマルチリージョン展開や双方向マイグレーションなどに適している
- アクティブ-アクティブモデルでは、競合、遅延、一部機能の制約に対する別途の管理が必要
中核技術: 論理複製
- 論理複製(Logical Replication) は、データを外部システムが解釈可能な形式で転送する
- 論理複製により、対象データベースで競合検出、書き込み競合の解決、クエリ変換など、さまざまな付加機能を実装できる
- PostgreSQLは2017年のバージョン10で基本的な論理複製を導入したが、アクティブ-アクティブ複製には追加機能が求められる
- PostgreSQLの設計特性により、これらの機能は拡張(extension)形式として開発・適用できる
- PostgreSQL開発コミュニティも、徐々にこの機能を基本プロジェクトへ追加している
1件のコメント
Hacker Newsの意見
最初に登場し、今もオープンソースなのがBDR1(リンク)で、pgactiveはこれをベースにしている。
BDR2はBDR1をクローズドソースで書き直したものだったが、最終的に廃止された。
pglogical v1とv2(どちらもオープンソース、リンク)が公開され、このうちv1が大幅に修正されてPostgres 10にマージされた。
Postgres 10の論理レプリケーション機能の経験をもとに、2nd Quadrantはpglogical v2の開発を始め、ここからpgEdgeも生まれた。
その後2nd Quadrantはクローズドソース版のpglogical v3とBDR v3を作り、両者を統合してBDR v4になった。
さらにBDRという製品名はPostgres Distributed(PGD, リンク)に変更された。
2ndQuadrantがEDBに買収され、EDBからPGD v6がリリースされた。
競合が発生した場合はtimestamp基準で最後に書き込まれた値が最終的に適用される方式である。
競合の発生履歴はpgactive_conflict_historyという特別なテーブルに残るため、履歴の確認や手動解決などが可能である。
詳細およびドキュメントはこちらを参照。
もしその機能を公式にPostgresへ取り込めるなら面白そうだ
たとえば本番やステージングのデータを読みつつ、ローカルでだけ変更でき、その結果はupstreamに反映されない二次データベースを使いたい。
現在は定期的にスクリプト(cronなど)でデータダンプやクエリを実行してスナップショットを作り、それをS3に保存してからローカルで取得し、データを復元する方式が一般的である。
この方法はたいてい有効だが、インデックス構築に時間がかかりすぎることがある。
法的・倫理的な問題が大きいため、多くの企業ではこうしたやり方は推奨していない
こうすればprimaryに影響を与えず、ローカルテーブルだけを更新できる
createdb --templateコマンドがおすすめどんな状況にも当てはまるマージ戦略は思いつかない
replicaで書き込みを禁止するのではなく、単にその結果が他へ広がらないだけである
すべてのactiveインスタンスにまたがって、書き込み対象データ領域が重ならないようにアーキテクチャを設計するのが最善である。
こういう場合にはpgactiveのようなツールは有用である。
そうでなければ、最初から分散データベース(Yugabyteなど)を使うべきである
すべてのmasterがすべてのschemaを読むことはできるが、書き込みはそれぞれ自分の担当だけにする方式を提案している。
schemaだけでなく、partitionなども責務分散に使えるのか気になる
自社製品でこの機能を直接使う場面が思い浮かばない。
RDSはblock replication、Auroraは独自のSAN replicationを使っている。
DMSあたりで活用する意図なのではと推測している
強いACIDを持つリレーショナルデータベースで、なぜわざわざこれをやる必要があるのか疑問である
ただし1か月前にコミュニティへオープンソースとして正式公開したという知らせがあった(公式ニュース)
夜ぐっすり眠るためにも、できるだけ避けたい
patroni+etcd+haproxyの組み合わせがよく勧められているが、実際に使った人たちが熱量高く勧めているのを見ると、それだけの理由があるのだろう。
ただ、docker composeで例のファイルを見たときは少し重たく感じた。
pgpoolは各postgresの前に置くだけでよさそうなので簡単に見える。
実際の現場でPostgresが好きな人たちのおすすめや経験が知りたい。
docker composeベースで、できるだけ簡単に、高可用性と(最小限の)無損失、ポイントインタイムリカバリまで可能なクラスタ構築を目標にしている
<i>Pgactive: Active-Active Replication Extension for PostgreSQL on Amazon RDS</i>
Hacker Newsの投稿(2023年10月の投稿、コメント1件)
つまり、それぞれの状況に応じて長所と短所を受け入れる必要がある