Резервное копирование с использованием подмодуля pg_probackup

1. Подготовка к использованию pg_probackup

Для корректной работы подмодуля необходимо наличие:

  • утилиты pg_probackup версии 2.6 или выше;

  • ptrack версии 2.6.0 или выше.

Для выполнения резервного копирования с помощью модуля PostgreSQL с подмодулем pg_probackup выполните следующие действия:

  1. Запустите RBM командой:

    rbm

    После этого в открывшемся окне (Рисунок 1) введите наименование сервера RuBackup, имя пользователя и пароль.

    29
    Рисунок 1. Окно входа RBM
  2. Добавьте пул типа «Client defined» с помощью RBM либо командной строки (см. подробнее в документе «Руководство системного администратора RuBackup»);

  3. Настройте Клиентское хранилище с помощью RBM либо командной строки (см. подробнее в документе «Руководство системного администратора RuBackup»);

    В случае работы с подмодулем pg_probackup при выборе типа хранилища Cloud вам будет предложено ввести данные для работы с облачным хранилищем: хост облака, порт облака, бакет, безопасность облака, ID ключа доступа, секретный ключ доступа. Данная информация будет передаваться модулю клиента при выполнении различных операций и перезаписывать конфигурационный файл /etc/pg_probackup/s3.config. Таким образом, указав данные в RBM, вы сможете обновить данные для всех клиентов, которые будут использовать данный пул.

  4. Настройте на клиентском хосте базу данных PostgreSQL;

  5. Установите на клиентском хосте модуль для PostgreSQL Universal (rb_module_postgresql);

  6. Разверните клиент резервного копирования, сконфигурируйте и подключите его к серверу СРК на хосте, где установлен Модуль для PostgreSQL Universal;

  7. Создайте в S3-хранилище MinIO папку, в которую будут помещаться резервные копии;

  8. Настройте PTRACK на Клиенте для создания и восстановления инкрементальных копий табличных пространств CFS;

  9. Настройте утилиту pg_probackup на Клиенте для работы с S3-хранилищем;

Для работы с S3-хранилищем MinIO в утилите pg_probackup нужно использовать ключ --s3=minio
  1. Для использования режима постраничного копирования (PAGE) настройте непрерывное архивирование WAL с сервера БД в СРК RuBackup.

2. Инициализация каталога резервных копий

Для начала работы подмодуля pg_probackup выполните последовательно следующие команды от имени пользователя указанного в параметре postgresql_admin в конфигурационном файле модуля (rb_module_postgresql.conf), по умолчанию это пользователь postgres. (подробнее см. в официальной документации):

pg_probackup init -B каталог_копий [--skip-if-exists] [параметры_s3] [--help]

pg_probackup add-instance -B каталог_копий -D каталог_данных --instance имя_экземпляра [--skip-if-exists] [параметры_s3] [--help]

Имя_экземпляра должно совпадать с именем каталог_данных. Например, если добавляется каталог данных /var/lib/pgpro/std-13/data/, значит, именем экземпляра будет data.

Директория /opt/rubackup/mnt/pg_probackup и все вложенные в неё папки должны быть доступны для записи и чтения пользователю указанному в параметре postgresql_admin в конфигурационном файле модуля (rb_module_postgresql.conf), по умолчанию этот пользователь postgres, а также пользователю, под контролем которого работает клиент RuBackup.

Обеспечить доступ можно следующим образом:

sudo chgrp postgres -R /opt/rubackup/mnt/pg_probackup
sudo chmod g+rwx -R /opt/rubackup/mnt/pg_probackup

