そーだいなるらくがき帳

そーだいが自由気侭に更新します。

バージョン違いのPostgreSQLをロジカルレプリケーション

PostgreSQL 10 から PostgreSQL 11へのロジカルレプリケーションを試した。

結論

簡単に出来る。 PostgreSQLのロジカルレプリケーションは元々バージョン違いを考慮してるのでPostgreSQL 10でのロジカルレプリケーションの設定と何も変わらない。 パブリッシャ(マスタ側)が10でサブスクレイバ(スレーブ側)が11を指定するだけ。 テーブル単位で出来るのでストリーミングレプリケーションとはそこも違う。

何が嬉しいか

ロジカルレプリケーション自体のメリット・デメリットはここでは論議しない。 バージョン違いのPostgreSQLレプリケーション出来るということはMySQLのようにレプリケーションでデータを複製しておき、フェイルオーバーさせることで停止時間を極小化してバージョンアップ出来るということ。

やり方

一番簡単なシンプルなやり方を記載する。 なお、前提条件としてServerは以下のとおり。

パブリッシャ側

PostgreSQL 10を用意し、以下の手順を実施する。

1. ロジカルレプリケーションを有効化

postgresql.confwal_levellogical に変更。デフォルトはreplicaになっている。

vim 10/data/postgresql.conf
-- 該当行を更新
wal_level = logical

2. テーブルを作成し、パブリケーションに登録する

下記のようなSQLを実施する。 すでにテーブルがある場合は CREATE TABLE は不要。

CREATE TABLE user (id int, name text);
CREATE PUBLICATION pub_demo_user FOR TABLE user;

3. サブスクレイバからアクセス出来るようにする

pg_hba.conf にストリーミングレプリケーション同様にアクセス出来るように追記する必要がある。

vim 10//data/pg_hba.conf
-- サブスクレイのIP等を設定する
host    all             all             192.168.0.0/24            trust

また postgresql.conf のデフォルトはlocalhostのみからしかアクセスを許可してないので変更が必要な場合は変更する。

vim 10/data/postgresql.conf
-- 該当行を更新
listen_addresses = '*'

confを設定した場合は再読込が必要なため systemctl restart postgresql-10 を実行して再起動する。

サブスクレイバ側

パブリッシャに接続できるのであれば設定は少ない。

テーブルを作成し、サブスクリプションの登録

下記のようなSQLを実施する。 すでにテーブルがある場合は CREATE TABLE は不要。

CREATE TABLE user (id int, name text);
CREATE SUBSCRIPTION sub_demo_user CONNECTION 'host=192.168.0.17 dbname=demo port=5432 user=postgres' PUBLICATION pub_demo_user;

これだけ。

まとめ

インスタンスを作ってPostgreSQLをそれぞれ用意するところから始めたけどそれでもロジカルレプリケーション自体は30分くらいで出来た。 テーブル単位で設定できるので柔軟に設定出来る半面、量が多い場合はSQLを自動生成しないと面倒かもしれない。 またどれくらいパフォーマンスが出るかの課題もあるしロジカルレプリケーションのハマりどころ自体も多いが多くの場合、強力なローリングアップデートの選択肢に今後なるので試して見る価値はある。 細かいことは下記の本のレプリケーションの章に全部書いてあったので必読。

参考文献

qiita.com

CREATE SUBSCRIPTION