Бэкап pg_basebackup vs mysql innodb: оптимизация производительности

Компьютеры, ноутбуки и программы в Москве.
Ответить
admin
Администратор
Сообщения: 20
Зарегистрирован: 22 дек 2009, 12:06

Бэкап pg_basebackup vs mysql innodb: оптимизация производительности

Сообщение admin »

Изображение

Архитектурный подход к физическому резервному копированию

В экосистеме PostgreSQL существует два основных типа резервного копирования: логическое (с помощью утилиты pg_dump) и физическое. Утилита pg_basebackup является стандартным инструментом для создания физических копий. В отличие от логического бэкапа, который выгружает структуру и данные в виде SQL-команд или кастомных архивов, физическое копирование создает точный побитовый слепок файловой системы базы данных.

Этот метод обладает рядом преимуществ для высоконагруженных систем:
  • Скорость восстановления: развертывание физической копии происходит значительно быстрее, так как серверу не нужно заново выполнять SQL-запросы для вставки данных и построения индексов.
  • Консистентность: pg_basebackup гарантирует целостность данных на определенный момент времени без блокировки таблиц.
  • Основа для репликации: именно этот инструмент используется для инициализации ведомых узлов (Standby) в кластерах с потоковой репликацией.
Однако стоит учитывать, что физический бэкап не позволяет восстановить отдельную таблицу или базу данных — восстанавливается весь кластер целиком.

Конфигурация сервера для поддержки резервного копирования

Перед использованием pg_basebackup необходимо подготовить основной сервер (Primary). Основные настройки выполняются в файле postgresql.conf. Для работы утилиты требуется включение потоковой передачи журналов транзакций (WAL).

Код: Выделить всё

wal_level = replica
max_wal_senders = 10
max_replication_slots = 10
Параметр wal_level со значением replica (или logical) обязателен, так как он определяет объем информации, записываемой в журналы. max_wal_senders определяет количество одновременных подключений для бэкапа и репликации.

Далее необходимо настроить права доступа в файле pg_hba.conf. Утилита подключается к серверу по протоколу репликации, поэтому требуется соответствующая запись:

Код: Выделить всё

# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    replication     replicator      192.168.1.100/32        scram-sha-256
Рекомендуется создать выделенного пользователя в базе данных с правами репликации:

Код: Выделить всё

CREATE USER replicator WITH REPLICATION ENCRYPTED PASSWORD 'your_secure_password';
Механика работы и ключевые параметры pg_basebackup

Утилита pg_basebackup инициирует процесс резервного копирования, подключаясь к СУБД как клиент. Процесс включает перевод БД в режим бэкапа, копирование файлов данных и получение необходимых WAL-файлов.

Типовой синтаксис команды для создания архива выглядит следующим образом:

Код: Выделить всё

pg_basebackup -h 192.168.1.10 -D /var/lib/postgresql/backups/base_1 -U replicator -P -v -Ft -z -X stream
Разберем используемые флаги:
  • -D: путь к целевой директории, где будет сохранена копия.
  • -Ft: формат вывода tar. Если используется -Fp (plain), создается структура директорий, идентичная оригиналу.
  • -z: включение gzip-сжатия (актуально для формата tar).
  • -X stream: один из важнейших параметров. Он заставляет утилиту открывать второе соединение для параллельного получения WAL-файлов во время копирования данных. Это гарантирует, что бэкап будет самодостаточным и консистентным.
  • -P и -v: включают индикатор прогресса и подробный вывод логов.
  • -R: автоматически создает файл standby.signal и настраивает параметры подключения в postgresql.auto.conf, что полезно для быстрой настройки реплики.
Использование слотов репликации

При создании больших бэкапов существует риск, что сегменты WAL на основном сервере будут перезаписаны до того, как pg_basebackup успеет их скачать. Чтобы этого избежать, следует использовать слоты репликации.
Слот репликации на стороне Primary гарантирует, что сервер не удалит старые WAL-файлы до тех пор, пока они не будут успешно переданы клиенту.
Команда с использованием временного слота:

Код: Выделить всё

pg_basebackup -D /backup/dir -X stream --create-slot --slot=backup_slot --temporary
Использование флага --temporary удобно тем, что слот будет автоматически удален сервером после завершения работы утилиты или при обрыве соединения, предотвращая бесконтрольное разрастание директории pg_wal.

Интеграция с архивированием WAL (PITR)

Для обеспечения максимальной надежности в production-средах одного pg_basebackup недостаточно. Необходимо организовать непрерывное архивирование журналов транзакций. Это позволяет реализовать стратегию Point-In-Time Recovery (восстановление на любой момент времени в прошлом).

В postgresql.conf настраивается параметр archive_command, который копирует заполненные сегменты WAL в защищенное хранилище (например, S3 или выделенный NFS-сервер):

Код: Выделить всё

archive_mode = on
archive_command = 'test ! -f /mnt/nfs/archive/%f && cp %p /mnt/nfs/archive/%f'
В этой связке pg_basebackup служит «контрольной точкой» (Snapshot), а архив WAL позволяет «прокрутить» состояние базы вперед от даты создания бэкапа до нужной секунды.

Процедура восстановления из физической копии

Восстановление данных из копии, созданной pg_basebackup, требует выполнения строгого алгоритма действий.
  1. Полная остановка целевого экземпляра PostgreSQL.
  2. Очистка или перемещение содержимого текущей директории данных (PGDATA). Восстановление поверх существующих файлов невозможно.
  3. Распаковка архива или копирование файлов из бэкапа в директорию данных. Если использовался формат tar, основной архив распаковывается в корень, а таблицы (tablespaces), если они были, — в свои соответствующие пути.
  4. Установка корректных прав доступа на файлы (обычно владелец postgres и права 0700).
  5. Создание файла-маркера recovery.signal в корне PGDATA для запуска процесса восстановления (в PostgreSQL 12 и выше).
  6. Настройка параметров восстановления в postgresql.conf или postgresql.auto.conf (например, restore_command для получения WAL из архива).
Пример restore_command для извлечения данных из NFS-архива:

Код: Выделить всё

restore_command = 'cp /mnt/nfs/archive/%f %p'
После запуска сервера он перейдет в режим восстановления, применит все доступные сегменты WAL и, достигнув конца журналов, станет доступен для работы.

Рекомендации по эксплуатации

Для обеспечения отказоустойчивости технический архитектор должен учитывать следующие аспекты:
  • Проверка бэкапов: периодически выполняйте тестовое восстановление на изолированном сервере. Бэкап считается существующим только тогда, когда из него успешно восстановились данные.
  • Мониторинг: отслеживайте коды возврата pg_basebackup и объем свободного места в хранилище.
  • Безопасность: используйте SSL-шифрование для передачи данных по сети, особенно если бэкап выполняется через публичные каналы связи.
Подробную спецификацию всех ключей утилиты можно найти в официальной документации PostgreSQL.
Ответить

Вернуться в «Компьютеры и программное обеспечение»