LoginSignup
2
2

More than 5 years have passed since last update.

Logical Replicationを使ってみた。

Posted at

はじめに

PostgreSQL 10の目玉機能にLogical Replicationというのがあったので、さっそく使ってみました。

Logical Replicationの仕組み

Logical Replicationとは、データベースに対する操作のログをネットワークを通じて他のデータベースに送信することで、データの複製を行う仕組みです。Publish/Subscribeモデルを利用して、複製元のデータベースのログを複製先のデータベースへ送信します。複製元のデータベースはPublisher、複製先のデータベースはSubscriberと呼びます。
Publisherは複製したいテーブルを選択して、そのテーブルに対する操作のログをすべてPublishします。Subscriberは、そのログをSubscribeして、Publisherと同じ操作をテーブルに実行することでデータを複製します。
1対1のLogical Replicationは、Publisherがテーブルに対する操作のログをキューに詰め込み、Subscriberがそのキューからログを取り出して、テーブルを複製していると考えてもよいでしょう。

用意した環境

image.png

今回はデスクトップPCとMacBookAirを用意しました。デスクトップPC上のPostgreデータベースから、MBA上のデータベースにデータを複製します。デスクトップPCがPublisherで、MBAがSubscriberです。

Logical Replicationの設定手順

以下の2つの前準備をしてから、PublicationとSubscriptionを作成します。
1. Publisherのネットワークの設定
2. 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に複製されています。

  1. Publisher:データの挿入
    image.png

  2. Subscriber:Select
    スクリーンショット 2017-11-27 1.27.26.png

  3. Publisher:データの更新
    image.png

  4. Subscriber:Select
    スクリーンショット 2017-11-27 1.29.59.png

  5. Publisher:データの削除
    image.png

  6. Subscriber:Select
    スクリーンショット 2017-11-27 1.31.49.png

おわりに

Subscriberが複製対象のテーブルに対してInsertなどの操作を行うとPublisherのテーブルにも反映されるという情報をいくつか見かけましたが、私の環境ではそのようなことはできませんでした。(そもそもPublish/Subscribeモデルでそのようなことはできないと思います。)

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2