Бэкап Greenplum средствами WAL-G

В этой статье я попробую настроить бэкап СУБД Grennplum средствами WAL-G.

WAL-G — это инструмент создания и восстановления резервных копий для PostgreSQL, MySQL/MariaDB и MS SQL Server (бета-версия для MongoDB и Redis).

WAL-G является преемником WAL-E с рядом ключевых отличий. 

WAL-G использует сжатие LZ4, LZMA или Brotli, несколько параллелей и полные и инкрементальные резервные копии для Postgres. 

В версии 1.1.3 (это еще релиз-кандидат) анонсирована поддержка Greenplum.

В качестве хранилища будем использовать s3 на основе MinIO с балансировкой на основе Nginx.

Конечно, все инсталляции и настройки являются тестовыми и не претендуют на эталон для продуктовой эксплуатации.

Устанавливаем и настраиваем NGINX

ОС CentOS 7

Помимо того, что Nginx используется для создания веб-сервера HTTP, он также может использоваться как обратный прокси-сервер , балансировщик нагрузки и даже почтовый сервер.

sudo yum install -y epel-release
sudo yum –y install nginx
sudo systemctl enable nginx

Правим файл /etc/nginx/nginx.conf для проброса портов хранилища и консоли управления.

    server {
     listen 80;
     server_name vav-minio;

     # To allow special characters in headers
     ignore_invalid_headers off;
     # Allow any size file to be uploaded.
     # Set to a value such as 1000m; to restrict file size to a specific value
     client_max_body_size 0;
     # To disable buffering
     proxy_buffering off;

     location / {
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Forwarded-Proto $scheme;
       proxy_set_header Host $http_host;

       proxy_connect_timeout 300;
       # Default is HTTP/1, keepalive is only enabled in HTTP/1.1
       proxy_http_version 1.1;
       proxy_set_header Connection "";
       chunked_transfer_encoding off;

       proxy_pass http://127.0.0.1:9000; # If you are using docker-compose this would be the hostname i.e. minio
       # Health Check endpoint might go here. See https://www.nginx.com/resources/wiki/modules/healthcheck/
       # /minio/health/live;
     }
    }

    server {
     listen 81;
     server_name vav-minio;

     # To allow special characters in headers
     ignore_invalid_headers off;
     # Allow any size file to be uploaded.
     # Set to a value such as 1000m; to restrict file size to a specific value
     client_max_body_size 0;
     # To disable buffering
     proxy_buffering off;

     location / {
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Forwarded-Proto $scheme;
       proxy_set_header Host $http_host;

       proxy_connect_timeout 300;
       # Default is HTTP/1, keepalive is only enabled in HTTP/1.1
       proxy_http_version 1.1;
       proxy_set_header Connection "";
       chunked_transfer_encoding off;
       proxy_pass http://127.0.0.1:9001; # If you are using docker-compose this would be the hostname i.e. minio
       # Health Check endpoint might go here. See https://www.nginx.com/resources/wiki/modules/healthcheck/
       # /minio/health/live;
     }
    }

Перезапускаем сервис

sudo systemctl stop nginx
sudo systemctl start nginx
sudo systemctl status nginx

Устанавливаем и настраиваем MINIO

ОС CentOS 7

MinIO — отличное решение, когда надо легко и быстро организовать объектное хранилище S3.

yum -y install yum-plugin-copr
yum copr enable -y lkiesow/minio
yum install -y minio

Изменим MINIO_ACCESS_KEY и MINIO_SECRET_KEY в /etc/minio/minio.conf

###
# ACCESS
####

# Custom username or access key of minimum 3 characters in length.
MINIO_ACCESS_KEY=VashLogin
# Custom password or secret key of minimum 8 characters in length.
MINIO_SECRET_KEY=VashParol123!

Запускаем сервис MinIO

sudo systemctl start minio
sudo systemctl enable minio
sudo systemctl status minio

Далее войдем в web-интерфейс Minio http://ip-адрес-сервера-minio:81 и создаем бакет (например, gp-backups).

Собираем бинарник WAL-G для CentOS

Я собирал wal-g на отдельном сервере.

