Перейти к основному содержимому

Обеспечение аварийного завершения СУБД 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:

Параметр

Описание

Значение по умолчанию

Зависимости

enable_filesystem_checker

Включение функциональности контроля доступности СХД

false

disk_check_timeout

Периодичность проверки в секундах

5

disk_operation_timeout

Максимальное время на ожидание процесса записи/чтения в секундах

3

disk_retry_count

Количество неудачных попыток файловых операций до аварийного переключения лидера кластера (failover)

3

force_failover_timeout

Время (в секундах), в течение которого узел гарантированно не запускается после отключения СХД, чтобы Pangolin Manager выполнил переключение лидера кластера

Для конфигурации cluster значение равно ttl + 2*loop_wait + 5, где:

ttl - параметр Pangolin Manager, промежуток времени до запуска процесса автоматического перехода на другой ресурс; loop_wait - параметр Pangolin Manager, период опроса кластера. 5 - константа, используемая для того, чтобы значение параметра force_failover_timeout гарантированно было больше ttl + 2*loop_wait.

Для конфигурации standalone значение по умолчанию – 0

disk_check_tablespaces_count

Максимальное число табличных пространств, для которых может быть включена проверка

128

fschecker_do_instant_stop_on_critical_error

Включение алгоритма определения условий остановки СУБД

off

fschecker_critical_errors

Список критических ошибок в формате строки, содержащей номера кодов ошибок, разделенных запятыми. Изменение параметра доступно без перезапуска сервера по SIGHUP

'5,28,30' (EIO, ENOSPC, EROFS соответственно)

Используется только при указании параметра fschecker_do_instant_stop_on_critical_error в значении on

fschecker_ignored_non_critical_errors

Список некритических ошибок в формате строки, содержащей номера кодов ошибок, разделенных запятыми. Изменение параметра доступно без перезапуска сервера по SIGHUP

'2' (ENOENT)

Используется только при указании параметра fschecker_do_instant_stop_on_critical_error в значении on

fschecker_log_redirect_destination_to_syslog

Перенаправление вывода сообщений в syslog, вместо лога СУБД. Изменение параметра доступно без перезапуска сервера по SIGHUP

off

Используется только при указании параметра fschecker_do_instant_stop_on_critical_error в значении on

Проверка табличных пространств

При запуске СУБД Pangolin, если фактическое количество табличных пространств превышает значение disk_check_tablespaces_count, сервер не запускается, и в системный лог-файл будет выведено соответствующее сообщение. При запуске СУБД Pangolin, если фактическое количество табличных пространств превышает значение disk_check_tablespaces_count, сервер не запускается, и в системный лог-файл будет выведено соответствующее сообщение.

При добавлении новых табличных пространств, если:

  1. Лимит превышает значение disk_check_tablespaces_count — операция блокируется, выводится ошибка и соответствующая подсказка.
  2. Осталось менее 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-параметра fschecker_log_thread_id. По умолчанию отключено (off). Для включения вывода TID для всех процессов СУБД добавьте спецификатор %z в GUC-параметр log_line_prefix

Тип операции

Операция, вызвавшая ошибку – запись или чтение

Счетчик отказов

Количество ошибок, произошедших подряд

Код ошибки с его описанием

Уникальное значение ошибки вместе с ее описанием

Длительность выполнения системных вызовов

Время, затраченное на выполнение неудачного системного вызова

Также в сообщения об ошибках изменена следующая информация:

  • Вывод «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, выполняет проверку следующим образом:

  1. Генерируется временная метка и сохраняется в памяти.

  2. Запускается таймер disk_operation_timeout.

  3. Поток записывает метку в файл fschecker.tmp в контролируемом каталоге.

  4. Если запись завершается до истечения таймера, таймер останавливается, счетчик неудач обнуляется.

  5. Если запись не успевает завершиться вовремя, счетчик ошибок увеличивается. При достижении disk_retry_count:

    • в файл /tmp/filesystem_checker.failover записывается текущее время;
    • в лог пишется сообщение об ошибке;
    • СУБД аварийно завершается.

Затем поток проверяет успешность чтения:

  1. Запускается новый таймер disk_operation_timeout.

  2. Поток читает файл fschecker.tmp.

  3. Если чтение завершается до истечения таймера — таймер останавливается, счетчик ошибок обнуляется.

  4. Если чтение не успевает завершиться вовремя и количество неудачных попыток для текущего каталога равно значению 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.

Отключение функциональности

Для отключения функциональности:

  1. В файле конфигурации Pangolin Manager (/etc/pangolin-manager/postgres.yml) найдите строку:

    enable_filesystem_checker:'True'

    и замените ее на строку:

    enable_filesystem_checker:'False'
  2. Выполните команды:

    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.