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

Задание 1: Настройка проверки записей WAL

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

Журнал предзаписи и его роль в целостности данных​

  1. Подключитесь к экземпляру СУБД и изучите текущие настройки синхронизации WAL:

    [student@srv1 ~]$ sudo su - postgres
    ===============================================================
    You are connected to Pangolin Cluster (Pobeda)
    - Hostname : srv1
    - IP Address : <IP-Address1>
    ---------------------------------------------------------------
    - node ( master ) : <IP-Address1>
    - node ( replica ) : <IP-Address2>
    - arbiter : <IP-Address3>
    - Manager version : 2.1.13
    - Pangolin version : 6.7.0
    ===============================================================
    [postgres@srv1 ~]$ psql
    postgres=# \dconfig synchronous_commit
    Параметр | Значение
    --------------------+----------
    synchronous_commit | on
  2. Изучите значение параметра wal_writer_delay, определяющего периодичность сброса кеша WAL на диск:

    postgres=# \dconfig wal_writer_delay
    Параметр | Значение
    ------------------+----------
    wal_writer_delay | 200ms
  3. Проверьте, настроена ли синхронная репликация в вашем кластере:

    postgres=# SELECT * FROM pg_stat_replication \gx
  4. Проверьте, задан ли список синхронных реплик:

    postgres=# \dconfig synchronous_standby_names
    List of configuration parameters
    Parameter | Value
    ---------------------------+-----------------
    synchronous_standby_names | "<IP-Address2>"
    (1 row)

Изучение процессов передачи WAL​

  1. На мастере (лидере) кластера выполните команду для просмотра процессов PostgreSQL:

    [student@srv1 ~]$ ps f -C postgres

    Ожидаемый результат: в списке процессов должен присутствовать процесс walsender, обслуживающий реплику:

    [student@srv1 ~]$ ... \_ postgres: walsender patroni <IP-Address2>(34786) streaming 0/14000000
  2. На реплике выполните аналогичную команду:

    [student@srv1 ~]$ ssh <имя_реплики> ps f -C postgres

    Ожидаемый результат: в списке процессов присутствуют:

    • startup recovering — процесс восстановления, применяющий WAL;
    • walreceiver — процесс, принимающий WAL от мастера.
  3. Изучите файлы сегментов WAL в каталоге pg_wal:

    postgres=# SELECT * FROM pg_ls_waldir() LIMIT 5;

    Ожидаемый результат: список файлов WAL размером 16777216 байт (16 МБ) с информацией о времени модификации.

Защита WAL и механизм резервных копий сегментов​

  1. Изучите теоретические сведения о защите WAL:

    • все записи WAL защищены контрольными суммами, которые вычисляются при записи в файл журнала и проверяются при считывании процессом startup;
    • при обнаружении поврежденной записи процесс startup приостанавливает работу, что останавливает и репликацию;
    • в СУБД Pangolin реализован специальный механизм защиты передачи WAL на реплику, основанный на создании резервных копий сегментов WAL с суффиксом backup;
    • процесс walrecoverywriter асинхронно записывает копии блоков WAL в резервные файлы.
  2. Схема работы защиты WAL при включенной опции:

    • walsender проверяет контрольную сумму отправляемой записи WAL;
    • при несовпадении считывается запись из резервной копии сегмента;
    • если контрольная сумма резервной копии совпадает, поврежденная запись перезаписывается;
    • запись передается по протоколу репликации;
    • при неудаче генерируется ошибка, требующая восстановления на мастере.

Режимы проверки целостности WAL​

В СУБД Pangolin реализованы три режима проверки целостности WAL:

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

    • используется файл с контрольными суммами каждого блока каждого WAL-сегмента;
    • walrecoverywriter записывает контрольные суммы, walsender проверяет их при чтении.
  2. Проверка корректности данных декодированием:

    • выполняется декодирование записей WAL;
    • проверяется контрольная сумма и корректность заголовка;
    • требует больших временных буферов;
    • при защитном преобразовании данных требуется их рассекречивание.
  3. Гибридная проверка:

    • выполняются обе проверки: по контрольным суммам и через декодирование;
    • позволяет выявить случаи, когда повреждена сама контрольная сумма блока, а не данные.

Настройка параметров защиты WAL​

  1. Просмотрите все параметры, связанные с защитой WAL в процессе отправки:

    postgres=# SELECT name, setting, unit, context FROM pg_settings
    WHERE name LIKE 'wal_sender%' AND name NOT LIKE '%timeout';
    name | setting | context
    -------------------------------+---------+----------
    wal_sender_backup_directory | | postmaster
    wal_sender_backup_strict | off | postmaster
    wal_sender_check_crc | off | postmaster
    wal_sender_check_type | record | postmaster
    wal_sender_panic_on_crc_error | off | postmaster
  2. Изучите назначение каждого параметра:

    • wal_sender_check_crc — включает контроль целостности WAL;
    • wal_sender_panic_on_crc_error — генерировать PANIC при невозможности восстановления поврежденной записи;
    • wal_sender_check_type — метод проверки WAL (возможные значения: block — поблоковая проверка CRC, record — проверка декодированием, record, block — гибридная проверка);
    • wal_sender_backup_directory — каталог для размещения резервных сегментов WAL и файлов с контрольными суммами;
    • wal_sender_backup_strict — поведение при недоступности каталога.
  3. Обратите внимание на контекст параметров — postmaster означает, что для применения изменений требуется перезагрузка экземпляра.

Практическая настройка защиты WAL​

  1. Создайте каталог для резервных копий сегментов WAL:

    [student@srv1 ~]$ sudo -u postgres mkdir -p /pgdata/06/wal_backup
  2. Внесите изменения в конфигурацию (от суперпользователя):

    postgres=# ALTER SYSTEM SET wal_sender_backup_directory = '/pgdata/06/wal_backup';
    postgres=# ALTER SYSTEM SET wal_sender_check_crc = on;
    postgres=# ALTER SYSTEM SET wal_sender_check_type = 'record, block';
  3. Перезагрузите экземпляр для применения изменений:

    [student@srv1 ~]$ sudo systemctl restart postgresql
  4. Проверьте применение настроек:

    postgres=# SELECT name, setting FROM pg_settings
    WHERE name IN ('wal_sender_backup_directory', 'wal_sender_check_crc', 'wal_sender_check_type');
    name | setting
    ----------------------------+-----------------------
    wal_sender_backup_directory | /pgdata/06/wal_backup
    wal_sender_check_crc | on
    wal_sender_check_type | record, block
  5. Убедитесь, что процесс walrecoverywriter запущен:

    [student@srv1 ~]$ ps f -C postgres | grep recovery

    Ожидаемый результат: процесс с именем postgres: walrecoverywriter.

Подведем итоги​

Вопрос 1

Вопрос 1: Какой параметр включает контроль целостности WAL?

Вопрос 2

Вопрос 2: Посмотрите на следующий вывод:

student=> SHOW wal_sender_check_type;
 wal_sender_check_type 
-----------------------
 record
(1 строка)

В каком режиме будет работать проверка целостности WAL, если ее включить в этой системе?