Обеспечение аварийного завершения СУБД Pangolin при отключении системы хранения данных
Описание
Реализованная функциональность предназначена для определения отказа/отключения системы хранения данных (далее СХД) в кластере. При определении отказа/отключения системы хранения данных СУБД Pangolin аварийно завершается, а Pangolin Manager переключает лидера кластера.
Пути к каталогам для определения состояния СХД:
-
постоянные пути:
-
подкаталоги
PGDATA:global– подкаталог, содержащий общие таблицы кластера, такие какpg_database;pg_wal– подкаталог, содержащий файлы WAL;pg_commit_ts– подкаталог, содержащий данные о времени фиксации транзакций;pg_dynshmem– подкаталог, содержащий файлы, используемые подсистемой динамически разделяемой памяти;pg_notify– подкаталог, содержащий данные состояния прослушивания и уведомлений;pg_prep_stats– подкаталог для хранения файлов текстов запросов на подготовку для задачи «Поддержка подготовленных запросов для транзакционного режима»;pg_serial– подкаталог, содержащий информацию о выполненных сериализуемых транзакциях;pg_snapshots– подкаталог, содержащий экспортированные снепшоты;pg_subtrans– подкаталог, содержащий данные о состоянии подтранзакций;pg_twophase– подкаталог, содержащий файлы состояний для подготовленных транзакций;pg_multixact– подкаталог, содержащий данные о состоянии мультитранзакций;base– подкаталог, содержащий подкаталоги для каждой базы данных;pg_pp_cache– кеш политики паролей;;pg_replslot– подкаталог, содержащий данные слота репликации;pg_stat– подкаталог, содержащий постоянные файлы для подсистемы статистики;pg_stat_tmp– подкаталог, содержащий временные файлы для подсистемы статистики;pg_xact– подкаталог, содержащий данные о состоянии транзакции;pg_logical– подкаталог, содержащий данные о состоянии для логического декодирования;pg_perf_insights– подкаталог, содержащий файлы с данными для задачи аналитики производительности;pg_auth– подкаталог используется задачей «Сквозная аутентификация»;
-
каталог
log_directory;
-
-
каталоги табличных пространств.
Схема процесса
Процесс работы функциональности:

