PostgreSQL 10 から PostgreSQL 11へのロジカルレプリケーションを試した。
結論
簡単に出来る。 PostgreSQLのロジカルレプリケーションは元々バージョン違いを考慮してるのでPostgreSQL 10でのロジカルレプリケーションの設定と何も変わらない。 パブリッシャ(マスタ側)が10でサブスクレイバ(スレーブ側)が11を指定するだけ。 テーブル単位で出来るのでストリーミングレプリケーションとはそこも違う。
何が嬉しいか
ロジカルレプリケーション自体のメリット・デメリットはここでは論議しない。 バージョン違いのPostgreSQLでレプリケーション出来るということはMySQLのようにレプリケーションでデータを複製しておき、フェイルオーバーさせることで停止時間を極小化してバージョンアップ出来るということ。
やり方
一番簡単なシンプルなやり方を記載する。 なお、前提条件としてServerは以下のとおり。
- OS
- CentOS 7
- パブリッシャ
- PostgreSQL 10
- サブスクレイバ
- PostgreSQL 11
パブリッシャ側
PostgreSQL 10を用意し、以下の手順を実施する。
1. ロジカルレプリケーションを有効化
postgresql.conf
の wal_level
をlogical
に変更。デフォルトは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のバージョン違いのレプリケーション、秒で出来た。 pic.twitter.com/1v1M1GbFiI
— そーだい@初代ALF (@soudai1025) October 14, 2018
インスタンスを作ってPostgreSQLをそれぞれ用意するところから始めたけどそれでもロジカルレプリケーション自体は30分くらいで出来た。 テーブル単位で設定できるので柔軟に設定出来る半面、量が多い場合はSQLを自動生成しないと面倒かもしれない。 またどれくらいパフォーマンスが出るかの課題もあるしロジカルレプリケーションのハマりどころ自体も多いが多くの場合、強力なローリングアップデートの選択肢に今後なるので試して見る価値はある。 細かいことは下記の本のレプリケーションの章に全部書いてあったので必読。