Есть 2 контейнера с postgresql 14 (не кластер) на 2-х разных хостах с перемонтированным томом postgres (соответственно один из них мастер, другой реплика).
Не получается настроить скрипт с ручным failover, а именно - остановка контейнера бывшего мастера, промоут слейва до мастера и создание слейва для нового мастера.
При попытке pg_ctl promote на слейве появляется ошибка:
could not open PID file "/postmaster.pid" : Permission denied.
В гугле есть решение этой проблемы - запуск pg_ctl promote от пользователя postgres, но это проблему не решает.
От рута запускать не хочет так как просит запускать от непривилегированного пользователя.
docker-compose.yml
version: '3.3'
services:
postgres:
container_name: postgresr
image: postgres:14-bullseye
volumes:
- ./postgres-data:/var/lib/postgresql/data
restart: always
environment:
POSTGRES_USER: ******
POSTGRES_PASSWORD: ******
POSTGRES_DB: ******
ports:
- "5432:5432"
скрипт промоута:
#!/bin/bash
HIP=(hostname -i)
MIP=['10.XX.1XX.16']
SIP=['10.XX.1XX.17']
DATE=(date "+%Y%m%d%H%M%S")
if [ "$HIP" = "$MIP" ]; then
sudo chown user /home/user/compose/postgres-data && ssh user@$SIP 'sudo -u postgres /usr/pgsql-14/bin/pg_ctl promote \
-D /home/user/compose/postgres-data/'
elif [ "$HIP" = "$SIP" ]; then
ssh user@$MIP 'sudo -u postgres /usr/pgsql-14/bin/pg_ctl promote \
-D /home/user/compose/postgres-data/'
fi
sudo docker stop postgresr
sudo docker rm -v postgresr
rm -rf /user/compose/postgres-data*
if [ "$HIP" = "$MIP" ]; then
"pg_basebackup -h $SIP -D /home/user/compose/postgres-data/ -U replicator -P -v -R -X stream -C -S $DATE"
elif [ "$HIP" = "$SIP" ]; then
"pg_basebackup -h $MIP -D /home/user/compose/postgres-data/ -U replicator -P -v -R -X stream -C -S $DATE"
fi
sudo docker-compose up