unless’s blog

日々のちょっとした技術的なことの羅列

PostgreSQLのロジカルレプリケーションとストリーミングレプリケーションの違い

これはなに?

ちょっと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 プロセスで行っている

streaming

Logical Replicationの仕組み

Primary側でpublication、Standby側にsubscriptionを定義し、情報を伝播させる
publicationはテーブルやテーブルグループから生成された更新セットで、INSERT、UPDATE、DELETE、TRUNCATEのうちのどのような組み合わせにも制限することができる
subscriber(subscriptionの定義をしたサーバ)のDatabaseは、publicationを定義することで他のDatabaseに対するPublisher(publicationの設定をしたサーバ)としても使用できる
各々のsubscriptionは、一つのレプリケーションスロット(ここを参照)を通じて更新が通知される

logical

Logical Replicationはsubscriberでもデータ更新ができるので、到着したデータが制約違反をするとレプリケーションが止まるので注意が必要
俗にいうConflictと言われるもの

それぞれのレプリケーションの制約

Streaming Replication

Logical Replication

それぞれの使い時

Streaming Replication

  • 参照処理の負荷分散
  • バックアップ
  • 高可用性構成

Logical Replication

最後に

同期レプリケーション周りもちょっと書こうかと思ったけど、それはそれで長くなるし、文脈がちょっと違うので省略した