お客様からPostgreSQLのレプリケーション設定についてご質問をいただきましたので、Dockerで実装した際の手順を記録します。レプリケーションはシステムの負荷分散、障害対策、情報基盤への受け渡しと、いろいろと便利です。
1. Dockerネットワーク作成
docker network create pg-network
2. パブリッシャー(送信側)コンテナ作成
docker run -d --name pg-publisher --network pg-network -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 postgres:13 -c wal_level=logical
3. サブスクライバー(受信側)コンテナ作成
docker run -d --name pg-subscriber --network pg-network -e POSTGRES_PASSWORD=mysecretpassword -p 5433:5432 postgres:13
4. パブリッシャー設定
CREATE DATABASE mydb;
c mydb;
CREATE PUBLICATION mypub FOR ALL TABLES;
CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD 'replicatorpass';
GRANT SELECT ON ALL TABLES IN SCHEMA public TO replicator;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO replicator;
5. サブスクライバー設定
CREATE DATABASE mydb;
c mydb;
CREATE SUBSCRIPTION mysub
CONNECTION 'host=pg-publisher dbname=mydb user=replicator password=replicatorpass'
PUBLICATION mypub;
6. テーブル追加時の手順
パブリッシャー側で新しいテーブルを追加した場合:
-- パブリッシャー側
CREATE TABLE newtable (id SERIAL PRIMARY KEY, data TEXT);
INSERT INTO newtable (data) VALUES ('New table data');
-- サブスクライバー側
CREATE TABLE newtable (id SERIAL PRIMARY KEY, data TEXT);
ALTER SUBSCRIPTION mysub REFRESH PUBLICATION;
SELECT * FROM newtable;
注意点
新しいテーブルを追加した際は、毎回 ALTER SUBSCRIPTION mysub REFRESH PUBLICATION; の操作が必要です。完全自動化にはトリガーやスケジュール済みジョブの設定が必要となります。