未分類

DockerによるPostgreSQLのレプリケーション設定

DockerによるPostgreSQLのレプリケーション設定

お客様から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; の操作が必要です。完全自動化にはトリガーやスケジュール済みジョブの設定が必要となります。

Docker 公式サイト

PostgreSQL 公式サイト