Данная инструкция описывает, как скомпилировать 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
.