cd /tmp
curl -LO  https://go.dev/dl/go1.17.6.linux-amd64.tar.gz
sudo tar -C /usr/local -xvzf go1.17.6.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
export GOBIN="$HOME/projects/bin"
export GOPATH="$HOME/projects/src"
go get github.com/wal-g/wal-g@v1.1.3-rc-with-build
go get github.com/google/brotli@v1.0.7
mkdir -p $GOPATH/github.com/wal-g/wal-g
cp -rf $GOPATH/pkg/mod/github.com/wal-g/wal-g\@v1.1.3-rc-with-build/* $GOPATH/github.com/wal-g/wal-g
cd $GOPATH/github.com/wal-g/wal-g
mkdir -p submodules/brotli/
cp -rf $GOPATH/pkg/mod/github.com/google/brotli@v1.0.7/* submodules/brotli/
chmod u+x *.sh
chmod u+x submodules/brotli/configure-cmake
make install
yum install -y git cmake gcc*
git init
git add .
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
git commit -m "initial commit"
make deps
mkdir -p $GOBIN/wal-g
make gp_install

Добавляем WAL-G на сервера Greenplum

Получившийся файл wal-g закидываем в директорию /usr/bin на всех серверах Greenplum и проверяем версию wal-g.

# sudo cp wal-g /usr/bin
# sudo su - gpadmin -c "wal-g --version"
wal-g version 	4237296	2022.01.13_09:37:53	GreenplumDB

На каждом сервере СУБД создадим конфигурационный файл /home/gpadmin/wal-g.json и директорию /var/log/greenplum

{
"WALE_S3_PREFIX": "s3://gp-backups",
"AWS_ACCESS_KEY_ID": "VashLogin",
"AWS_ENDPOINT": "http://s3server:80",
"AWS_S3_FORCE_PATH_STYLE": "true",
"AWS_SECRET_ACCESS_KEY": "VashParol123!",
"PGHOST": "localhost",
"PGDATABASE": "postgres",
"PGUSER": "gpadmin",
"WALG_UPLOAD_CONCURRENCY": "2",
"WALG_DOWNLOAD_CONCURRENCY": "2",
"WALG_UPLOAD_DISK_CONCURRENCY": "2",
"WALG_DELTA_MAX_STEPS": "7",
"WALG_COMPRESSION_METHOD": "brotli",
"WALG_GP_LOGS_DIR": "/var/log/greenplum"
}

Настраивание архивирование WAL для каждого сегмента. Команда архивации должна содержать флаг --content-id с идентификатором сегмента.

wal_level = archive
archive_mode = on
archive_command = '/usr/bin/wal-g seg wal-push %p --content-id=-1 --config /home/gpadmin/wal-g.json'
archive_timeout = 60

После успешной настройки используйте команду backup-push с мастера для создания новой резервной копии.

wal-g backup-push --config=/home/gpadmin/wal-g.json

Посмотреть список бэкапов можно командой backup-list

wal-g backup-list  --config /home/gpadmin/wal-g.json

Проводим тестирование создание и восстановление резервных копий wal-g

Создаем таблицу в БД test

create database test;
\c test;
CREATE TABLE indexing_table (simple_counter serial, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()) WITH (appendonly = true, orientation = column, compresstype = zstd , compresslevel = 1) DISTRIBUTED BY (simple_counter);

Запускаем вставку данных. Ждем 10-20 минут.

#!/bin/bash
# gpadmin
while true; do
psql -U gpadmin -d test -c "INSERT INTO indexing_table(created_at) VALUES (CURRENT_TIMESTAMP);"
sleep 30;
done

Смотрим записи в таблице в БД test

test=# select * from indexing_table order by simple_counter;
 simple_counter |          created_at
----------------+-------------------------------
              1 | 2022-01-14 12:15:27.445995+00
              2 | 2022-01-14 12:15:57.641899+00
              3 | 2022-01-14 12:16:27.785134+00
              4 | 2022-01-14 12:16:57.889724+00
              5 | 2022-01-14 12:17:28.009452+00
              6 | 2022-01-14 12:17:58.103357+00

Делаем переключение wal

select pg_switch_xlog();

Выполним полный бэкап командой и посмотрим список бэкапов

wal-g backup-push --config=/home/gpadmin/wal-g.json
wal-g backup-list  --config /home/gpadmin/wal-g.json

Теперь восстановим все на те же сервера. Поэтому нам не понадобится файл конфигурации кластера.

Для этого остановим кластер и удалим все директории с данными.

Запускаем команду backup-fetch от пользователя gpadmin.

wal-g backup-fetch LATEST --in-place --config=/home/gpadmin/wal-g.json

Восстанавливается последний полный бэкап.

Затем следовало запустить кластер, но почему то recovery.conf прописался не корректный путь до бинарника wal-g. Пришлось везде поправить руками. Возможно, нужно его помещать в /usr/bin.

Потребовалось запустить кластер в режиме maser-only и удалить информацию о резервном мастере.

Зеркальные сегменты, разумеется, не восстановились.

Пробуем выполнить запрос.

test=# select * from indexing_table order by simple_counter;
 simple_counter |          created_at
----------------+-------------------------------
              1 | 2022-01-14 12:15:27.445995+00
              2 | 2022-01-14 12:15:57.641899+00
              3 | 2022-01-14 12:16:27.785134+00
              4 | 2022-01-14 12:16:57.889724+00
              5 | 2022-01-14 12:17:28.009452+00
              6 | 2022-01-14 12:17:58.103357+00

Выводы

Всё здорово, бэкап работает. Это просто замечательно. В целом работает без дополнительных скриптов. Можно экспериментировать и настраивать дальше.

Ссылки на статьи-источники

https://phoenixnap.com/kb/how-to-install-nginx-on-centos-7
https://habr.com/ru/post/486188/
https://golangify.com/install-on-centos-7

Добавить комментарий

Ваш адрес email не будет опубликован.