docker-compose и репликация БД postgresql 16
Помогите разобраться как организовать репликацию данных между контейнерами с postgresql в docker-compose.
Задача такая: Есть проект на Django Python, используется БД postgresql 16. Необходимо добавить еще один контейнер с postgresql 16 и настроить репликацию данных между ними так что бы у второго контейнера был доступ только на чтение. Это необходимо для тестирования запросов из django проекта.
Имеется:
version: "3.9"
services:
postgresql_main:
image: postgres:16.1-alpine3.19
container_name: ${POSTGRES_HOST}
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_DB: ${POSTGRES_NAME}
volumes:
- db_data:/var/lib/postgresql/data
expose:
- 5433
hostname: ${POSTGRES_HOST}
networks:
example_net:
ipv4_address: ${POSTGRES_MAIN_IP}
healthcheck:
test: ["CMD-SHELL", "sh -c 'pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}'"]
interval: 10s
timeout: 5s
retries: 2
postgresql_second:
depends_on:
postgresql_main:
condition: service_healthy
image: postgres:16.1-alpine3.19
container_name: ${POSTGRES_SEC_HOST}
environment:
POSTGRES_PASSWORD: ${POSTGRES_SEC_PASSWORD}
POSTGRES_USER: ${POSTGRES_SEC_USER}
volumes:
- replca_data:/var/lib/postgresql/data
expose:
- 5433
hostname: ${POSTGRES_SEC_HOST}
networks:
example_net:
ipv4_address: ${POSTGRES_SEC_IP}
healthcheck:
test: ["CMD-SHELL", "sh -c 'pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}'"]
interval: 10s
timeout: 5s
retries: 2
Я правил добавил replication_user на основном сервере (postgresql_main) такой командой:
CREATE USER replication_user REPLICATION LOGIN CONNECTION LIMIT 10 ENCRYPTED PASSWORD 'replication_password';
Затем изменил postgresql.conf и pg_hba.conf
postgresql.conf
wal_level = replica
max_wal_senders = 2
max_replication_slots = 2
hot_standby = on
hot_standby_feedback = on
и
pg_hba.conf
host project_db replication_user 10.10.10.10/32 md5
Также я добавил изменения для password_encryption В ОБОИХ КОНТЕЙНЕРАХ.
password_encryption = md5
Далее я иду во второй контейнер и использую
pg_basebackup --host=postgresql_main --username=replication_user --pgdata=/var/lib/postgresql/data --wal-method=stream --write-recovery-conf -W
После растарта контейнеров я захожу в первый контейнер и ввожу
SELECT * FROM pg_stat_replication;
но получаю пустую таблицу и при создании таблицы в основной БД во второй ни чего не появляется. Помогите понять что я упустил.