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

Введение

В этом разделе мы изучим использование журнала предзаписи (WAL), разберем основные источники повреждений его записей и рассмотрим механизмы защиты WAL, реализованные в СУБД Pangolin.

Использование WAL​

Журнал предзаписи WAL (Write Ahead Log) используется в PostgreSQL для исключения ситуаций, когда зафиксированные изменения данных, отраженные в буферах кеша, не были записаны в энергонезависимое хранилище данных в случае сбоя. Идея использования журнала предзаписи состоит в том, что до того, как любые изменения будут произведены с данными в кеше, информация об этих изменениях уже будет записана в журнал предзаписи.

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

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

Помимо защиты от сбоев, WAL используется также для:

  • хранения сегментов WAL в архивах, что, в частности, обеспечивает возможность восстановления на момент в прошлом (PITR - Point In Time Recovery);
  • физической и логической репликации.

Источники повреждений записей WAL​

Все записи WAL защищены CRC контрольным кодом, обеспечивающем обнаружение возможных искажений. Однако эти CRC контрольные коды не защищают от искажений, а лишь обеспечивают своевременное обнаружение таких искажений. То есть, в случае несовпадения вычисленной CRC контрольной суммы с записанной в сегменте WAL, процесс, производящий восстановление по журналу предзаписи (например, startup) обнаружит факт искажения, но исправить это искажение не будет в состоянии, так как используется неизбыточный код.

Причин возможного искажения записей WAL несколько:

  • аппаратный сбой;
  • сбой ПО операционной системы (например, драйвера файловой системы);
  • сетевой сбой при передаче записей WAL по сети;
  • злонамеренное воздействие.

Защита WAL в Pangolin​

Идея защиты WAL в Pangolin состоит в записи в надежное хранилище дополнительных копий сегментов WAL. Дополнительные сегменты WAL имеют такие же названия, как и обычные, но к ним добавляется суффикс .backup. Сохраняет копии сегментов WAL специальный процесс WALRecoveryWriter, получающий записи WAL и асинхронно записывающий их в файл.

Если используется репликация, то процесс WalSender перед отправкой проверяет запись WAL. При обнаружении несовпадения CRC WalSender читает эту запись из резервной копии сегмента, которая также подвергается проверке. Вероятность повреждения записи одновременно в двух источниках значительно ниже.

Если прочтенная в резервной копии запись исправна с точки зрения CRC, она отправляется клиенту. Но если, все же, и запись, прочитанная из резервной копии сегмента WAL также оказывается испорченной, генерируется сообщение об ошибке.

Важнейшие параметры настройки​

Для настройки механизмов защиты и проверки целостности журнала предзаписи (WAL) на стороне отправителя используются следующие параметры конфигурации:

  • wal_sender_check_crc — включение проверки CRC записей WAL процессом WalSender;
  • wal_sender_panic_on_crc_error — генерировать ошибку уровня PANIC при обнаружении ошибки CRC;
  • wal_sender_check_type — тип выполняемой проверки;
  • wal_sender_backup_directory — каталог хранения резервных копий сегментов WAL;
  • wal_sender_backup_strict — останавливать сервер при невозможности восстановления испорченной записи WAL.

Типы проверок​

Параметр wal_sender_check_type может принимать несколько значений:

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