🐙
Docker Composeを使用したPostgreSQLのレプリケーション環境の構築
Docker Composeを使用してPostgreSQLのレプリケーションを試す環境を構築する。
よくわからないが動けばOKを目的としている。
ほぼ参考先のままなので詳しくはそちらを参照。
環境
- macOS Sonoma 14.3.1
- Docker version 25.0.3, build 4debf41
- Docker Compose version v2.24.6-desktop.1
手順
初期化用スクリプトを作成
レプリケーションユーザーとスロットを作成する初期化用スクリプトを作成する
00_init.sql
CREATE USER replicator WITH REPLICATION ENCRYPTED PASSWORD 'password';
SELECT PG_CREATE_PHYSICAL_REPLICATION_SLOT('replication_slot');
docker-compose.ymlを作成する
version: '3.8'
x-db:
&db
image: postgres:16.2
user: postgres
services:
db_primary:
<<: *db
ports:
- "5432:5432"
environment:
POSTGRES_PASSWORD: password
POSTGRES_HOST_AUTH_METHOD: "scram-sha-256\nhost replication all 0.0.0.0/0 md5"
POSTGRES_INITDB_ARGS: "--auth-host=scram-sha-256"
volumes:
# 初期化用スクリプトをマウント
- ./00_init.sql:/docker-entrypoint-initdb.d/00_init.sql
command: |
postgres
-c wal_level=replica
-c hot_standby=on
-c max_wal_senders=10
-c max_replication_slots=10
-c hot_standby_feedback=on
db_replica:
<<: *db
ports:
- "5433:5432"
environment:
PGUSER: replicator
PGPASSWORD: password
command: |
bash -c "
until pg_basebackup --pgdata=/var/lib/postgresql/data -R --slot=replication_slot --host=db_primary --port=5432
do
echo 'Waiting for primary to connect...'
sleep 1s
done
echo 'Backup done, starting replica...'
chmod 0700 /var/lib/postgresql/data
postgres
"
depends_on:
- db_primary
起動
docker compose up -d
プライマリーに接続
以下のコマンドでプライマリーに接続する
docker compose exec db_primary psql
psqlでプライマリーに接続できたら適当なテーブルを作成し、レコードを追加する
postgres=# CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) NOT NULL
);
CREATE TABLE
postgres=# INSERT INTO users (username) VALUES ('foo'), ('bar');
INSERT 0 2
postgres=# SELECT * FROM users;
id | username
----+----------
1 | foo
2 | bar
(2 rows)
レプリカに接続
以下のコマンドでレプリカに接続する
docker compose exec db_replica psql -d postgres -U postgres
\dtでusersテーブルが存在することが確認できる
postgres=# \dt
List of relations
Schema | Name | Type | Owner
--------+-------+-------+----------
public | users | table | postgres
(1 row)
SELECTするとプライマリーで登録したレコードが確認できる
postgres=# SELECT * FROM users;
id | username
----+----------
1 | foo
2 | bar
(2 rows)
(任意)PostgreSQLの設定を変える
max_connectionsなど設定を変えたい場合はcommand部分で指定すれば変えることができる
services:
db_primary:
...
command: |
postgres
...
+ -c max_connections=1000
...
db_replica:
...
command: |
bash -c "
...
+ echo 'max_connections = 1000' >> /var/lib/postgresql/data/postgresql.conf
chmod 0700 /var/lib/postgresql/data
postgres
"
...
まとめ
以上でDocker Composeを使用してPostgreSQLのレプリケーションを試す環境を構築することができる。
設定変更などが必要な場合は、docker-compose.ymlファイルを適宜編集する。
参考
Discussion