В этой статье я попробую настроить бэкап СУБД 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