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

Контроль целостности передачи WAL на реплику

Описание

Сведения

Функциональность доступна только для редакций Enterprise и Enterprise для ERP-систем.

Для защиты от повреждения данных в случае сбоя оборудования СУБД Pangolin использует журнал предзаписи (WAL). Принцип журналирования предварительной записи заключается в том, что прежде чем данные, измененные в результате выполнения транзакции, попадут на диск, в журнал предзаписи добавляется информация необходимая для их последующего восстановления. Данные журнала используются не только для восстановления после сбоя, но и для работы репликации. Процесс WALSender читает зафиксированный на диске журнал предзаписи и отправляет WAL-записи на сервер-реплику, который находится в перманентном состоянии восстановления. На реплике полученные WAL-записи сохраняются на диск и проигрываются для применения к страницам с данными.

Для контроля целостности WAL-записи защищены CRC. Контрольная сумма при использовании WAL-записи проверяется в процессе восстановления данных (проигрывание WAL). Проверка CRC не позволяет восстановить запись, если данные WAL были повреждены при записи журнала на диск или при чтении перед отправкой. Наличие поврежденной записи журнала приводит к фатальной ошибке восстановления, что вызывает остановку репликации.

Процессы, влияющие на данные, перед фиксацией изменений помещают данные о выполнении в WAL-буфер, находящийся в разделяемой памяти. По мере заполнения циклического WAL-буфера данные сбрасываются на диск. Сброс осуществляется процессом, который добавляет новую запись или процессом WALWriter. Сброс на диск осуществляется не только по причине переполнения WAL-буфера, но и по таймеру. WALSender отправляет зафиксированные на диске WAL-записи для дальнейшего применения на реплике. Экземпляр реплики находится в состоянии постоянного восстановления – проигрывания WAL-записей с диска.

При записи или чтении с диска WAL-файл может быть поврежден, но в процессе отправки данных на реплику ошибка не будет определена, а проявится только на этапе применения WAL на реплике.

Внимание!

Контроль целостности WAL происходит только при передаче данных на реплику и не используется в процессе восстановления данных после сбоя мастера.

Восстановление поврежденных записей WAL происходит только на основном узле, при чтении данных с диска реплики контроль целостности не происходит.

Для сохранения резервной копии создается вспомогательный процесс WALRecoveryWriter, который получает блоки для записи копии WAL-сегмента и асинхронно записывает их в файл, аналогичный оригинальному WAL-сегменту с суффиксом backup в названии. Процесс WalSender перед отправкой проверяет данные, находящиеся в отправляемом сообщении. Если запись или заголовок блока повреждены, то происходит чтение поврежденной части из резервной копии журнала WAL-сегмента. Поврежденная часть заменяется резервной и происходит повторная проверка. Если не удалось восстановить поврежденные данные, то WALSender генерирует ошибку. То есть в случае повреждения WAL-данных ошибка будет происходить уже на мастере. При успехе попытки восстановления данные отправляются реплике.

Функциональность включает три способа контроля целостности:

  • Проверка корректности данных путем декодирования.
  • Проверка контрольных сумм читаемых блоков.
  • Гибридная проверка с использованием контрольных сумм блоков и декодирования WAL-записей.

Настройка

Конфигурационные параметры

К конфигурационным параметрам относятся:

Параметр

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

Описание

wal_sender_check_crc

off

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

Изменить значение параметра можно только на старте сервера. При значении параметра on во время запуска сервера инициируется процесс WALRecoveryWriter, а в разделяемой памяти создается очередь сообщений при передаче данных для сброса резервной копии WAL-данных на диск

wal_sender_panic_on_crc_error

off

Определяет поведение процесса WALSender при обнаружении поврежденных WAL-записей: если восстановить такие данные невозможно, то при включенном параметре генерируется ошибка уровня PANIC.

Данный параметр действует только при активированном параметре wal_sender_check_crc

wal_sender_check_type

record

Задает метод проверки корректности WAL-данных и работает только при активированном wal_sender_check_crc:

  • record — проверка осуществляется декодированием записей;
  • block — проверяются контрольные суммы читаемых блоков;
  • record, block — используется комбинированный метод, включающий оба подхода

wal_sender_backup_directory

$PGDATA/pg_wal

Задает путь до директории хранения резервных WAL-сегментов и файлов с контрольными суммами

wal_sender_backup_strict

off

Определяет поведение сервера при недоступности каталога:

  • при значении on сервер останавливает работу;
  • при значении off продолжает функционировать, используя стандартный путь wal_sender_backup_directory

Управление

Проверка корректности данных путем декодирования

WALSender проверяет контрольную сумму WAL-записей и корректность заголовка блока путем полного декодирования. Применяется только при включенном wal_sender_check_crc.

Конфигурационные параметры:

  • wal_sender_check_crc = on;
  • wal_sender_check_type = 'record';
  • значение wal_sender_panic_on_crc_error не влияет.

Ограничения решения:

  • Декодирование WAL-записей требует дополнительного копирования данных записи для вычисления контрольной суммы. WAL-записи могут быть большого размера, а следовательно требуют большого объема временных буферов для верификации.
  • При включенном преобразовании данных перед декодированием необходимо осуществить рассекречивание WAL-данных.
  • Повреждение возможно не только в WAL-записях, но и в заголовках WAL-блоков, так как эти данные не защищены контрольной суммой. Некоторые поля могут быть проверены логически, но поля с битовыми флагами, а также линии времени подлежат только проверке на валидность и не могут быть однозначно верифицированы.

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

WALRecoveryWriter генерирует дополнительный файл с контрольными суммами на каждый блок для каждого WAL-сегмента, а WALSender проверяет контрольную сумму прочитанного блока. По умолчанию этот параметр выключен (off) и применяется только при включенном wal_sender_check_crc.

Конфигурационные параметры:

  • wal_sender_check_crc = on;
  • wal_sender_check_type = 'block';
  • значение wal_sender_panic_on_crc_error не влияет.
примечание

Хранение контрольных сумм WAL-блоков в отдельном файле нарушает целостность данных и не несет гарантии, что непосредственно контрольная сумма не была повреждена.

Гибридная проверка с использованием контрольных сумм блоков и декодирования WAL-записей

Конфигурационные параметры:

  • wal_sender_check_crc = on;
  • wal_sender_check_type = 'record, block';
  • значение wal_sender_panic_on_crc_error не влияет.

Функциональность может быть настроена так, чтобы одновременно выполнялись проверка по контрольным суммам блока и проверка через декодирование. Такой подход позволяет минимизировать ограничение повреждения контрольной суммы блока. Если контрольная сумма блока не совпадает ни с оригинальным WAL-сегментом, ни с контрольной суммой блока из резервной копии, то наиболее вероятно, что повреждена именно сама контрольная сумма, а не оба сегмента. Для подтверждения этого предположения дополнительно выполняется проверка данных методом декодирования.

Влияние на потоковую и логическую репликации

Функциональность влияет на потоковую репликацию. Процесс WalSender, отвечающий за отправку WAL-сегментов, может завершиться с ошибкой при обнаружении некорректных записей в журнале.