これはなに?
ちょっとStreaming ReplicationとLogical Replicationの違いを調べる機会があったのでまとめてみた
レプリケーションの種類の比較
PostgreSQLでは、バージョン9.0よりストリーミングレプリケーション(Streaming Replication)機能を利用することができるようになり、バージョン10からはロジカルレプリケーションが利用可能になったので、2つの種類のレプリケーション機能が利用できる
結論の表だけ先に書くと、下記になる
Streaming Replication | Logical Replication | |
---|---|---|
伝播するもの | WAL | WALの情報を論理的なレベルに変換(デコード)したもの |
レプリケーション範囲 | 全てのデータベース(データベースクラスタ単位) | データベース単位、テーブル単位で設定可能 |
異なるMajorVersionのサポート | 不可 | 可 |
異なるOSのサポート | 不可 | 可 |
スタンバイ側での更新 | 不可 | 可 |
備考
正確にはLogical ReplicationとStreaming Replicationはちょっと概念上の階層がずれている気もする
Streaming Replicationについては高可用性を担保するためのLog Shippingの設定の一つ
本来はWALレコードを一度に1ファイル(WALセグメント)ずつ転送するファイルベースのログシッピング方式でWALファイル(16MB)がいっぱいになるとファイル単位で転送されるが、Streaming ReplicationについてはWALレコードが生成されたらストリーミングする設定のこと
WALがなにかはこの辺に書いてある
上記を見ればわかる通り、 これはPhysical Replicationと言っていい
Logical Replicationはその名の通り論理レプリケーションなので、対比構造ならPhysical Replicationと対比になると思われる
しかし、わかりやすさを優先してこのような対比構造で書いている
Streaming Replicationの仕組み
Primaryがクラッシュリカバリーやロールバックのために保存しているWALをStandbyに転送して、Standby側がそれを適用することで実現している
Streaming ReplicationについてはこのWALレコードをリアルタイムにStandbyに転送することで実現している
転送はPrimary側の wal sender
プロセスと、Standby側の wal receiver
プロセスで行っている
Logical Replicationの仕組み
Primary側でpublication、Standby側にsubscriptionを定義し、情報を伝播させる
publicationはテーブルやテーブルグループから生成された更新セットで、INSERT、UPDATE、DELETE、TRUNCATEのうちのどのような組み合わせにも制限することができる
subscriber(subscriptionの定義をしたサーバ)のDatabaseは、publicationを定義することで他のDatabaseに対するPublisher(publicationの設定をしたサーバ)としても使用できる
各々のsubscriptionは、一つのレプリケーションスロット(ここを参照)を通じて更新が通知される
Logical Replicationはsubscriberでもデータ更新ができるので、到着したデータが制約違反をするとレプリケーションが止まるので注意が必要
俗にいうConflictと言われるもの
それぞれのレプリケーションの制約
Streaming Replication
Logical Replication
- DDLはレプリケーションされない
- Sequenceデータはレプリケーションされない
- Large objectsはレプリケーションされない
- レプリケーションはベーステーブルからベーステーブルにしかできない
- ビュー、マテビュー、パーティションルートテーブル、外部テーブル等はできない
- truncateはsupportされているが、外部キーで接続されたテーブルのグループを切り捨てる場合に癖がある
それぞれの使い時
Streaming Replication
- 参照処理の負荷分散
- バックアップ
- 高可用性構成
Logical Replication
- 部分的なレプリケーション
- 異なるバージョン間でのmigration
- 複数DBの情報集約
最後に
同期レプリケーション周りもちょっと書こうかと思ったけど、それはそれで長くなるし、文脈がちょっと違うので省略した