概要
プライベードクラウドのPostgeSQLからAWS上のAurora PosrgreSQLへテーブル同期する方法で、DMSだとうまくいかなかったので素直にPostgreSQLのロジカルレプリケーションで対応した時のまとめ。
構成
PostgreSQL(ソース) → DX ➔ DMS → Aurora PostgreSQL(宛先)
問題
あるテーブルをそのまま同期したかったが、1つのカラムだけ同期できず下記の通り制約がある事が分かった。
character varying[] 型に該当し、同期出来なかった。
AWS DMS は以下に制限があります:
json / jsonb → LOB 扱いすれば基本的に取れる
text[] / varchar[] / 配列型 → 未対応(サポート外)
補足
DMSの論理レプリケーション用の出力プラグインについて、デフォルトだとtest_decodingになっているので他のプラグインであれば出来る可能性がないかpgoutputとwal2jsonで試したが同様の理由で不可だった。今回のケースでは他のプラグインでも同期出来なかったが、デフォルトのtest_decodingは商用利用に耐えられないようなのでDMSを使う場合は他のプラグインを検討する必要がある。
主要プラグインの比較
項目 | pgoutput | test_decoding | wal2json | decoderbufs | pglogical |
---|---|---|---|---|---|
主目的 | PostgreSQL間の論理レプリケーション | WAL内容のテキスト表示、テスト用 | WAL内容をJSON形式で外部連携 | WAL内容をProtocol Buffers形式で外部連携 | 高度な部分レプリケーション、DB間複製 |
標準/サポート | PostgreSQL標準 (10以降) | PostgreSQL標準 (付属) | 拡張プラグイン | 拡張プラグイン | 拡張プラグイン |
出力形式 | バイナリ形式(論理デコーディング用) | テキスト形式 | JSON形式 | Protocol Buffers形式 | バイナリ/内部形式 |
利用例 | CREATE PUBLICATION / SUBSCRIPTION |
WAL解析、DMS検証、学習 | Kafka連携、DMS経由で他DBへ同期 | マイクロサービス連携、高速外部処理 | テーブル単位の部分レプリケーション、DB同期 |
複雑型対応 | 配列・JSON対応(ただしツールによる制約あり) | 文字列として出力(アプリ側変換必要) | JSON化されるので扱いやすい | 外部アプリ側でデシリアライズ必要 | 配列・JSON型対応(PostgreSQL互換) |
本番使用 | 推奨 | 推奨されない(確認用) | 推奨可能 | 推奨可能 | 推奨(拡張インストール必要) |
外部ツール対応 | PostgreSQL間のレプリケーションに最適 | 外部ツールではカスタム対応が必要 | DMSやKafka等に対応 | 外部アプリやサービス連携に最適 | PostgreSQL拡張環境で対応可能 |
まとめ
DMSは異種DB間の移行/同期に利用するケースを想定されているようなので、同じDB間での同期はDBの機能を使うのが無難である事を実感した。