PostgreSQL отдельно от платформы

era/scripts/install_pg.sh выполняет операции с базой, не трогая платформу. Он нужен, когда база живёт на отдельном сервере, когда поднимается реплика или когда роли мастера и реплики меняются местами.

bash era/scripts/install_pg.sh
bash install_pg_ssh.sh --host=192.168.0.20 --user=user

Шесть операций

--operation Что делает

install_in_docker

Поднимает сервер в контейнере postgres<постфикс>, создаёт роль платформы.

install_host_master

Ставит пакет, создаёт кластер в хосте, настраивает postgresql.conf и pg_hba.conf, создаёт роли, регистрирует юнит systemd.

install_host_slave

Ставит пакет и забирает базу с мастера через pg_basebackup. Существующий кластер не удаляется, а уносится в каталог резервных копий.

switch_to_master

Повышает реплику до мастера.

switch_to_slave

Понижает мастер до реплики: уносит данные в резерв и заливает базу с нового мастера.

uninstall

Останавливает сервер, удаляет контейнер или юнит и каталог кластера, а следом — каталог инстанса, если тот остался пуст.

Операцию можно не указывать явно: она выводится из --pgmode и --pghostmode, как это описано в справке версии 3. --pgmode=d даёт install_in_docker, --pgmode=h --pghostmode=m — install_host_master, --pgmode=h --pghostmode=r — install_host_slave. Явный --operation всегда сильнее выведенного.

Контейнер или хост

В контейнере В хосте

Установка

docker run, данные в каталоге инстанса

Пакет дистрибутива или PGDG

Обновление версии

Сменить образ

Обновить пакет

Каталог кластера

/opt/era<постфикс>/postgresql

Путь семейства ОС — см. era_installer/reference-os-matrix.adoc#era-installer-os-matrix

Управление

docker

systemctl через юнит postgresql_<версия>_era<постфикс>.service. Кластер поднимается им же сразу при установке, поэтому systemctl stop останавливает сервер, а systemctl start поднимает — без перезагрузки.

Репликация

Не предусмотрена установщиком

Поддержана полностью

Контейнер проще и быстрее; кластер в хосте нужен там, где требуется репликация или где база должна пережить переустановку платформы.

Репликация

Мастер поднимается с --usereplic=y: тогда создаётся пользователь репликации и в pg_hba.conf добавляются разрешающие строки.

# на сервере-мастере базы
bash era/scripts/install_pg.sh --non-interactive -y \
     --operation=install_host_master --postfix=_11 \
     --pgport=5441 --usereplic=y \
     --pgreplicauser=era_replica

# на сервере-реплике
bash era/scripts/install_pg.sh --non-interactive -y \
     --operation=install_host_slave --postfix=_11 \
     --pghost=192.168.0.20 --pgport=5441 \
     --pgreplicauser=era_replica

Реплика забирает базу целиком через pg_basebackup -R: файл standby.signal и строка подключения к мастеру создаются автоматически. Без этого кластер поднялся бы обычным мастером и разъехался бы с настоящим.

После установки установщик выполняет SELECT pg_is_in_recovery() — у мастера ответ f, у реплики t. Это видно в логе и служит подтверждением, что роль назначена правильно.

Смена ролей

Операции ниже — дополнительный путь: платформа умеет переключаться на другую базу сама, по своей конфигурации. Ими пользуются, когда роль кластера нужно назначить самостоятельно.

Повысить реплику:

bash era/scripts/install_pg.sh --non-interactive -y \
     --operation=switch_to_master --postfix=_11

Понизить бывший мастер:

bash era/scripts/install_pg.sh --non-interactive -y \
     --operation=switch_to_slave --postfix=_11 \
     --pghost=<адрес нового мастера> --pgreplicauser=era_replica
Понижение уносит текущий каталог кластера в --pgbackupfolder и заливает базу заново с нового мастера. Данные, попавшие в старый мастер после расхождения, в новой базе не окажутся — они останутся только в резервной копии.

Что показывается в конце операции

После каждой операции печатается форма «что изменилось на сервере» — та же, что у установки платформы, но строки в ней про базу:

== Что изменилось на сервере ==

  [ ok ] Пакеты                             postgresql-17, postgresql-client-17
  [ ok ] PostgreSQL                         служба postgresql_17_era_11.service, порт 5441
  [ ok ] Роли базы данных                   platformpgadmin
  [ ok ] Репликация PostgreSQL              подготовлена, пользователь era_replica

Статус берётся из состояния системы, а не из кода возврата команд: служба активна (или контейнер запущен), кластер отвечает на запрос, роль есть в pg_roles. Отказ в любой строке даёт код возврата 5, даже если все команды отработали.

У операций свои строки:

Операция Что в форме

install_in_docker, install_host_master, install_host_slave

Пакеты, сама база, роли, репликация. У реплики строка репликации подтверждается самим кластером: pg_is_in_recovery() обязан вернуть t, иначе кластер поднялся отдельным мастером и разойдётся с настоящим.

switch_to_master, switch_to_slave

Только строка репликации: в этом и весь результат операции — какой стороной стал кластер. Строк про установку базы и ролей нет, эти действия в операции не предусмотрены.

uninstall

Форма отвечает на обратный вопрос — «что осталось»: контейнер или служба с юнитом и каталог кластера.

При --dry-run формы нет: сервер не менялся, отчитываться не о чем.

Пароли и роли

Ключ Что это

--pgpostgresuser

Роль, под которой платформа ходит в базу. По умолчанию platformpgadmin.

--pgerapwd

Её пароль.

--pgpostgrespwd

Пароль встроенной роли postgres.

--pgreplicauser, --pgreplicapwd

Роль репликации и её пароль.

--pgospwd

Пароль системного пользователя postgres. Нужен только для входа оператора.

В мастере вопрос о пароле называет учётную запись, для которой он вводится: «Пароль пользователя БД platformpgadmin», «Пароль пользователя БД era_replica». Подпись следует за фактическим именем — если вы задали своё через --pgpostgresuser или --pgreplicauser, спросят про него.

Все пароли скрываются в логе и в напечатанных командах. При установке кластера в хост пароль системного пользователя, если он не задан ключом, спрашивается интерактивно — терминал в этот момент отдаётся команде passwd.

Удаление базы

bash era/scripts/install_pg.sh --non-interactive --operation=uninstall \
     --postfix=_11 --pgmode=h

Удаляются юнит systemd (или контейнер) и каталог кластера. Пакеты остаются, если не задан --douninstallsyspkgs=y.

Каталог кластера удаляется общей защитой: путь должен быть абсолютным и не короче восьми символов. Пустое значение не приводит к удалению — оно приводит к предупреждению.

Каталог инстанса (/opt/era<постфикс>) убирается следом, если после удаления кластера в нём ничего не осталось. Это тот каталог, который создала сама операция, когда база ставится без платформы. Чужого удаление не коснётся: имя каталога должно совпадать с era<постфикс>, каталог не должен быть точкой монтирования, а команда — rmdir, который непустой каталог не тронет. Поэтому /var/lib/postgresql/<версия> при базе в хосте остаётся на месте: он принадлежит пакету.