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

Задание 2: Включение контроля целостности передачи WAL на реплику

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

Подготовительные действия​

  1. Определите топологию кластера. Подключитесь к серверу и выполните:

    [student@srv1 ~]$ sudo -iu 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 ~]$ list
    + Cluster: Pobeda (7686856511775440350) ------------+-----------+----+-----------+
    | Member | Host | Role | State | TL | Lag in MB |
    +---------------+--------------------+--------------+-----------+----+-----------+
    |<IP-Address2> |<IP-Address2>:5433 | Sync Standby | streaming | 6 | 0 |
    |<IP-Address1> |<IP-Address1>:5433 | Leader | running | 6 | |
    +---------------+--------------------+--------------+-----------+----+-----------+
    [postgres@srv1 ~]$ exit
  2. Проверьте статус службы pangolin-manager на мастере:

    [student@srv1 ~]$ sudo systemctl status pangolin-manager.service
    Вывод команды:

    ● pangolin-manager.service - Runners to orchestrate a high-availability PostgreSQL
    Loaded: loaded (/usr/lib/systemd/system/pangolin-manager.service; enabled; preset: disabled)
    Drop-In: /usr/lib/systemd/system/service.d
    └─10-timeout-abort.conf
    Active: active (running) since Mon 2026-04-27 09:00:21 MSK; 6 days ago
    Main PID: 58168 (pangolin-manage)
    Tasks: 21 (limit: 4666)
    Memory: 293.8M
    CPU: 12min 3.515s
    CGroup: /system.slice/pangolin-manager.service
    ├─58168 /opt/pangolin-manager/bin/pangolin-manager-bin/pangolin-manager.bin /etc/pangolin-manager/postgres.yml
    ├─68034 /usr/pangolin-6.7/bin/postgres -D /pgdata/06/data/ --config-file=/pgdata/06/data/postgresql.conf --listen_addresses=0.0.0.0 >
    ├─68037 "postgres: Pobeda: logger "
    ├─68038 "postgres: Pobeda: checkpointer "
    ├─68039 "postgres: Pobeda: background writer "
    ├─68041 "postgres: Pobeda: idle sessions terminator "
    ├─68042 "postgres: Pobeda: walwriter "
    ├─68043 "postgres: Pobeda: autovacuum launcher "
    ├─68044 "postgres: Pobeda: integrity check launcher "
    ├─68045 "postgres: Pobeda: license checker "
    ├─68046 "postgres: Pobeda: authproc "
    ├─68047 "postgres: Pobeda: password policy cache "
    ├─68048 "postgres: Pobeda: pg_cron launcher "
    ├─68049 "postgres: Pobeda: logical replication launcher "
    ├─68054 "postgres: Pobeda: patroni postgres 127.0.0.1(44366) idle"
    └─68056 "postgres: Pobeda: walsender patroni <IP-Address2>(42370) streaming 0/8000000"
  3. Проверьте статус службы pangolin-manager на реплике:

    [student@srv1 ~]$ ssh srv2 sudo systemctl status pangolin-manager.service
    Вывод команды:

    ● pangolin-manager.service - Runners to orchestrate a high-availability PostgreSQL
    Loaded: loaded (/usr/lib/systemd/system/pangolin-manager.service; enabled; preset: disabled)
    Drop-In: /usr/lib/systemd/system/service.d
    └─10-timeout-abort.conf
    Active: active (running) since Mon 2026-04-27 09:00:53 MSK; 6 days ago
    Main PID: 20019 (pangolin-manage)
    Tasks: 19 (limit: 4666)
    Memory: 289.5M
    CPU: 11min 27.934s
    CGroup: /system.slice/pangolin-manager.service
    ├─20019 /opt/pangolin-manager/bin/pangolin-manager-bin/pangolin-manager.bin /etc/pangolin-manager/postgres.yml
    ├─26413 /usr/pangolin-6.7/bin/postgres -D /pgdata/06/data/ --config-file=/pgdata/06/data/postgresql.conf --listen_addresses=0.0.0.0 --port=5433 --cluster_name=Pobeda --wal_level=replica --hot_standby=on --max_connections=110 --max_wal_senders=10 --max_prepared_transactions=3 --max_locks_per_transaction=64 --track_commit_timestamp=False --max_replication_slots=10 --max_worker_processes=32 --wal_log_hints=True --authentication_max_workers=16 --enable_page_compression=off
    ├─26416 "postgres: Pobeda: logger "
    ├─26417 "postgres: Pobeda: checkpointer "
    ├─26418 "postgres: Pobeda: background writer "
    ├─26419 "postgres: Pobeda: startup recovering 000000020000000000000007"
    ├─26420 "postgres: Pobeda: idle sessions terminator "
    ├─26421 "postgres: Pobeda: authproc "
    ├─26422 "postgres: Pobeda: password policy cache "
    ├─26423 "postgres: Pobeda: walreceiver streaming 0/8000000"
    ├─26426 "postgres: Pobeda: integrity check launcher "
    ├─26427 "postgres: Pobeda: license checker "
    └─26430 "postgres: Pobeda: patroni postgres 127.0.0.1(38672) idle"
  4. Создайте каталог для хранения резервных копий WAL и файлов с контрольными суммами на мастере и реплике:

    [student@srv1 ~]$ for comp in srv{1,2}; do ssh ${comp} sudo -u postgres mkdir /pgdata/06/wal_backup; done
  5. Проверьте, создались ли каталоги:

    [student@srv1 ~]$ for comp in srv{1,2}; do ssh ${comp} sudo -u postgres ls -ld /pgdata/06/wal_backup; done

    Ожидаемый результат: для каждого узла отображается информация о каталоге с владельцем postgres.

  6. Сохраните резервные копии конфигурационных файлов перед редактированием:

    [student@srv1 ~]$ sudo -u postgres cp -v /etc/pangolin-manager/postgres.yml{,.bak}
    [student@srv1 ~]$ ssh srv2 sudo -u postgres cp -v /etc/pangolin-manager/postgres.yml{,.bak}
  7. Определите место для вставки параметра wal_sender_backup_directory. Найдите строку с ssl: on и ее номер:

    [student@srv1 ~]$ sudo -u postgres grep -n 'ssl: on' /etc/pangolin-manager/postgres.yml
  8. Отредактируйте конфигурационный файл на мастере, добавив параметр wal_sender_backup_directory перед строкой ssl: on:

    wal_sender_backup_directory: /pgdata/06/wal_backup

    Для редактирования можно использовать любой текстовый редактор (vim, nano и так далее).

  9. Проверьте результат на мастере:

    [student@srv1 ~]$ sudo -u postgres grep -B1 'ssl: on' /etc/pangolin-manager/postgres.yml
    wal_sender_backup_directory: /pgdata/06/wal_backup
    ssl: on
  10. Выполните аналогичные действия на реплике:

    [student@srv1 ~]$ ssh srv2
    [student@srv2 ~]$ sudo -u postgres grep -B1 -n 'ssl: on' /etc/pangolin-manager/postgres.yml

    Убедитесь, что параметр добавлен корректно.

  11. Остановите pangolin-manager на реплике:

    [student@srv2 ~]$ sudo systemctl stop pangolin-manager
    [student@srv2 ~]$ sudo systemctl status pangolin-manager

    Ожидаемый результат: статус inactive (dead).

  12. Выйдите из сессии на реплике и перезапустите pangolin-manager на мастере:

    [student@srv2 ~]$ exit
    [student@srv1 ~]$ sudo systemctl restart pangolin-manager
    [student@srv1 ~]$ sudo systemctl status pangolin-manager
  13. Запустите pangolin-manager на реплике:

    [student@srv1 ~]$ ssh srv2 sudo systemctl start pangolin-manager
    [student@srv1 ~]$ ssh srv2 sudo systemctl status pangolin-manager
  14. Проверьте установку параметра wal_sender_backup_directory в СУБД:

    [student@srv1 ~]$ sudo -iu postgres psql -c 'SHOW wal_sender_backup_directory;'
    wal_sender_backup_directory
    -----------------------------
    /pgdata/06/wal_backup
  15. Убедитесь, что каталог пока пуст:

    [student@srv1 ~]$ sudo ls -l /pgdata/06/wal_backup

    Ожидаемый результат: итого 0 (пустой каталог).

