はじめに
PostgreSQL 10の目玉機能にLogical Replicationというのがあったので、さっそく使ってみました。
Logical Replicationの仕組み
Logical Replicationとは、データベースに対する操作のログをネットワークを通じて他のデータベースに送信することで、データの複製を行う仕組みです。Publish/Subscribeモデルを利用して、複製元のデータベースのログを複製先のデータベースへ送信します。複製元のデータベースはPublisher、複製先のデータベースはSubscriberと呼びます。
Publisherは複製したいテーブルを選択して、そのテーブルに対する操作のログをすべてPublishします。Subscriberは、そのログをSubscribeして、Publisherと同じ操作をテーブルに実行することでデータを複製します。
1対1のLogical Replicationは、Publisherがテーブルに対する操作のログをキューに詰め込み、Subscriberがそのキューからログを取り出して、テーブルを複製していると考えてもよいでしょう。
用意した環境
今回はデスクトップPCとMacBookAirを用意しました。デスクトップPC上のPostgreデータベースから、MBA上のデータベースにデータを複製します。デスクトップPCがPublisherで、MBAがSubscriberです。
Logical Replicationの設定手順
以下の2つの前準備をしてから、PublicationとSubscriptionを作成します。
- Publisherのネットワークの設定
- wal_levelの設定
Publisherのネットワークの設定
SubscriberがPublisherのデータベースにアクセスできるように設定をします。Publisherのpg_hba.confを開き、一番下の方にある
# IPv4 local connections:
の下に、
host all all 192.168.0.5/32 md5
を挿入します。これによってSubscriberがPublisherに接続できるようになります。IPアドレスは適宜変更してください。
wal_levelの設定
Publisherのpostgresql.confを開き、
# - Settings -
の下にあるwal_level
を、
wal_level = logical
に変更してください。これをしないと、Logical Replicationは使えません。
Publicationの作成
まず、Publisherのデータベースに複製したいテーブルを作成しましょう。ここでは、newtableというテーブルを作成しました。
create table newtable(name varchar(100), id varchar(20) primary key);
primary key制約をつけることを忘れないでください。primary keyがないと、複製対象のテーブルに対してUpdate,Deleteした際に怒られます。
次に、Publicationを作成します。ここで、複製したいテーブルを選択します。
create publication pubtest for all tables;
上の例ではすべてのテーブルを複製対象にしています。
Subscriptionの作成
Publisherと同じく、Sublisherのデータベースにも複製したいテーブルを作成します。
create table newtable(name varchar(100), id varchar(20) primary key);
次に、Subscriptionを作成します。ここで、どのPublicationをSubscribeするかを設定します。connection
の中身は適宜変更してください。
create subscription subtest connection 'host=192.168.0.8 port=5432 password=xxxxxxxx' publication pubtest;
動作確認
Publisherでnewtableに対してデータを挿入、更新、削除し、Subscriberでselectします。たしかに、PublisherのテーブルがSubscriberに複製されています。
おわりに
Subscriberが複製対象のテーブルに対してInsertなどの操作を行うとPublisherのテーブルにも反映されるという情報をいくつか見かけましたが、私の環境ではそのようなことはできませんでした。(そもそもPublish/Subscribeモデルでそのようなことはできないと思います。)