Ниже описаны параметры, которые необходимо задать для размещения копий в частном облачном хранилище. Эти параметры могут задаваться с любыми командами, которые pg_probackup выполняет через интерфейс S3:

  • --s3=s3_interface_provider — задаёт провайдера, поддерживающего интерфейс S3. Возможные значения:

    • minio — объектное хранилище MinIO, совместимое с облачным хранилищем S3. С этим провайдером по умолчанию используется протокол HTTP и порт 9000.

  • --s3-config-file=путь_к_файлу_конфигурации. Если этот параметр опускается, pg_probackup ищет файл конфигурации S3 сначала в /etc/pg_probackup/s3.config, а затем в ~postgres/.pg_probackup/s3.config.

Подробнее о заполнении конфигурационного файла для работы с S3 см. официальную документацию (раздел «Параметры S3).

Примеры использования команд с S3:

  • Пример использования add-instance:

pg_probackup add-instance -B /opt/rubackup/mnt/pg_probackup --instance=data --pgdata=/var/lib/pgpro/ent-16/data --s3=minio

Если планируется использование модуля для резервного копирования кластеров Postgres Pro в составе patroni, то необходимо выполнить следующую команду:

sudo pg_probackup set-config -B /opt/rubackup/mnt/pg_probackup/ --instance=patroni --pghost ip_кластера

где ip_кластера – это ip-адрес копируемого экземпляра patroni.

3. Настройка копируемого кластера баз данных для использования pg_probackup

