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