Смоленск 1.6 Postgres timeout - получен запрос на "вежливое" выключение

Tempest

New member
Сообщения
10
#1
Доброго времени суток.

Установлен штатный postgres из дистрибутива.

Код:
root@server:/lib/systemd/system# dpkg -l | grep postgresq
ii  postgresql                                    9.6+181.astrase3                          all          object-relational SQL database (supported version)
ii  postgresql-9.6                                9.6.10-astrase3                           amd64        object-relational SQL database, version 9.6 server
ii  postgresql-astra                              17                                        amd64        PostgreSQL Astra edition metapackage
ii  postgresql-client                             9.6+181.astrase3                          all          front-end programs for PostgreSQL (supported version)
ii  postgresql-client-9.6                         9.6.10-astrase3                           amd64        front-end programs for PostgreSQL 9.6
ii  postgresql-client-common                      181.astrase3                              all          manager for multiple PostgreSQL client versions
ii  postgresql-common                             181.astrase3                              all          PostgreSQL database-cluster manager
ii  postgresql-contrib-9.6                        9.6.10-astrase3                           amd64        additional facilities for PostgreSQL
Случился форсмажор, сервер завершил работу нештатно. Теперь при запуске postgres пытается восстановить базу (текстовые логи сейчас выложить не могу, пишу от руки; на фотографии экрана виден настоящий текст):

Код:
Система БД была остановлена нештатно; производится автоматическое восстановление
....
система баз данных запускается
система баз данных запускается
система баз данных запускается
....
получен запрос на вежливое выключение
выключение
система БД выключена
Интернет для штатных версий пишет, что нужно менять systemd конфиг - добавлять параметр TimeoutSec в секцию [Service]. В Астре 1.6 это /lib/systemd/system/postgresql.service. После этого не забыть сделать systemctl daemon-reload. Все это сделали, но не помогло. Базе снова и снова прилетает завершение работы в процессе восстановления.

Где этот злощастный параметр у 1.6 спрятан?
 

Вложения

  • 131.8 КБ Просмотры: 107

oko

New member
Сообщения
560
#2
to Tempest
Еще можно загрузить postgresql в single mode - тогда systemd его не обслуживает и не убивает по timeout (вначале su postgres, затем
/путь-к-исполняемому-файлу-postgres --single -c config_file=/путь-к-postgresql.conf -D /путь-к-каталогу-установки-postgres -P -d 1). Дождаться загрузки базы и убить процесс через kill -15 pid-процесса-postgres. Очистить кэш. После этого можно перезапуститься через стандартный вызов (с использованием systemd-сервиса) уже без таймаутов...
 

Tempest

New member
Сообщения
10
#3
Спасибо за быстрый ответ.

Думаю Ваше решение подходит для ручного восстановления работы. Но оно предполагает наличие админа (или как минимум юзера с прямыми руками) на комплексе в случае такой ситуации. А хочется иметь дать возможность постгресу самому восстановиться раз он так может. Тем не менее, хочу уточнить:

Это Вы говорите о командах вида:

Код:
sync
echo 3 > /proc/sys/vm/drop_caches
?
 

oko

New member
Сообщения
560
#4
to Tempest
Кэш postgresql, да, приведенной вами командой...
 

inforse

New member
Сообщения
4
#5
Добрый день! Проблема актуальна! Кто-нибудь решил ситуацию исправлением работы работы службы systemd?
Выставлял параметр в
/etc/systemd/multi-user.target.wants/@postgresql.service
а так же в /run/systemd/generator/postgresql.service.wants/@postgresql@9.6-xxx.service
Выставлял разные значения от нуля до много.. Но при запуске изменений нет, в режиме восстановления примерно 3 секунды и получает запрос на вежливое отключение.
Я знаю что можно сделать в сингле но надо что бы восстанавливалась сама, как и раньше, дежурная смена задолбает потом.
 

Tempest