Включение режима проверки контрольных сумм​

  1. Отредактируйте конфигурационный файл на мастере, добавив параметры для включения режима проверки контрольных сумм:

    wal_sender_check_crc: on
    wal_sender_check_type: block

    Разместите эти параметры перед строкой ssl: on.

  2. Проверьте результат на мастере:

    [student@srv1 ~]$ sudo -u postgres grep -B3 -n 'ssl: on' /etc/pangolin-manager/postgres.yml
    226- wal_sender_backup_directory: /pgdata/06/wal_backup
    227- wal_sender_check_crc: on
    228- wal_sender_check_type: block
    229: ssl: on
  3. Выполните аналогичные изменения на реплике:

    [student@srv1 ~]$ ssh srv2
    [student@srv2 ~]$ sudo -u postgres grep -B3 -n 'ssl: on' /etc/pangolin-manager/postgres.yml
  4. Остановите pangolin-manager на реплике:

    [student@srv2 ~]$ sudo systemctl stop pangolin-manager
    [student@srv2 ~]$ exit
  5. Перезапустите pangolin-manager на мастере:

    [student@srv1 ~]$ sudo systemctl restart pangolin-manager
    [student@srv1 ~]$ sudo systemctl status pangolin-manager
    Внимание!

    В списке процессов появился новый процесс wal backup writer.

  6. Запустите pangolin-manager на реплике:

    [student@srv1 ~]$ ssh srv2 sudo systemctl start pangolin-manager
    [student@srv1 ~]$ ssh srv2 sudo systemctl status pangolin-manager
  7. Проверьте настройки параметров в СУБД:

    [student@srv1 ~]$ sudo -iu postgres psql -c '\dconfig wal_sender_*'
    Список параметров конфигурации
    Параметр | Значение
    ----------------------------+-----------------------
    wal_sender_backup_directory | /pgdata/06/wal_backup
    wal_sender_backup_strict | off
    wal_sender_check_crc | on
    wal_sender_check_type | block
    wal_sender_panic_on_crc_error | off
    wal_sender_timeout | 1min
  8. Проверьте содержимое каталога резервных копий WAL:

    [student@srv1 ~]$ sudo ls -l /pgdata/06/wal_backup

    Ожидаемый результат: появятся файлы с суффиксами _backup и _crc. Файл _crc имеет размер 16384 байта.