Конфигурационные параметры
Функциональность настраивается через параметры в конфигурационном файле postgresql.conf:
Параметр | Описание | Значение по умолчанию | Зависимости |
|---|---|---|---|
| Включение функциональности контроля доступности СХД |
| – |
| Периодичность проверки в секундах |
| – |
| Максимальное время на ожидание процесса записи/чтения в секундах |
| – |
| Количество неудачных попыток файловых операций до аварийного переключения лидера кластера (failover) |
| – |
| Время (в секундах), в течение которого узел гарантированно не запускается после отключения СХД, чтобы Pangolin Manager выполнил переключение лидера кластера | Для конфигурации
Для конфигурации standalone значение по умолчанию – | – |
| Максимальное число табличных пространств, для которых может быть включена проверка |
| – |
| Включение алгоритма определения условий остановки СУБД |
| – |
| Список критических ошибок в формате строки, содержащей номера кодов ошибок, разделенных запятыми. Изменение параметра доступно без перезапуска сервера по |
| Используется только при указании параметра |
| Список некритических ошибок в формате строки, содержащей номера кодов ошибок, разделенных запятыми. Изменение параметра доступно без перезапуска сервера по |
| Используется только при указании параметра |
| Перенаправление вывода сообщений в |
| Используется только при указании параметра |
Проверка табличных пространств
При запуске СУБД Pangolin, если фактическое количество табличных пространств превышает значение disk_check_tablespaces_count, сервер не запускается, и в системный лог-файл будет выведено соответствующее сообщение.
При добавлении новых табличных пространств, если:
- Лимит превышает значение
disk_check_tablespaces_count— операция блокируется, выводится ошибка и соответствующая подсказка. - Осталось менее 10 слотов — выводится предупреждение.
Доработка
Алгоритм определения условий остановки СУБД
Механизм определения условий остановки становится активным, если установлено значениеon для GUC-параметра fschecker_do_instant_stop_on_critical_error. По умолчанию параметр имеет значение off, что сохраняет совместимость с предыдущими версиями СУБД.
Алгоритм определения условий остановки СУБД – это доработка функциональности, при которой ошибки ввода-вывода разделены на 3 категории:
-
Критические:
При возникновении критической ошибки СУБД немедленно останавливается, при этом счетчик отказов (
disk_retry_count) не увеличивается.Список критических ошибок настраивается GUC-параметром
fschecker_critical_errorsв формате строки, содержащей номера кодов ошибок, разделенных запятыми. Значение по умолчанию –'5,28,30'(EIO,ENOSPC,EROFSсоответственно). Изменение параметра доступно без перезапуска сервера поSIGHUP. -
Некритические:
Все остальные ошибки, которые не относятся к критичным, считаются некритическими. При их возникновении счетчик отказов (
disk_retry_count) увеличивается на единицу. Для обеспечения более прогнозируемого времени до остановки СУБД применяется ожидание истечения тайм-аутаdisk_operation_timeoutпосле вывода сообщения об ошибке. Когда количество накопленных некритических ошибок достигает установленного лимита, СУБД выполнит процедуру аварийного завершения работы. -
Игнорируемые некритические:
Не все некритические ошибки должны приводить к остановке СУБД. Например, ошибка
ENOENT(«файл или каталог не найден») может возникать при попытке обращения к несуществующей директории, что является ожидаемым поведением в некоторых ситуациях (например, при выключенной сквозной аутентификации, когда отсутствует директория$PGDATA/pg_auth).Такие ошибки не увеличивают счетчик отказов (
disk_retry_count), но запускают таймер ожидания, длительность которого определяется значением параметраdisk_operation_timeout.примечаниеСообщения об этих ошибках регистрируются только при активированном уровне журналирования
DEBUG3и выше.Для исключения ошибок из категории некритических введен GUC-параметр
fschecker_ignored_non_critical_errorsв формате строки, содержащей номера кодов ошибок, разделенных запятыми. Значение по умолчанию –'2'(ENOENT). Изменение параметра доступно без перезапуска сервера поSIGHUP.примечаниеОшибка
ETIMEDOUTявляется неигнорируемой.
Логирование
В рамках доработки доступен GUC-параметр fschecker_log_redirect_destination_to_syslog для перенаправления вывода сообщений в syslog, вместо лога СУБД. Значение по умолчанию off. Изменение параметра доступно без перезапуска сервера по SIGHUP.
Ниже представлена таблица, отражающая структуру сообщений об ошибках:
Параметр | Описание |
|---|---|
Идентификатор потока (TID) | Отслеживание доступности директории. Автоматически добавляется при установке GUC-параметра |
Тип операции | Операция, вызвавшая ошибку – запись или чтение |
Счетчик отказов | Количество ошибок, произошедших подряд |
Код ошибки с его описанием | Уникальное значение ошибки вместе с ее описанием |
Длительность выполнения системных вызовов | Время, затраченное на выполнение неудачного системного вызова |
Также в сообщения об ошибках изменена следующая информация:
- Вывод «failover» заменен на «Stop postmaster by sending SIGKILL (signal 9)», поскольку failover инициирует Pangolin Manager.
- Добавлено сообщение о сбросе счетчика отказов при успешной операции, если до этого произошла ошибка.
Примеры сообщений без алгоритма:
[3323970]: app=file system checker LOG: File operation failed for path /PATH_TO_DIR/tablespace_1, fails count updated
[3323970]: app=file system checker LOG: File operation failed for path /PATH_TO_DIR/tablespace_1, failover
Примеры сообщений с включенным алгоритмом:
Сообщения об ошибках
Остановка СУБД при возникновении критической ошибки в операции записи:
[2682450] - thread(2682544): app=file system checker LOG: File operation (write) failed for path /PATH_TO_DIR/tablespace_1. Critical error: 30 (Read-only file system). Fails counter: 0. Syscall durations: opendir: 0.078 ms, closedir: 0.005 ms, access: 0.007 ms, open: 0.062 ms, write: 0.018 ms, fsync: not started, close: 0.087 ms
[2682450] - thread(2682544): app=file system checker WARNING: File operation (write) failed for path /PATH_TO_DIR/tablespace_1. Critical error: 30 (Read-only file system). Fails counter: 0. Stop postmaster by sending SIGKILL (signal 9)
Остановка СУБД при возникновении критической ошибки в операции чтения:
[2685501] - thread(2685537): app=file system checker LOG: File operation (read) failed for path /PATH_TO_DIR/tablespace_1. Critical error: 5 (Input/output error). Fails counter: 0. Syscall durations: access: 0.069 ms, open: 0.030 ms, fstat: 0.003 ms, read: 0.013 ms, close: 0.007 ms
[2685501] - thread(2685537): app=file system checker WARNING: File operation (read) failed for path /PATH_TO_DIR/tablespace_1. Critical error: 5 (Input/output error). Fails counter: 0. Stop postmaster by sending SIGKILL (signal 9)
Серия из ошибок по тайм-ауту с увеличением счетчика отказов с последующей остановкой СУБД:
[2687929] - thread(2688022): app=file system checker LOG: File operation (write) failed for path /PATH_TO_DIR/tablespace_1. Error: 110 (Timed out). Fails counter updated: 1. Syscall durations: opendir: 100.196 ms, closedir: 100.122 ms, access: 500.173 ms, open: 500.277 ms, write: 1000.099 ms, fsync: 799.509 ms (in progress), close: not started
[2687929] - thread(2688022): app=file system checker LOG: File operation (write) failed for path /PATH_TO_DIR/tablespace_1. Error: 110 (Timed out). Fails counter updated: 2. Syscall durations: opendir: 100.183 ms, closedir: 100.099 ms, access: 500.185 ms, open: 500.239 ms, write: 1000.159 ms, fsync: 799.347 ms (in progress), close: not started
[2687929] - thread(2688022): app=file system checker LOG: File operation (write) failed for path /PATH_TO_DIR/tablespace_1. Error: 110 (Timed out). Fails counter updated: 3. Syscall durations: opendir: 100.264 ms, closedir: 100.077 ms, access: 500.212 ms, open: 500.373 ms, write: 1000.099 ms, fsync: 799.197 ms (in progress), close: not started
[2687929] - thread(2688022): app=file system checker WARNING: File operation (write) failed for path /PATH_TO_DIR/tablespace_1. Fails counter: 3. Stop postmaster by sending SIGKILL (signal 9)
Серия из некритических ошибок с увеличением счетчика отказов с последующей остановкой СУБД:
[2689133] - thread(2689227): app=file system checker LOG: File operation (write) failed for path /PATH_TO_DIR/tablespace_1. Non-critical error: 9 (Bad file descriptor). Fails counter updated: 1. Syscall durations: opendir: 0.079 ms, closedir: 0.004 ms, access: 0.007 ms, open: 0.083 ms, write: 0.023 ms, fsync: not started, close: 0.123 ms
[2689133] - thread(2689227): app=file system checker LOG: File operation (write) failed for path /PATH_TO_DIR/tablespace_1. Non-critical error: 122 (Disk quota exceeded). Fails counter updated: 2. Syscall durations: opendir: 0.079 ms, closedir: 0.005 ms, access: 0.007 ms, open: 0.073 ms, write: 0.015 ms, fsync: not started, close: 0.105 ms
[2689133] - thread(2689227): app=file system checker LOG: File operation (write) failed for path /PATH_TO_DIR/tablespace_1. Non-critical error: 1 (Operation not permitted). Fails counter updated: 3. Syscall durations: opendir: 0.050 ms, closedir: 0.003 ms, access: 0.007 ms, open: 0.059 ms, write: 0.015 ms, fsync: not started, close: 0.133 ms
[2689133] - thread(2689227): app=file system checker WARNING: File operation (write) failed for path /PATH_TO_DIR/tablespace_1. Fails counter: 3. Stop postmaster by sending SIGKILL (signal 9)
Серия из игнорируемых ошибок без увеличения счетчика отказов с последующей остановкой СУБД при возникновении критической ошибки:
[2692260] - thread(2692354): app=file system checker DEBUG: File operation (write) failed for path /PATH_TO_DIR/tablespace_1. Non-critical error ignored: 122 (Disk quota exceeded). Fails counter remains unchanged: 0. Syscall durations: opendir: 0.086 ms, closedir: 0.006 ms, access: 0.010 ms, open: 0.097 ms, write: 0.019 ms, fsync: not started, close: 0.134 ms
[2692260] - thread(2692354): app=file system checker DEBUG: File operation (write) failed for path /PATH_TO_DIR/tablespace_1. Non-critical error ignored: 9 (Bad file descriptor). Fails counter remains unchanged: 0. Syscall durations: opendir: 0.096 ms, closedir: 0.007 ms, access: 0.025 ms, open: 0.091 ms, write: 0.022 ms, fsync: not started, close: 0.152 ms
[2692260] - thread(2692354): app=file system checker DEBUG: File operation (write) failed for path /PATH_TO_DIR/tablespace_1. Non-critical error ignored: 1 (Operation not permitted). Fails counter remains unchanged: 0. Syscall durations: opendir: 0.088 ms, closedir: 0.006 ms, access: 0.010 ms, open: 0.062 ms, write: 0.015 ms, fsync: not started, close: 0.129 ms
[2692260] - thread(2692354): app=file system checker LOG: File operation (write) failed for path /PATH_TO_DIR/tablespace_1. Critical error: 28 (No space left on device). Fails counter: 0. Syscall durations: opendir: 0.078 ms, closedir: 0.005 ms, access: 0.007 ms, open: 0.076 ms, write: 0.017 ms, fsync: not started, close: 0.120 ms
[2692260] - thread(2692354): app=file system checker WARNING: File operation (write) failed for path /PATH_TO_DIR/tablespace_1. Critical error: 28 (No space left on device). Fails counter: 0. Stop postmaster by sending SIGKILL (signal 9)
Сброс счетчика отказов после неудачной записи:
[2694673] - thread(2694765): app=file system checker LOG: File operation (write) failed for path /PATH_TO_DIR/tablespace_1. Non-critical error: 1 (Operation not permitted). Fails counter updated: 1. Syscall durations: opendir: 0.060 ms, closedir: 0.003 ms, access: 0.006 ms, open: 0.040 ms, write: 0.011 ms, fsync: not started, close: 0.078 ms
[2694673] - thread(2694765): app=file system checker LOG: File operation (write) succeeded after 1 failure for path /PATH_TO_DIR/tablespace_1. Fails counter has been reset to 0
Настройка
Логика проверки
При запуске, СУБД Pangolin считывает параметры enable_filesystem_checker, disk_check_timeout, disk_operation_timeout, disk_retry_count, force_failover_timeout и disk_check_tablespaces_count. Если параметр enable_filesystem_checker равен true, СУБД Pangolin запускает потоки проверки, количество которых равно количеству уникальных путей к каталогам для проверки.
Каждый поток, с интервалом, заданным параметром disk_check_timeout, выполняет проверку следующим образом:
-
Генерируется временная метка и сохраняется в памяти.
-
Запускается таймер
disk_operation_timeout. -
Поток записывает метку в файл
fschecker.tmpв контролируемом каталоге. -
Если запись завершается до истечения таймера, таймер останавливается, счетчик неудач обнуляется.
-
Если запись не успевает завершиться вовремя, счетчик ошибок увеличивается. При достижении
disk_retry_count:- в файл
/tmp/filesystem_checker.failoverзаписывается текущее время; - в лог пишется сообщение об ошибке;
- СУБД аварийно завершается.
- в файл
Затем поток проверяет успешность чтения:
-
Запускается новый таймер
disk_operation_timeout. -
Поток читает файл
fschecker.tmp. -
Если чтение завершается до истечения таймера — таймер останавливается, счетчик ошибок обнуляется.
-
Если чтение не успевает завершиться вовремя и количество неудачных попыток для текущего каталога равно значению
disk_retry_count— производится запись времени в/tmp/filesystem_checker.failover, логирование и аварийное завершение.Дополнительно выполняется сравнение, если считанная метка не совпадает с ранее сохраненной, и количество неудачных попыток достигло
disk_retry_count, выполняется аварийное завершение по описанному выше сценарию.
Если метки совпадают, процесс ожидает срабатывания таймера disk_check_timeout.
Поведение при повторном запуске
При последующем запуске СУБД Pangolin, происходит чтение файла filesystem_checker.failover, если он существует. Записанное в нем время сравнивается с текущим временем и если текущее время меньше суммы записанного и force_failover_timeout, выполнение Pangolin аварийно завершается.
Защита от зависаний
Запись сообщений в логи и запись в файл filesystem_checker.failover происходит по таймеру disk_operation_timeout, что бы исключить зависание потоков проверки на этих операциях при отключении СХД.
Если запись в файл filesystem_checker.failover завершается ошибкой, Pangolin аварийно завершается.
Если запись в файл filesystem_checker.failover продолжается дольше указанного времени, Pangolin аварийно завершается.
На попытку чтения из файла filesystem_checker.failover выделяется 3 секунды, что бы исключить зависание потоков проверки на этих операциях при отключении СХД. При невозможности чтения файла filesystem_checker.failover в течение 3 секунд, выполнение Pangolin аварийно завершается. Если файл не существует, Pangolin продолжает работу.
Применение параметров
Решение должно применять новые параметры по сигналу SIGHUP, кроме параметров enable_filesystem_checker и disk_check_tablespaces_count.
Изменение параметров enable_filesystem_checker и disk_check_tablespaces_count требует перезапуск кластера Pangolin.
Отключение функциональности
Для отключения функциональности:
-
В файле конфигурации Pangolin Manager (
/etc/pangolin-manager/postgres.yml) найдите строку:enable_filesystem_checker:'True'и замените ее на строку:
enable_filesystem_checker:'False' -
Выполните команды:
pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml reload clustername
pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml restart clusternameили
reload --force
restart --force
Управление
Кластерная конфигурация
В Pangolin Manager необходимо добавить конфигурационные параметры: enable_filesystem_checker, disk_check_timeout, disk_operation_timeout, disk_retry_count, force_failover_timer и disk_check_tablespaces_count.