New member
Сообщения
10
#6
Уффф.. Вроде бы смог раскопать решение!

Нужно изменить файл /etc/postgresql/9.6/main/pg_ctl.conf, добавив следующие значения:

pg_ctl_options = '-w -t 1800'

где 1800 - это количество секунд, через которое команда запуска кластера Постгрес вернет systemd информацию о текущем состоянии кластера Постгрес (если конечно запуск не завершится до этого момента).

То есть работает это так:
1. systemd пинает команду
ExecStart=@/usr/bin/pg_ctlcluster postgresql@%i --skip-systemctl-redirect %i start
2. Та по умолчанию через очень короткое время (4-6 секунд) возвращает systemd фразу "знаешь, сейчас кластер сообщает что он восстанавливается".
3. systemd почему-то реагирует на это "ах так, ну тогда SIGTERM тебе".
4. Посгтрес сообщает о вежливом выключении и отменяет процесс восстановления

Также хочу заметить что у меня изменен /lib/systemd/system/postgresql@.service в следующем плане:

[Service]
TimeoutStartSec=1d
TimeoutStopSec=100m

То есть на уровне systemd я разрешил стартовать 1 день и останавливаться в течение 100 минут. На моей тестовой большой базе я заметил, что штатного времени в ... сколько же там было... 1м 30 секунд (?) иногда недостаточно для корректного останова базы, находящейся под большой нагрузкой. А значит после перезагрузки сервера она пойдет восстанавливаться. Оно нам надо? При штатной то перезагрузке... Поэтому разрешил останавливаться подольше.

Не забудьте сделать

systemctl reload-daemon

после изменения postgresql@.service файла. Правки для pg_ctl.conf применяются при следующем запуске Постгрес.
 

inforse

New member
Сообщения
4
#7
Уффф.. Вроде бы смог раскопать решение!

Нужно изменить файл /etc/postgresql/9.6/main/pg_ctl.conf, добавив следующие значения:

pg_ctl_options = '-w -t 1800'

где 1800 - это количество секунд, через которое команда запуска кластера Постгрес вернет systemd информацию о текущем состоянии кластера Постгрес (если конечно запуск не завершится до этого момента).

То есть работает это так:
1. systemd пинает команду
ExecStart=@/usr/bin/pg_ctlcluster postgresql@%i --skip-systemctl-redirect %i start
2. Та по умолчанию через очень короткое время (4-6 секунд) возвращает systemd фразу "знаешь, сейчас кластер сообщает что он восстанавливается".
3. systemd почему-то реагирует на это "ах так, ну тогда SIGTERM тебе".
4. Посгтрес сообщает о вежливом выключении и отменяет процесс восстановления

Также хочу заметить что у меня изменен /lib/systemd/system/postgresql@.service в следующем плане:

[Service]
TimeoutStartSec=1d
TimeoutStopSec=100m

То есть на уровне systemd я разрешил стартовать 1 день и останавливаться в течение 100 минут. На моей тестовой большой базе я заметил, что штатного времени в ... сколько же там было... 1м 30 секунд (?) иногда недостаточно для корректного останова базы, находящейся под большой нагрузкой. А значит после перезагрузки сервера она пойдет восстанавливаться. Оно нам надо? При штатной то перезагрузке... Поэтому разрешил останавливаться подольше.

Не забудьте сделать

systemctl reload-daemon

после изменения postgresql@.service файла. Правки для pg_ctl.conf применяются при следующем запуске Постгрес.
Спасибо за предложенное решение! Проверили в разных вариациях, вроде работает. Попробовали даже без добавления в postgresql@.service, и без него работает. Терминал только не отпускает пока не востановиться, но это мелочи.
Ощущение, как-будто система игнорирует настройки systemd.
 

Tempest

New member
Сообщения
10
#8
Да, к сожалению systemctl status postgres@9.6-main не отпустит, пока восстанавливается :( Не знаю что с этим делать.