Задание 1: Настройка проверки записей WAL
По итогам выполнения данной лабораторной работы вы научитесь понимать роль журнала предзаписи (WAL) в обеспечении целостности данных, анализировать процессы его передачи при репликации, а также настраивать различные режимы проверки и параметры защиты WAL в соответствии с требованиями к надежности системы.
Журнал предзаписи и его роль в целостности данных
-
Подключитесь к экземпляру СУБД и изучите текущие настройки синхронизации 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 ~]$ psqlpostgres=# \dconfig synchronous_commitПараметр | Значение--------------------+----------synchronous_commit | on -
Изучите значение параметра
wal_writer_delay, определяющего периодичность сброса кеша WAL на диск:postgres=# \dconfig wal_writer_delayПараметр | Значение------------------+----------wal_writer_delay | 200ms -
Проверьте, настроена ли синхронная репликация в вашем кластере:
postgres=# SELECT * FROM pg_stat_replication \gx -
Проверьте, задан ли список синхронных реплик:
postgres=# \dconfig synchronous_standby_namesList of configuration parametersParameter | Value---------------------------+-----------------synchronous_standby_names | "<IP-Address2>"(1 row)
Изучение процессов передачи WAL
-
На мастере (лидере) кластера выполните команду для просмотра процессов PostgreSQL:
[student@srv1 ~]$ ps f -C postgresОжидаемый результат: в списке процессов должен присутствовать процесс
walsender, обслуживающий реплику:[student@srv1 ~]$ ... \_ postgres: walsender patroni <IP-Address2>(34786) streaming 0/14000000 -
На реплике выполните аналогичную команду:
[student@srv1 ~]$ ssh <имя_реплики> ps f -C postgresОжидаемый результат: в списке процессов присутствуют:
startup recovering— процесс восстановления, применяющий WAL;walreceiver— процесс, принимающий WAL от мастера.
-
Изучите файлы сегментов WAL в каталоге
pg_wal:postgres=# SELECT * FROM pg_ls_waldir() LIMIT 5;Ожидаемый результат: список файлов WAL размером 16777216 байт (16 МБ) с информацией о времени модификации.
Защита WAL и механизм резервных копий сегментов
-
Изучите теоретические сведения о защите WAL:
- все записи WAL защищены контрольными суммами, которые вычисляются при записи в файл журнала и проверяются при считывании процессом
startup; - при обнаружении поврежденной записи процесс
startupприостанавливает работу, что останавливает и репликацию; - в СУБД Pangolin реализован специальный механизм защиты передачи WAL на реплику, основанный на создании резервных копий сегментов WAL с суффиксом
backup; - процесс
walrecoverywriterасинхронно записывает копии блоков WAL в резервные файлы.
- все записи WAL защищены контрольными суммами, которые вычисляются при записи в файл журнала и проверяются при считывании процессом
-
Схема работы защиты WAL при включенной опции:
walsenderпроверяет контрольную сумму отправляемой записи WAL;- при несовпадении считывается запись из резервной копии сегмента;
- если контрольная сумма резервной копии совпадает, поврежденная запись перезаписывается;
- запись передается по протоколу репликации;
- при неудаче генерируется ошибка, требующая восстановления на мастере.
Режимы проверки целостности WAL
В СУБД Pangolin реализованы три режима проверки целостности WAL:
-
Проверка контрольных сумм читаемых блоков:
- используется файл с контрольными суммами каждого блока каждого WAL-сегмента;
walrecoverywriterзаписывает контрольные суммы,walsenderпроверяет их при чтении.
-
Проверка корректности данных декодированием:
- выполняется декодирование записей WAL;
- проверяется контрольная сумма и корректность заголовка;
- требует больших временных буферов;
- при защитном преобразовании данных требуется их рассекречивание.
-
Гибридная проверка:
- выполняются обе проверки: по контрольным суммам и через декодирование;
- позволяет выявить случаи, когда повреждена сама контрольная сумма блока, а не данные.
Настройка параметров защиты WAL
-
Просмотрите все параметры, связанные с защитой WAL в процессе отправки:
postgres=# SELECT name, setting, unit, context FROM pg_settingsWHERE name LIKE 'wal_sender%' AND name NOT LIKE '%timeout';name | setting | context-------------------------------+---------+----------wal_sender_backup_directory | | postmasterwal_sender_backup_strict | off | postmasterwal_sender_check_crc | off | postmasterwal_sender_check_type | record | postmasterwal_sender_panic_on_crc_error | off | postmaster -
Изучите назначение каждого параметра:
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— поведение при недоступности каталога.
-
Обратите внимание на контекст параметров —
postmasterозначает, что для применения изменений требуется перезагрузка экземпляра.
Практическая настройка защиты WAL
-
Создайте каталог для резервных копий сегментов WAL:
[student@srv1 ~]$ sudo -u postgres mkdir -p /pgdata/06/wal_backup -
Внесите изменения в конфигурацию (от суперпользователя):
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'; -
Перезагрузите экземпляр для применения изменений:
[student@srv1 ~]$ sudo systemctl restart postgresql -
Проверьте применение настроек:
postgres=# SELECT name, setting FROM pg_settingsWHERE name IN ('wal_sender_backup_directory', 'wal_sender_check_crc', 'wal_sender_check_type');name | setting----------------------------+-----------------------wal_sender_backup_directory | /pgdata/06/wal_backupwal_sender_check_crc | onwal_sender_check_type | record, block -
Убедитесь, что процесс
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, если ее включить в этой системе?