Docker DB
이중화
docker-compose.yml
# /docker-compose.yml
services:
primary:
image: postgres:15
container_name: pg-primary
environment:
POSTGRES_PASSWORD: password
POSTGRES_USER: postgres
POSTGRES_DB: mydb
ports:
- "5432:5432"
volumes:
- primary_data:/var/lib/postgresql/data
- ./primary/pg_hba.conf:/etc/postgresql/pg_hba.conf
command: >
postgres -c wal_level=replica
-c max_wal_senders=10
-c max_replication_slots=10
-c hot_standby=on
-c listen_addresses='*'
-c hba_file=/etc/postgresql/pg_hba.conf
replica:
image: postgres:15
container_name: pg-replica
depends_on:
- primary
environment:
POSTGRES_PASSWORD: password
POSTGRES_USER: postgres
ports:
- "5433:5432"
entrypoint: [ "/bin/bash", "/replica/replica.sh" ]
volumes:
- replica_data:/var/lib/postgresql/data
- ./replica:/replica
volumes:
primary_data:
replica_data:
networks:
pgnet:
primary
# /primary/pg_hba.conf
# Local connections (required)
local all all trust
# Allow replication from Docker network
host replication postgres 0.0.0.0/0 trust
# Allow all remote connections (for testing)
host all all 0.0.0.0/0 trust
replica
# replica.sh
#!/bin/bash
set -e
echo "Waiting for primary..."
sleep 5
echo "Cleaning old data..."
rm -rf /var/lib/postgresql/data/*
echo "Cloning primary..."
PGPASSWORD=password pg_basebackup -h pg-primary -D /var/lib/postgresql/data -U postgres -Fp -Xs -P
echo "Configuring replica..."
cat <<EOF > /var/lib/postgresql/data/postgresql.auto.conf
primary_conninfo = 'host=pg-primary port=5432 user=postgres password=password'
hot_standby = on
EOF
touch /var/lib/postgresql/data/standby.signal
echo "Starting PostgreSQL replica..."
exec docker-entrypoint.sh postgres
실행 & 종료
$ docker-compose up -d
$ docker-compose down -v
로그 확인
$ docker logs pg-primary
$ docker logs pg-replica
복제 확인
$ docker exec -it pg-primary psql -U postgres -c "CREATE TABLE test_rep (id SERIAL PRIMARY KEY, msg TEXT);"
$ docker exec -it pg-primary psql -U postgres -c "SELECT * FROM pg_stat_replication;"
$ docker exec -it pg-replica psql -U postgres -c "SELECT * FROM pg_stat_replication;"