Для выполнения резервного копирования в защищённом режиме необходимо создать роль с ограниченными правами и базу данных резервного копирования. Имя роли, базы данных и пароль условны и могут быть изменены по усмотрению пользователя. Последовательность действий следующая:

  1. Сначала создайте базу данных резервного копирования. Данная операция производится от имени пользователя postgres:

    su postgres
    createdb backupdb
  2. Далее описан процесс создания роли для выполнения резервного копирования. В целях обеспечения безопасности копируемых данных, создаваемая роль будет обладать минимальными правами, необходимыми для выполнения резервного копирования экземпляра Postgres Pro. В этом примере такой ролью будет rubackup_backuper.

    1. Выполните подключение к базе данных backupdb от имени пользователя postgres:

      sudo -u postgres psql -d backupdb
    2. Далее, в psql создайте роль rubackup_backuper (имя пользователя может быть изменено) и задайте пароль (в качестве пароля укажите желаемый пароль вместо 12345). Затем при помощи приведённого ниже скрипта определите следующие разрешения на сервере Postgres Pro (только в базе данных, к которой производится подключение).

      Для Postgres Pro версии 14 и ниже
      BEGIN;
      CREATE ROLE rubackup_backuper WITH LOGIN;
      ALTER USER rubackup_backuper WITH PASSWORD ‘12345’;
      GRANT USAGE ON SCHEMA pg_catalog TO rubackup_backuper;
      GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO rubackup_backuper;
      GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO rubackup_backuper;
      GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO rubackup_backuper;
      GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean, boolean) TO rubackup_backuper;
      GRANT EXECUTE ON FUNCTION pg_catalog.pg_stop_backup(boolean, boolean) TO rubackup_backuper;
      GRANT EXECUTE ON FUNCTION pg_catalog.pg_create_restore_point(text) TO rubackup_backuper;
      GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO rubackup_backuper;
      GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO rubackup_backuper;
      GRANT EXECUTE ON FUNCTION pg_catalog.txid_current() TO rubackup_backuper;
      GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO rubackup_backuper;
      GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO rubackup_backuper;
      GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_checkpoint() TO rubackup_backuper;
      ALTER ROLE rubackup_backuper WITH REPLICATION;
      COMMIT;
      Для Postgres Pro 15
      BEGIN;
      CREATE ROLE rubackup_backuper WITH LOGIN;
      ALTER USER rubackup_backuper WITH PASSWORD ‘12345’;
      GRANT USAGE ON SCHEMA pg_catalog TO rubackup_backuper;
      GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO rubackup_backuper;
      GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO rubackup_backuper;
      GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO rubackup_backuper;
      GRANT EXECUTE ON FUNCTION pg_catalog.pg_backup_start(text, boolean) TO rubackup_backuper;
      GRANT EXECUTE ON FUNCTION pg_catalog.pg_backup_stop(boolean) TO rubackup_backuper;
      GRANT EXECUTE ON FUNCTION pg_catalog.pg_create_restore_point(text) TO rubackup_backuper;
      GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO rubackup_backuper;
      GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO rubackup_backuper;
      GRANT EXECUTE ON FUNCTION pg_catalog.txid_current() TO rubackup_backuper;
      GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO rubackup_backuper;
      GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO rubackup_backuper;
      GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_checkpoint() TO rubackup_backuper;
      ALTER ROLE rubackup_backuper WITH REPLICATION;
      COMMIT;

      Для Postgres Pro 16 команды могут отличаться – см. официальную документацию.

  3. Создайте файл .pgpass в домашнем каталоге пользователя указанного в параметре postgresql_admin в конфигурационном файле модуля (rb_module_postgresql.conf), по умолчанию это пользователь postgres. В файле .pgpass необходимо указать данные для подключения к ранее созданной базе данных и для репликации.

    Это распространённый способ хранения информации о соединении в PostgreSQL вместо ввода пароля при каждой совершённой операции с pg_probackup. Этот файл должен содержать строки в таком формате:

    сервер:порт:база_данных:имя_пользователя:пароль
    016
    Рисунок 2. Пример файла .pgpass

    Файл .pgpass обязательно должен находиться в домашнем каталоге пользователя указанного в параметре postgresql_admin в конфигурационном файле модуля (rb_module_postgresql.conf), по умолчанию это пользователь postgres (домашний каталог — /var/lib/postgresql). Не меняйте местами информацию в строке, она должна быть указана как в примере. Также, маска разрешений файла должна соответствовать маске 0600. Если одно из этих условий будет нарушено, то выполнение резервной копии будет прервано ошибкой.

  4. Далее необходимо произвести изменения в файле pg_hba.conf. Найти конфигурационный файл, относящийся к настраиваемому кластеру, можно так:

    sudo -u postgres psql
    psql –c 'show hba_file'

    Вызовите psql при помощи команды:

    sudo -u postgres psql

    Если для пользователя postgres не установлен пароль, установите его, изменив 12345` на подходящий:

    alter user postgres with password `12345`;

    В конец файла pg_hba.conf добавьте следующие строки:

    host backupdb rubackup_backuper 127.0.0.1/32 md5
    host replication rubackup_backuper 127.0.0.1/32 md5

    При использовании HAProxy, необходимо в файл pg_hba.conf добавить следующие строки:

    host backupdb rubackup_backuper <IP-адрес хоста HAProxy> md5
    host replication rubackup_backuper <IP-адрес хоста HAProxy> md5

    Вместо peer везде установите md5. Пример итогового файла:

    017
    Рисунок 3. Пример файла pg_hba.conf

    Проверяем, не было ли опечаток, и перечитываем конфигурацию:

    psql -c 'select * from pg_hba_file_rules'
    
    psql -c 'select pg_reload_conf()'
    18
    Рисунок 4. Проверка конфигурации

После реализации данных настроек модуль сможет выполнять полное резервное копирование и дифференциальное резервное копирование в режиме DELTA используя режим доставки WAL по умолчанию (ARCHIVE).

4. Настройка потокового резервного копирования

Для настройки потокового резервного копирования (STREAM) требуется произвести изменения в файле postgresql.conf, который находится внутри копируемого кластера. Например, директорией кластера СУБД Postgres Pro 13 является /var/lib/pgpro/std-13/data/. Обратите внимание на то, что расположение файла может отличаться в зависимости от дистрибутива Linux, версии Postgres Pro и кластера баз данных.

Выполните следующие действия:

  1. установите для параметра max_wal_senders достаточно большое значение, предусматривающее минимум одно подключение для процесса резервного копирования;

  2. задайте для параметра wal_level значение выше minimal.

Если вы не планируете производить дальнейшую настройку, то после внесённых изменений в файл postgresql.conf необходимо перезагрузить сервер Postgres Pro при помощи команды:

sudo systemctl restart postgrespro-std-13.service

После реализации данных настроек модуль сможет выполнять полное резервное копирование и дифференциальное резервное копирование в режимах DELTA, используя потоковую доставку WAL (STREAM).

5. Настройка непрерывного архивирования WAL

Для выполнения копирования в режиме PAGE и восстановления резервных копий на момент времени (recovery-target) должно осуществляться непрерывное архивирование WAL.

Чтобы настроить непрерывное архивирование, выполните следующие действия:

  1. если вы настраиваете резервное копирование на ведущем сервере, задайте для параметра wal_level значение выше minimal. параметр archive_mode должен иметь значение on или always. Для выполнения резервного копирования на ведомом требуется значение always.

  2. установите параметр archive_command:

    archive_command = '/путь_инсталляции/pg_probackup archive-push -B /opt/rubackup/mnt/pg_probackup* --instance имя_экземпляра --wal-file-path %p --wal-file-name %f [параметры_удалённого_режима]'

    где:

    • путь_инсталляции — это путь к каталогу установленной версии pg_probackup, которую вы хотите использовать.

    • имя_экземпляра должно указывать на уже проинициализированный для данного кластера БД копируемый экземпляр.

    • параметры_удалённого_режима должны задаваться только в случае расположения архива WAL в удалённой системе.

    Пример:

    archive_command = '/opt/pgpro/ent-16/bin/pg_probackup archive-push -B /opt/rubackup/mnt/pg_probackup --instance data --wal-file-path=%p --wal-file-name=%f --s3=minio'
  3. установите параметр restore_command:

    restore_command = 'путь_инсталляции/pg_probackup archive-get -B каталог_копий --instance имя_экземпляра --wal-file-path=%p --wal-file-name=%f [параметры_удаленного_режима]

    где каталог_копий – это каталог, предназначенный для резервных копий.

    Пример:

    restore_command = '/opt/pgpro/ent-16/bin/pg_probackup archive-get -B /opt/rubackup/mnt/pg_probackup --instance data --wal-file-path=%p --wal-file-name=%f --s3=minio'

Если вы планируете выполнять страничное копирование и/или делать копии с ведомого сервера, используя режим доставки WAL ARCHIVE, при недостаточной транзакционной активности может потребоваться долго ждать заполнения очередного сегмента WAL. Чтобы ограничить время ожидания, вы можете воспользоваться параметром archive_timeout на ведущем сервере. Значение этого параметра должно быть меньше значения --archive-timeout (по умолчанию 5 минут), чтобы заполненный сегмент успел передаться ведомому серверу и попасть в архив WAL, прежде чем копирование прервётся по тайм-ауту, заданному параметром --archive-timeout.

Если вы не планируете производить дальнейшую настройку, то после внесённых изменений в файл postgresql.conf необходимо перезагрузить сервер Postgres Pro при помощи команды:

sudo systemctl restart postgrespro-std-13.service

После реализации данных настроек модуль сможет выполнять дифференциальное резервное копирование в режиме PAGE, используя режимы доставки ARCHIVE и STREAM.

6. Настройка копирования в режиме PTRACK

Перед выполнением дифференциальной резервной копии в режиме PTRACK выполните подготовительные действия, как указано в разделе Настройка копирования в режиме PTRACK.

7. Завершение настройки кластера

После выполнения подготовки целевого кластера к выполнению резервного копирования необходимо перезапустить клиента RuBackup:

rubackup_client stop
rubackup_client start

В результате клиент должен сообщить о том, что модуль резервного копирования Postgres Pro готов к работе:

Try to check module: PostgreSQL...
Execute OS command: /opt/rubackup/modules/rb_module_postgres -t 2>&1
... module PostgreSQL was checked successfully

8. Принцип работы подмодуля pg_probackup

Подробную информацию о принципе работы подмодуля pg_probackup Вы можете посмотреть на официальном сайте Postgres Pro.

9. Пример использования подмодуля pg_probackup в Менеджере администратора RuBackup (RBM)

Чтобы выполнять регулярное резервное копирование кластера СУБД Postgres Pro, необходимо создать правило в глобальном расписании. Для этого выполните следующие действия:

  1. Создайте правило Глобального расписания, для чего зайдите в раздел «Глобальное расписание» (Рисунок 5) и нажмите на кнопку «Добавить»;

    30
    Рисунок 5. Создание правила глобального расписания
  2. В открывшемся окне (Рисунок 6) выберите Клиент, на котором установлен Модуль для PostgreSQL Universal;

    31
    Рисунок 6. Выбор клиента, на котором установлен модуль для PostgreSQL Universal
  3. Выберите тип ресурса — «PostgreSQL universal»;

  4. Откройте параметры Модуля нажатием кнопки «…​» рядом с выбранным типом ресурса;

  5. В появившемся окне (Рисунок 7) выберите подмодуль (engine) pg_probackup;

    32
    Рисунок 7. Выбор подмодуля
  6. Настройте число параллельных потоков (pg_pro_threads), в которые будет выполняться резервное копирование или восстановление. По умолчанию количество потоков равно 1;

  7. Выберите режим резервного копирования («pg_pro_backup_mode») — (DELTA, PAGE, PTRACK). По умолчанию — DELTA;

    Перед выполнением резервного копирования в режиме PAGE произведите настройку непрерывного архивирования WAL (см. Резервное копирование с использованием подмодуля pg_probackup). А перед выполнением резервного копирования в режиме PTRACK произведите настройку согласно Настройка копирования в режиме PTRACK.

  8. Выберите, какой режим доставки WAL использовать (параметр pg_pro_stream, (Рисунок 8)): STREAM (во включенном положении, по умолчанию) или ARCHIVE (в выключенном положении);

    33
    Рисунок 8. Выбор режима доставки WAL

10. Настройка копирования в режиме PTRACK

Для корректной работы модуля PostgreSQL необходим ptrack версии 2.6.0 или выше.

Перед выполнением инкрементальной резервной копии в режиме PTRACK выполните следующие подготовительные действия:

  1. Отредактируйте конфигурационный файл postgresql.conf:

  2. задайте для параметра shared_preload_libraries значение ptrack:

  3. добавьте в конец конфигурационного файла параметр ptrack.map_size и установите его значение по следующим правилам:

    Для оптимальной производительности рекомендуется задавать ptrack.map_size равным N / 1024, где N — объём кластера Postgres Pro в мегабайтах. Увеличивать значение ptrack.map_size сверх рекомендуемого не имеет большого практического смысла. Максимально допустимое значение — 1024.

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

  4. Выполните команду для перезапуска сервиса.

    sudo systemctl restart postgres[имя_сервиса].service

После реализации данных настроек модуль сможет выполнять инкрементальное резервное копирование в режиме PTRACK, используя режимы доставки ARCHIVE и STREAM.

  1. Зайдите от имени администратора БД в backupdb:

    sudo -u postgres psql -d backupdb

    и выполните следующий запрос:

    CREATE EXTENSION ptrack;
  2. Завершите настройку параметров Модуля нажатием кнопки «ОК»;

  3. Выберите ресурс;

  4. Выберите тип резервной копии — полная;

  5. Выберите пул типа «Client Defined»;

    Если будет выбран пул другого типа, задача завершится с ошибкой.

  6. Выберите остальные параметры в окне правила глобального расписания и нажмите на кнопку «Применить».

Не забудьте установить флаг «С развертыванием» во время восстановления резервной копии