Данная инструкция описывает, как скомпилировать pgBackRest, создать с его помощью резервную копию кластера Greenplum и восстановиться из нее.
На данный момент поддерживается Greenplum 6 и Greenplum 7.
- Установить зависимости
Приведенные ниже команды установки требуется выполнить от имени суперпользователя.
Команда для CentOS 7
yum install git gcc openssl-devel libxml2-devel bzip2-devel libzstd-devel lz4-devel libyaml-devel zlib-devel libssh2-devel
Команда для ALT Linux p10
apt-get update
apt-get install git gcc openssl-devel libxml2-devel bzip2-devel libzstd-devel liblz4-devel libyaml-devel zlib-devel libssh2-devel
Команда для Ubuntu 22.04
apt-get update
apt-get install gcc git libbz2-dev liblz4-dev libssh2-1-dev libssl-dev libxml2-dev libyaml-dev libzstd-dev pkg-config zlib1g-dev
- Установить переменные окружения
В PATH должен быть путь к pg_config Greenplum, а в LD_LIBRARY_PATH - путь к libpq.so.5.
source <GPDB_DIR>/greenplum_path.sh
- Скачать репозиторий
git clone https://github.com/arenadata/pgbackrest -b 2.52-ci
- Перейти в каталог с исходным кодом
cd pgbackrest/src/
- Запустить скрипт конфигурирования
Без параметров будут включены оптимизация (-O2) и векторизация вычисления контрольных сумм страниц.
./configure
Конфигурирование для отладки рекомендуется выполнять командой
CFLAGS="-O0 -g3" ./configure --disable-optimize --enable-test
- Собрать
Команда для сборки с использованием всех доступных ядер и без отображения исполняемых команд
make -j`nproc` -s
В результате в текущем каталоге появится исполняемый файл с именем pgbackrest.
- Установить
sudo make install
По умолчанию исполняемый файл pgbackrest будет размещен в каталог /usr/local/bin. Это единственное действие, которое выполняется на этапе установки.
- Создать каталоги для размещения бэкапа и логов. Пусть для теста это будут
/tmp/backupи/tmp/backup/log.
mkdir -p /tmp/backup/log
- Создать конфигурационный файл
В дальнейших примерах команд предполагается, что конфигурационный файл имеет стандартное имя - /etc/pgbackrest.conf. Если требуется использовать другой файл, то его имя можно передать через параметр --config. Для стандартного демонстрационного кластера, созданного с DATADIRS=/tmp/gpdb, команда создания конфигурационного файла потребует права суперпользователя и будет выглядеть так:
Команда для Greenplum 6
sudo tee /etc/pgbackrest.conf <<EOF
[seg-1]
pg1-path=/tmp/gpdb/qddir/demoDataDir-1
pg1-port=6000
[seg0]
pg1-path=/tmp/gpdb/dbfast1/demoDataDir0
pg1-port=6002
[seg1]
pg1-path=/tmp/gpdb/dbfast2/demoDataDir1
pg1-port=6003
[seg2]
pg1-path=/tmp/gpdb/dbfast3/demoDataDir2
pg1-port=6004
[global]
repo1-path=/tmp/backup
log-path=/tmp/backup/log
start-fast=y
fork=GPDB
EOF
Команда для Greenplum 7
sudo tee /etc/pgbackrest.conf <<EOF
[seg-1]
pg1-path=/tmp/gpdb/qddir/demoDataDir-1
pg1-port=7000
[seg0]
pg1-path=/tmp/gpdb/dbfast1/demoDataDir0
pg1-port=7002
[seg1]
pg1-path=/tmp/gpdb/dbfast2/demoDataDir1
pg1-port=7003
[seg2]
pg1-path=/tmp/gpdb/dbfast3/demoDataDir2
pg1-port=7004
[global]
repo1-path=/tmp/backup
log-path=/tmp/backup/log
start-fast=y
fork=GPDB
EOF
Так как данная версия pgBackRest может применяться для бэкапа как PostgreSQL, так и Greenplum, следует указать в параметре fork, бэкап какой СУБД выполняется. Описание остальных параметров можно найти в документации или в build/help/help.xml.
- Создать и инициализировать для координатора и каждого первичного сегмента каталоги, в которых будут храниться файлы для восстановления
for i in -1 0 1 2
do
PGOPTIONS="-c gp_session_role=utility" pgbackrest --stanza=seg$i stanza-create
done
Под термином "stanza" понимается "строфа" в конфигурационном файле
- Настроить Greenplum
gpconfig -c archive_mode -v on
gpconfig -c archive_command -v "'PGOPTIONS=\"-c gp_session_role=utility\" /usr/local/bin/pgbackrest --stanza=seg%c archive-push %p'" --skipvalidation
gpstop -ar
- Установить расширение gp_pitr (для Greenplum 7 пропустить этот шаг)
Выполнить приведенный ниже запрос в любом клиентском приложении, например в psql.
create extension gp_pitr;
Это расширение необходимо для работы с точками восстановления.
- Проверить, что резервное копирование и архивирование логов предзаписи правильно настроено
for i in -1 0 1 2
do
PGOPTIONS="-c gp_session_role=utility" pgbackrest --stanza=seg$i check
done
Команда не должна выдать сообщений об ошибке
4.1 Сохранить файлы с первичных сегментов и координатора
for i in -1 0 1 2
do
PGOPTIONS="-c gp_session_role=utility" pgbackrest --stanza=seg$i backup
done
Если потребуется остановить прерванный бэкап, то это можно сделать запросом
select pg_stop_backup() from gp_dist_random('gp_id');
4.2 Создать именованную точку восстановления
Выполнить запрос
select gp_create_restore_point('backup1');
Запись о точке восстановления будет помещена в лог предзаписи.
4.3 Отправить в архив файлы, хранящие созданную точку восстановления.
Отправка осуществляется через переключение логов предзаписи координатора и сегментов на новые файлы с помощью запроса
select gp_switch_wal();
- Выключить кластер и удалить содержимое каталогов всех компонентов кластера
gpstop -a
rm -rf /tmp/gpdb/qddir/demoDataDir-1/* /tmp/gpdb/dbfast1/demoDataDir0/* /tmp/gpdb/dbfast2/demoDataDir1/* /tmp/gpdb/dbfast3/demoDataDir2/* /tmp/gpdb/dbfast_mirror1/demoDataDir0/* /tmp/gpdb/dbfast_mirror2/demoDataDir1/* /tmp/gpdb/dbfast_mirror3/demoDataDir2/* /tmp/gpdb/standby/*
- Восстановить из резервной копии содержимое каталогов координатора и первичных сегментов
Имя точки восстановления из пункта 4.2 передается в параметре --target.
Команда для Greenplum 6
for i in -1 0 1 2
do
pgbackrest --stanza=seg$i --type=name --target=backup1 restore
done
Команда для Greenplum 7
for i in -1 0 1 2
do
pgbackrest --stanza=seg$i --type=name --target=backup1 --target-action=promote restore
done
В Greenplum 7 появился конфигурационный параметр recovery_target_action, который определяет действие после достижения точки восстановления. По умолчанию установлено значение pause, которое останавливает процесс восстановления, ожидая дополнительных указаний. Для автоматического запуска кластера после восстановления, необходимо изменить это значение на promote.
- Запустить только координатор
gpstart -am
- Удалить резервный координатор из кластера
gpinitstandby -ar
- Отметить зеркальные сегменты как недоступные
PGOPTIONS="-c gp_session_role=utility" psql postgres -c "
set allow_system_table_mods to true;
update gp_segment_configuration
set status = case when role='m' then 'd' else status end,
mode = 'n'
where content >= 0;"
- Перезапустить кластер в обычном режиме
gpstop -ar
- Восстановить зеркала по первичным сегментам
gprecoverseg -aF
- Восстановить резервный координатор
Команда для Greenplum 6
gpinitstandby -as $HOSTNAME -S /tmp/gpdb/standby -P 6001
Команда для Greenplum 7
gpinitstandby -as $HOSTNAME -S /tmp/gpdb/standby -P 7001
- Убедиться, что все компоненты кластера восстановились и работают
Выполнить запрос
select * from gp_segment_configuration order by content, role;
Должно быть выведено по одной строке для координатора, резервного координатора, каждого первичного и зеркального сегмента. Во всех строках в столбце status должно быть значение u.