Включение режима декодирования​

  1. Отредактируйте конфигурационный файл на мастере, изменив параметр wal_sender_check_type:

    wal_sender_check_type: record
  2. Проверьте результат на мастере:

    [student@srv1 ~]$ sudo -u postgres grep -B3 -n 'ssl: on' /etc/pangolin-manager/postgres.yml
    226- wal_sender_backup_directory: /pgdata/06/wal_backup
    227- wal_sender_check_crc: on
    228- wal_sender_check_type: record
    229: ssl: on
  3. Выполните аналогичные изменения на реплике:

    [student@srv1 ~]$ ssh srv2 sudo -u postgres grep -B3 -e 'ssl:[[:space:]]on' -n /etc/pangolin-manager/postgres.yml
  4. Остановите pangolin-manager на реплике:

    [student@srv1 ~]$ ssh srv2 sudo systemctl stop pangolin-manager
  5. Перезапустите pangolin-manager на мастере:

    [student@srv1 ~]$ sudo systemctl restart pangolin-manager
  6. Запустите pangolin-manager на реплике:

    [student@srv1 ~]$ ssh srv2 sudo systemctl start pangolin-manager
  7. Проверьте настройки параметров в СУБД:

    [student@srv1 ~]$ sudo -iu postgres psql -c '\dconfig wal_sender_*'
    wal_sender_check_type | record
  8. Сравните содержимое каталога резервных копий WAL:

    [student@srv1 ~]$ sudo ls -l /pgdata/06/wal_backup
    Внимание!

    Размер файла _crc в режиме декодирования составляет всего 8 байт, в отличие от 16384 байт в режиме проверки контрольных сумм.

Включение гибридного режима​

  1. Отредактируйте конфигурационный файл на мастере, изменив параметр wal_sender_check_type:

    wal_sender_check_type: 'record, block'
    Примечание

    Значение указывается в кавычках, так как содержит запятую.

  2. Проверьте результат на мастере:

    [student@srv1 ~]$ sudo -u postgres grep -B3 -e 'ssl:[[:space:]]on' -n /etc/pangolin-manager/postgres.yml
    226- wal_sender_backup_directory: /pgdata/06/wal_backup
    227- wal_sender_check_crc: on
    228- wal_sender_check_type: 'record, block'
    229: ssl: on
  3. Выполните аналогичные изменения на реплике:

    [student@srv1 ~]$ ssh srv2 sudo -u postgres grep -B3 -e 'ssl:[[:space:]]on' -n /etc/pangolin-manager/postgres.yml
  4. Остановите pangolin-manager на реплике:

    [student@srv1 ~]$ ssh srv2 sudo systemctl stop pangolin-manager
  5. Перезапустите pangolin-manager на мастере:

    [student@srv1 ~]$ sudo systemctl restart pangolin-manager
  6. Запустите pangolin-manager на реплике:

    [student@srv1 ~]$ ssh srv2 sudo systemctl start pangolin-manager
  7. Проверьте настройки параметров в СУБД:

    [student@srv1 ~]$ sudo -iu postgres psql -c '\dconfig wal_sender_*'
    wal_sender_check_type | record, block
  8. Изучите содержимое каталога резервных копий WAL:

    [student@srv1 ~]$ sudo ls -l /pgdata/06/wal_backup
    Внимание!

    В гибридном режиме файлы _crc имеют размер 16384 байта, как и в режиме проверки контрольных сумм, поскольку обе проверки выполняются одновременно.

Анализ результатов​

Таблица сравнения режимов:

Режимwal_sender_check_typeРазмер _crc файлаНаличие _backup файла
Проверка контрольных суммblock16384 байт+
Декодированиеrecord8 байт+
Гибридныйrecord, block16384 байт+

Назначение каждого режима:

  • Режим проверки контрольных сумм (block) — сохраняет контрольные суммы для каждого блока WAL, позволяет обнаружить повреждения на уровне блоков.
  • Режим декодирования (record) — выполняет декодирование записей WAL, проверяет корректность заголовков и структур записей, требует меньше места для хранения контрольной информации.
  • Гибридный режим (record, block) — обеспечивает максимальную защиту, выполняя оба типа проверок, но требует больше ресурсов.

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

Вопрос 1

Вопрос 1: Параметр wal_sender_backup_strict установлен в значение on. Что произойдет, если каталог, заданный параметром wal_sender_backup_directory, будет недоступен для записи?

Вопрос 2

Вопрос 2: Выберите верные утверждения относительно режима wal_sender_check_type = 'record':