WAL-G
https://wal-g.readthedocs.io/
Overview
WAL-G это инструмент для архивации и восстановления PostgreSQL, MySQL/MariaDB, and MS SQL Server (beta for MongoDB and Redis)
Installation
Готовые бинари можно найти тут - https://github.com/wal-g/wal-g/releases
Будем разбирать на примере последнего на текущий момент wal-g для postgres под ubuntu
https://github.com/wal-g/wal-g/releases/download/v2.0.1/wal-g-pg-ubuntu-20.04-amd64
Как можно заметить, имя релиза строится по следующему шаблону wal-g-DBNAME-OSNAME
Если тебе нужен wal-g под другую систему то смотри тут как собрать - https://wal-g.readthedocs.io/#development
Есть autocompletion: wal-g help completion
Итак, качаем бинарь, кладем в /usr/local/bin/wal-g
и даем ему права на исполнение
wget https://github.com/wal-g/wal-g/releases/download/v2.0.1/wal-g-pg-ubuntu-20.04-amd64
chmod ug+x wal-g-pg-ubuntu-20.04-amd64
mv wal-g-pg-ubuntu-20.04-amd64 /usr/local/bin/wal-g
Можем считать что установили
Configuration
Есть два способа сконфигурировать wal-g:
- Переменные окружения
- Конфигурационный файл
Через флаг --config /path
можно указать путь до конфига
We support every format that the viper package supports: JSON, YAML, envfile and others.
Every configuration variable mentioned in the following documentation can be specified either as an environment variable or a field in the config file.
Storage
Указывает куда wal-g должен складывать бэкапы. См. https://wal-g.readthedocs.io/STORAGES/
Compression
WALG_COMPRESSION_METHOD
- указывает какой метод компрессии использовать для бэкапов. Доступные варианты: lz4
, lzma
, zstd
, brotli
По умолчанию lz4
. Потому что это самый быстрый метод, но он имеет плохую степень сжатия. LZMA медленнее, но он сжимает в 6 раз сильнее чем LZ4. Brotli и ZSTD это хороший компромис между сжатием и скоростью, они сжимают в три раза сильнее чем LZ4
Encryption
YC_CSE_KMS_KEY_ID
,YC_SERVICE_ACCOUNT_KEY_FILE
- для настройки шифрования через Yandex Cloud KMSWALG_LIBSODIUM_KEY
,WALG_LIBSODIUM_KEY_PATH
,WALG_LIBSODIUM_KEY_TRANSFORM
- для настройки шифрования через libsodiumWALG_GPG_KEY_ID
,WALG_PGP_KEY
,WALG_PGP_KEY_PATH
,WALG_PGP_KEY_PASSPHRASE
- для настройки шифрования через GPG
Monitoring
WALG_STATSD_ADDRESS
- позволяет включить паблишинг метрик в statsd или statsd_exporter. Метрики будут засылаться по UDP. Порт по умолчанию - 9125
Profiling
Профилирование позволяет находить узкие места в работе wal-g
PROFILE_SAMPLING_RATIO
- число от 0 до 1 указывающее вероятность того что будет включен профилировщик. Если установлено значение 1, он всегда будет работать. Это позволяет осуществлять вероятностную выборку вызовов. Поскольку процессы WAL-G могут создаваться несколько раз в секунду (например, wal-g wal-push), мы не хотим профилировать их всеPROFILE_MODE
- какой профиль собираем, может быть одним из: cpu, mem, mutex, block, threadcreation, trace, goroutine. По умолчанию - cpuPROFILE_PATH
- директория в которую надо сложить профили. По умолчанию -$TMPDIR
Rate limiting
WALG_NETWORK_RATE_LIMIT
- задает ограничение трафика для операций backup-push
/backup-fetch
. Задается в байтах в секунду
Database-specific options
Есть множество db-specific опций, смотри их в https://wal-g.readthedocs.io/#databases
Usage
Следующие команды поддерживаются для всех типов баз данных
-
backup-list
- выводит список доступных бэкапов--pretty
- выводит в виде таблицы--json
- выводит в json, если добавить флаг--pretty
то будет красивый json--detail
- обогащает дополнительной инфой, можно добавить флаги--pretty
и/или--json
-
delete
- удаляет бэкапы и WAL'ы перед ними. По умолчанию ничего не сделает, если действительно хочешь удалить то нужно добавить в конец флаг--confirm
. Бэкапы помеченные как 'permanent' не будут удалены
delete
может работать в четырех режимах:retain
,before
,everything
иtarget
Они позволяют удалять либо все кроме определенного кол-ва наисвежайших, либо все до определенного бэкапа, либо все, либо конкретный бэкап
Подробности смотри в https://wal-g.readthedocs.io/#delete
Storage tools
Группа команд wal-g st
позволяет осуществлять прямое взаимодействие с сконфигурированными стораджами
Подробности в https://wal-g.readthedocs.io/StorageTools
Databases
PostgreSQL
Информация об установке, конфигурации и использовании
MySQL/MariaDB
Информация об установке, конфигурации и использовании
SQLServer
Информация об установке, конфигурации и использовании
Mongo [Beta]
Информация об установке, конфигурации и использовании
FoundationDB [Work in progress]
Информация об установке, конфигурации и использовании
Redis [Beta]
Информация об установке, конфигурации и использовании
Greenplum [Work in progress]
Информация об установке, конфигурации и использовании
Development
О том как собрать из исходников https://wal-g.readthedocs.io/#development
Storages
WAL-G может сохранять бэкапы на S3, Google Cloud Storage, Azure, Swift, удаленный хост (через SSH) или на локальную файловую систему
S3
Чтобы wal-g мог подключиться к amazon s3 должны быть проставлены следующие переменные:
WALG_S3_PREFIX
(напримерs3://bucket/path/to/folder
) (можно иWALE_S3_PREFIX
)
WAL-G определяет aws-креды как и другие aws тулзы. Ты можешь проставить переменные AWS_ACCESS_KEY_ID
и AWS_SECRET_ACCESS_KEY
(опционально с AWS_SESSION_TOKEN
), или прописать их в файл ~/.aws/credentials
(опционально с AWS_PROFILE
), или ты можешь не прописывать ничего, тогда креды будут получены от сервиса метаданных
Опциональные переменные:
AWS_ROLE_ARN
,AWS_ROLE_SESSION_NAME
- амазоновские штукиAWS_REGION
(напримерus-west-2
) - WAL-G может автоматически определять регион бакета через амазон используяs3:GetBucketLocation
, но если ты желаешь обойти вызов этого API то можешь указать через переменнуюAWS_ENDPOINT
- переопределяет дефолтный хостнейм для подключения к S3-совместимому сервису (напримерhttp://s3-like-service:9000
)AWS_S3_FORCE_PATH_STYLE
- включает path-style addressing (http://s3.amazonaws.com/BUCKET/KEY
) при подключении к S3-совместимому сервису недостаточно поддержки sub-domain style bucket URLs (http://BUCKET.s3.amazonaws.com/KEY
). По умолчанию стоитfalse
WALG_S3_STORAGE_CLASS
,WALG_S3_SSE
,WALG_S3_SSE_KMS_ID
,WALG_CSE_KMS_ID
,WALG_CSE_KMS_REGION
- разные амазоновские штукиWALG_S3_RANGE_BATCH_ENABLED
- позволяет, при проблемах с сетью, продолжать загружать с уже загруженной точки (а не с начала). Это полезно при больших бэкапах, которые грузятся часамиWALG_S3_RANGE_MAX_RETRIES
- при включенной предыдущей опции, эта опция задает кол-во ретраев (по умолчанию 10)WALG_S3_USE_LIST_OBJECTS_V1
- по умолчанию wal-g использует метод ListObjectsV2, но некоторые S3-совместимые хранилища могут не поддерживать его. Если установить эту опцию вtrue
, то wal-g будет использовать просто ListObjectsWALG_S3_MAX_RETRIES
- позволяет переопределить дефолтный лимит ретраев для работы по S3 (по умолчанию 15)
GCS
https://wal-g.readthedocs.io/STORAGES/#gcs
Azure
https://wal-g.readthedocs.io/STORAGES/#azure
Swift
https://wal-g.readthedocs.io/STORAGES/#swift
File system
Чтобы wal-g сохранял бэкапы на файловую систему, нужно указать переменную WALG_FILE_PREFIX
WALG_FILE_PREFIX=/tmp/wal-g-test-data
SSH
Чтобы wal-g сохранял бэкапы по ssh, нужно указать следующие переменные
WALG_SSH_PREFIX='ssh://localhost/walg-folder'
SSH_PORT
SSH_USERNAME
SSH_PASSWORD
SSH_PRIVATE_KEY_PATH
Storage tools
Серия команд wal-g st
позволяет взаимодействовать со стороджами
Помни что потенциально эти команды могут все сломать, поэтому надо быть внимательным и понимать что делаешь
-
ls
- выводит список объектов в указанной папке
wal-g st ls
- список объектов
wal-g st ls -r
- рекурсивно
wal-g st ls some_folder/some_subfolder
- по указанному пути -
get
- скачивает указанный объект. По умолчанию попытается разжать и расшифровать (если настроенго)
Есть два очевидных флага:--no-decompress
--no-decrypt
-
cat
- выводит указанный файл на STDOUT. По умолчанию не разжимает и не расшифровывает. Полезно для всяких метаинформационных файлов
Есть два очевидных флага:--decompress
--decrypt
Пример:
wal-g st cat path/to/remote_file.json
-
rm
- удаляет объект
Пример:wal-g st rm path/to/remote_file
-
put
- загружает указанный файл в сторадж. По умолчанию попытается сжать и зашифровать (если настроено)
Есть два очевидных флага:--no-compress
--no-encrypt
Пример:
wal-g st put path/to/local_file path/to/remote_file
-
transfer
- переносит все файлы из одного стораджа в другой. Обычно используется для переноса файлов с failover-стораджа на primary
Аргумент один - путь до директории (на обоих стораджах) где лежат/будут лежать файлы которые должны быть перенесены
Флаги:-s (--source)
- имя исходного стораджа из которого нужно взять файлы. Для указания на primary используйdefault
(обязательный флаг)-t (--target)
- сторадж куда надо сохранить файлы (по умолчанию используетсяdefault
)-o (--overwrite)
- мувнуть файлы даже если они уже есть на таргете. Если этот флаг не указан и файлы есть и там и там, то ничего не произойдет. Надо помнить что наличие файлов на таргете проверяется в начале, и если файл появится на таргете в момент выполнения команды, то он может быть затерт даже если не указан флаг-o
--fail-fast
- остановит трансфер после первой же ошибки. Без этого флага он будет пытаться мувнуть все файлы. Независимо от наличия флага, exit-код команды будет нулевым только если все файлы успешно перенесены
Держи в уме что если файлы не перенеслись автоматически, то если этот флаг будет установлен, то ошибка произошедшая с одним файлом, может прекратить перенос остальных файлов по середине. Таким образом часть файлов будет перенесена на таргет сторадж, но не удалена с исходного-c (--concurrency)
- задает кол-во воркеров которые будут таскать файлы-m (--max)
- лимит файлов которые могут быть перенесены одним запуском команды--appearance-checks
- устанавливает проверки для файлов, которые должны быть перенесены в таргет сторадж, которые должны быть выполнены после переноса и перед удалением файла из исходного стораджа
Эта опция рекомендована для стораджей которые не гарантируют read-after-write consistency. Иначе перенос файла между такими стораджами может создать момент когда файл не существует на обоих стораджах, а это повлечет проблемы с восстановлением в этот период--appearance-checks-interval
- задает минимальный интервал между проверками того что файл появился на таргет-сторадже
Длительность задается в голанговскомtime.Duration
формате
Примеры:
wal-g st transfer / --source='my_failover_ssh' wal-g st transfer folder/single_file.json --source='default' --target='my_failover_ssh' --overwrite wal-g st transfer basebackups_005/ --source='my_failover_s3' --target='default' --fail-fast -c=50 -m=10000 --appearance-checks=5 --appearance-checks-interval=1s
WAL-G for PostgreSQL
Ты можешь использовать wal-g как инструмент для создания зашифрованых и сжатых postgresql бэкапов (полных и инкрементальных) и для push/fetch их на/с удаленных стораджей без необходимости сохранения на свою ФС
Configuration
WAL-G использует обычные постгресовые переменные окружения для настройки подключения, особенно включая PGHOST
, PGPORT
, PGUSER
, и PGPASSWORD
/PGPASSFILE
/~/.pgpass
PGHOST
может подключить по unix-сокету. Этот режим предпочтительный для локальных подключений. Для его использования задай переменную так - PGHOST=/var/run/postgresql
Если в PGHOST
указан IP, то wal-g подключится по TCP
WALG_DISK_RATE_LIMIT
- нужен для ограничения скорости чтения с диска приbackup-push
(в байтах в секунду). Параллельность задается переменной нижеWALG_DOWNLOAD_CONCURRENCY
- задает как много горутин использовать приbackup-fetch
иwal-fetch
. По умолчанию используется меньшее из кол-ва файлов и 10WALG_PREFETCH_DIR
- по умолчанию wal-prefetch сохраняет валы вpg_wal
. Эта опция позволяет легко мувнуть волы из временной диры в актуальную откуда их употребить постгрес. Но это может вызвать негативные последствия если ты используешь это вместе сpg_rewind
в PostgreSQL 13. PostgreSQL 13 может вызватьrestore_command
во времяpg_rewind
. Тогда запрефетченные волы могут вызвать ложную ошибку у pg_rewind. Чтобы обойти это ты можешь либо отключить префетчинг на время pg_rewind'a (установивWALG_DOWNLOAD_CONCURRENCY = 1
), либо разместить wal prefetch папку вне PGDATAWALG_UPLOAD_CONCURRENCY
- задает кол-во параллельных стримов которые будут отгружать бэкап (по умолчанию 16)WALG_UPLOAD_DISK_CONCURRENCY
- задает как много параллельных стримов будут читать диск во времяbackup-push
(по умолчанию 1)TOTAL_BG_UPLOADED_LIMIT
(напр. 1024) - переопределяет дефолтное кол-во wal файлов которые будут отгружены во время одного скана. По умолчанию не более 32WALG_SENTINEL_USER_DATA
- эта опция позволяет автобэкаперу добавлять дополнительную инфу в JSON sentinel файл во времяbackup-push
. Эта опция может быть использована например для того чтобы давать человеко-понятные имена бэкапам. UserData должна быть валидной json строкойWALG_PREVENT_WAL_OVERWRITE
- если указана эта опция, то wal-g будет во времяwal-push
проверять существование вола перед его загрузкой. Если другой файл уже заархивирован под этим же именем то wal-g вернет ненулевой exit-code чтобы не дать postgres'у удалить этот волWALG_DELTA_MAX_STEPS
- Delta-backup это разница между предыдущим сделанным бэкапом и текущим состоянием. Эта переменная указывает как много может быть дельта-бэкапов между полными бэкапами. По умолчанию 0. Процесс восстановления будет автоматически фетчить все необходимые дельты и базовые бэкапы и составит из них валидные бэкап для восстановления (все равно нужны валы после старта последнего бэкапа чтобы восстановить консистентный кластер). Вычисление дельт базируется на ModTime файловой системы и LSN номера страницы в файлах данныхWALG_DELTA_ORIGIN
- нужен для указания базы для следующего дельта бэкапа (только если значение предыдущей переменной еще не иссякло). Значением может быть LATEST (цепочный инкремент) или LATEST_FULL (для баз где волатильная часть мала и цепочка не имеет смысла (дельты перезаписывают друг друга))WALG_TAR_SIZE_THRESHOLD
- задает размер одного бэкап-бандла в байтах. Меньший размер дает гранулярность и более оптимальный, быстро восстанавливается, но так же увеличивает кол-во запросов к стораджу, а это может выйти в копеечку. По умолчанию стоит 1GbWALG_TAR_DISABLE_FSYNC
- выключает вызов fsync после записи файла при экстрактинге из tar архивовWALG_PG_WAL_SIZE
- позволяет задать размер wal сегмента если он отличается от дефолтного (16M)WALG_UPLOAD_WAL_METADATA
- загружает метаданные связанные с wal файлами. Может быть INDIVIDUAL (метаданные генерятся для всех волов) или BULK (метаданные генерятся для пачки волов). Если в значении стоит NOMETADATA или переменная не указана то фолбэчится на дефолтную настройу - не генерить метаданные для воловWALG_ALIVE_CHECK_INTERVAL
- задает кака часто wal-g должен проверять жив ли постгрес во время backup-push. Если проверка фейлится, то заливка бэкапа прерывается- 0 - выключает проверку
- 1m - проверяет раз в минуту (дефолт)
- 10s - проверяет каждые 10 секунд
WALG_STOP_BACKUP_TIMEOUT
- задает таймаут для вызоваpg_stop_backup()
. По умолчанию таймаута нет- 0 - выключает таймаут (дефолт)
- 10s - таймаут 10 секунд
- 10m - 10 минут
Usage
backup-fetch
Чтобы достать базовый бэкап, пользователю нужно указать имя бэкапа и путь куда его распаковать. Если эта директория не существует то wal-g создаст ее и все промежуточные поддиректории
wal-g backup-fetch ~/extract/to/here example-backup
Можно достать последний бэкап вот так
wal-g backup-fetch ~/extract/to/here LATEST
Можно достать бэкап который имеет определенную UserData указав эту юзердату в ключе --target-user-data
или в переменной WALG_FETCH_TARGET_USER_DATA
wal-g backup-fetch /path --target-user-data "{ \"x\": [3], \"y\": 4 }"
Reverse delta unpack
Beta feature: WAL-G может распаковывать дельта бэкапы в обратном порядке для увеличения эффективности
Активировать эту функцию можно либо через переменную WALG_USE_REVERSE_UNPACK
, либо через флаг --reverse-unpack
Redundant archives skipping
Вместе с включенной функцией обратной распаковки дельт ты также можешь включить пропуск избыточных архивов. Эта функция вовлечена и в процесс создания бэкапа и в процесс его восстановления, чтобы включить это нужно сделать две вещи:
- Опционально. Увеличить шанс пропуска архивов, но в результате может замедлиться создание бэкапов. Enable rating tar ball composer for
backup-push
- Включить пропуск избыточных бэкапов во время
backup-fetch
(два варианта как):- Проставив переменные
WALG_USE_REVERSE_UNPACK
иWALG_SKIP_REDUNDANT_TARS
- Добавив флаги
--reverse-unpack
и--skip-redundant-tars
- Проставив переменные
Partial restore (experimental)
Во время частичного восстановления wal-g восстанавливает фалы только определенных баз данных. В качестве параметра используй 'database' или 'database/namespace.table' (схема 'public' может быть опущена)
wal-g backup-fetch /path LATEST --restore-only=my_database,"another database",database/my_table
В этом примере двойные кавычки нужны только для пробела, они будут проигнорированы
Три выражения ниже - эквивалентны:
--restore-only=my_db,"another db"
--restore-only=my_db,another" "db
--restore-only=my_db,anoth"e"r" "d"b"
Для этого требуются файлы с метаданными которые автоматически собираются во время локального бэкапирования (при удаленном бэкапировании это не работает)
Также автоматически восстанавливаются системные бд и таблицы
Потому что остатки невосстановленных бд и таблиц остаются в системных таблицах, поэтому рекомендуется дропать их
Опции --skip-redundant-tars
и --reverse-unpack
проставляются автоматически
backup-push
Для отгрузки бэкапов на сторадж, пользователь должен указать постгресовую датадиру в качестве аргумента
wal-g backup-push $PGDATA
WAL-G проверит, совпадают ли аргумент команды, переменная окружения PGDATA
и параметр конфигурации PGDATA
, если они установлены
Если бэкап запущен со standby сервера, то wal-g будет следить за таймлайном сервера. Если промоушен или таймлайн изменится во время бэкапа, то данные будут загружены но не финализированы, и wal-g вывалится с ошибкой. Логи будут содержать информацию необходимую для финализации бэкапа (которая может быть использована если ты четко понимаешь все риски)
backup-push
может быть также запущен с флагом --permanent
, который пометит бэкап как перманентный и убережет его от удаления при запуске команды delete
Remote backup
WAL-G backup-push имеет два варианта стриминга данных:
- Запуск прямо на сервере с БД под пользователем постгреса - wal-g может читать файлы базы данных прямо с файловой системы. Этот вариант дает высокую производительность и дополнительные возможности, такие как частичное восстановление или дельта бэкапы
For uploading backups to S3 using streaming option 1, the user should pass in the path containing the backup started by Postgres as in:
bash wal-g backup-push /backup/directory/path
- Альтернативно wal-g может стримить бэкапные данные через postgres'овый BASE_BACKUP протокол
Это позволяет wal-g стримить бэкапы по TCP, быть запущенным удаленно и быть запущенным из под другого пользователя. Wal-g требуется подключение с правом репликации (в статье про base backup это описано). Помни что протокол BASE_BACKUP не умеет в мультитрединг и дельта бэкапы пока не имплементированы
Чтобы завести эту схему, надо покинуть data dir постгри и указать хостнейм постгрес сервера (через env var PGHOST
или аргумент параметра --pghost
)
# Inline
PGHOST=srv1 wal-g backup-push
# Export
export PGHOST=srv1 wal-g backup-push
# Use commandline option
wal-g backup-push --pghost srv1
Опции удаленного бэкапирования также могут быть использованы для:
- запуска постгресов на множестве хостов и бэкапирования через wal-g используя мультихост конфигурацию:
wal-g backup-push --pghost srv1,srv2
- запуска постгреса на windows хосте и бэкапинга через wal-g на линукс хосте:
PGHOST=winsrv1 wal-g backup-push
- запуска wal-g как kubernetes cronjob
Rating composer mode
В режиме составителя рэйтинга (?) wal-g во время бэкапа кладет файлы с одинаковой частотой обновления в общие тарболы. Это должно увеличить эффективность пропуска избыточных архивов backup-fetch
'а. Будь осторожен, хоть этот режим и позволяет сохранить больше данных, в итоге он может замедлить создание бэкапа по сравнение с дефолтным сборщиком тарболов
Для активации этой фичи сделай одно из:
- установи переменную
WALG_USE_RATING_COMPOSER
- добавь флаг
--rating-composer
wal-g backup-push /path --rating-composer
Copy composer mode
В режиме copy composer, wal-g делает полный бэкап и копирует неизмененные тар-файлы из предыдущего полного бэкапа. В случае если нет предыдущего полного бэкапа будет задействован regular
composer
Чтобы активировать эту фичу сделай одно из:
- установи переменную
WALG_USE_COPY_COMPOSER
- добавь флаг
--copy-composer
wal-g backup-push /path --copy-composer
Database composer mode
В этом режиме wal-g отделяет файлы из разных директорий внутри дефолтного tablespace и пакует их в разные тарболы. Это создано для увеличения перфоманса частичного восстановления
Чтобы активировать эту фичу сделай одно из:
- установи переменную
WALG_USE_DATABASE_COMPOSER
- добавь флаг
--database-composer
wal-g backup-push /path --database-composer
Backup without metadata
По умолчанию wal-g отслеживает метаданные забэкапленных файлов. Если забэкаплено миллионы файлов (типичный кейс сотен бд и тысяч таблиц в каждой бд), то трекинг этих метаданных потребует гигабайты памяти
Если выставлен флаг --without-files-metadata
или переменная WALG_WITHOUT_FILES_METADATA
, то wal-g не будет трэкать метаданные забэкапленных файлов. Это значительно уменьшит потребление памяти на инстансе с более чем 100к файлов
Ограничения:
- не может быть использовано с
rating-composer
,copy-composer
- не может быть использовано с параметром
WALG_DELTA_MAX_STEPS
или флагамиdelta-from-user-data
,delta-from-name
Чтобы активировать эту фичу сделай одно из:
- установи переменную
WALG_WITHOUT_FILES_METADATA
- добавь флаг
--without-files-metadata
wal-g backup-push /path --without-files-metadata
Create delta backup from specific backup
При создании дельта бэкапа (WALG_DELTA_MAX_STEPS
> 0), wal-g по умолчанию использует последний бэкап как базовый. Это поведение может быть изменено с помощью следующих флагов:
--delta-from-name
илиWALG_DELTA_FROM_NAME
- задает имя бэкапа который будет взят за базовый для дельта бэкапа--delta-from-user-data
илиWALG_DELTA_FROM_USER_DATA
- задает юзердату бэкап с которой будет взят как базовый для дельта бэкапа
wal-g backup-push /path --delta-from-name base_000000010000000100000072_D_000000010000000100000063
wal-g backup-push /path --delta-from-user-data "{ \"x\": [3], \"y\": 4 }"
Если использовать флаг выше в комбинации с WALG_DELTA_ORIGIN
, то его логика будет применяться к указанному бэкапу
list of backups in storage:
base_000000010000000100000040 # full backup
base_000000010000000100000046_D_000000010000000100000040 # 1st delta
base_000000010000000100000061_D_000000010000000100000046 # 2nd delta
base_000000010000000100000070 # full backup
export WALG_DELTA_ORIGIN=LATEST_FULL
wal-g backup-push /path --delta-from-name base_000000010000000100000046_D_000000010000000100000040
wal-g logs:
INFO: Selecting the backup with name base_000000010000000100000046_D_000000010000000100000040 as the base for the current delta backup...
INFO: Delta will be made from full backup.
INFO: Delta backup from base_000000010000000100000040 with LSN 140000060.
Page checksums verification
Чтобы включить верификацию страничных чексумм по время backup-push, используй флаг --verify
или переменную WALG_VERIFY_PAGE_CHECKSUMS
. Если будут найдены, то кол-во поврежденных блоков будет записано в sentinel json
...
"/base/13690/13535": {
"IsSkipped": true,
"MTime": "2020-08-20T21:02:56.690095409+05:00",
"IsIncremented": false
},
"/base/16384/16397": {
"CorruptBlocks": [
1
],
"IsIncremented": false,
"IsSkipped": false,
"MTime": "2020-08-21T19:09:52.966149937+05:00"
},
...
wal-fetch
Когда качается wal архив из s3, пользователь должен указать имя архива и имя файла в который надо скачать архив. Этот файл не должен существовать так как wal-g создаст его для тебя
Wal-g предзакачивает wal файлы наперед относительно тех которые запрошены. Эти файлы кэшируются в папку ./.wal-g/prefetch
. Закэшированные файлы старше чем последний запрошенный удаляются из кэша для предотвращения разбухания кэша. Если закэшированный файл запрошен через wal-fetch
, он будет удален из кэша и будет дернут триггер на скачивание нового
wal-g wal-fetch example-archive new-file-name
Эта команда создана для выполнения из постгресового restore_command
Отметим что wal-fetch
будет вылетать с экзиткодом 74 (EX_IOERR: input/output error, ...
) если wal файл не доступен в репозитории. Все остальные ошибки приводят к exit code 1, и должны останавливать postgres раньше чем завершается восстановление. Для постгреса это может быть любой код ошибки между 126 и 255, которые могут быть получены через простой скрипт-обертку. См. PR - https://github.com/wal-g/wal-g/pull/1195 (судя по PR это говно уже пофикшено)
wal-push
Для отгрузки вал архивов в S3 пользователь должен указать абсолютный путь до архива
wal-g wal-push /path/to/archive
Эта команда создана для выполнения из постгресовой archive_command
wal-show
Показывает инфу о каталоге хранения wal'ов. Она показывает все таймлайны вол-сегментов доступных в сторадже, отображает доступные бэкапы для них и проверяет их на потерянные сегменты
- если нет гэпов (потерянных сегментов) в диапазоне, то статус -
OK
- если потерянные сегменты найдены то статус -
LOST_SEGMENTS
wal-g wal-show
По умолчанию wal-show показывает доступные бэкапы для каждого таймлайна. Чтобы выключить это поведение добавь флаг --without-backups
По умолчанию выводится таблица, чтобы вывести подробный json, добавь флаг --detailed-json
wal-verify
Запускает серию проверок чтобы убедиться что сторадж wal-сегментов здоров. Доступные проверки:
integrity
Проверка того что история wal-сегментов консистентна для кластера и значит wal-g сможет выполнить PITR для бэкапа. В основном это проверки того что все wal-сегменты в диапазоне [oldest backup start segment, current cluster segment)
доступны в сторадже. Если бэкапов не найдено то будет отсканирован диапазон [1, current cluster segment)
В выводе integrity проверки есть 4 статуса:
FOUND
- сегменты присутствуют в стораджеMISSING_DELAYED
- сегментов в сторадже нет, но возможно постгрес просто еще не заслал ихMISSING_UPLOADING
- сегментов еще нет, но похоже они загружаются прямо сейчасMISSING_LOST
- сегментов нет в сторадже но они не delayed и не uploading
Размер диапазона сегментов ProbablyUploading
берется из настройки WALG_UPLOAD_CONCURRENCY
Размер диапазона сегментов ProbablyDelayed
контролируется настройкой WALG_INTEGRITY_MAX_DELAYED_WALS
Вывод содержит:
- Статус
integrity
проверки:OK
- нет пропущенных сегментовWARNING
- есть несколько пропущенных сегментов но они неMISSING_LOST
FAILURE
- есть несколькоMISSING_LOST
сегментов
- Список сегментов в хронологическом порядке сгруппированных по таймлайнам и статусам
timeline
Проверка что текущий таймлайн кластера больше чем или равен какому-либо таймлайну в сторадже
Эта проверка полезна для обнаружения split-brain конфликтов
Обрати внимание что эта проверка будет работать корректно только если создан новый сторадж или старый очищен после восстановления из бэкапа или применения pg_upgrade
Вывод содержит:
- Статус
timeline
проверки:OK
- текущий timeline-id матчится с наивысшим таймлайном в стораджеWARNING
- не получается определить что текущий таймлайн матичится с наивысшим в стораджеFAILURE
- текущий timeline-id не равен наивысшему таймлайну в сторадже
- Текущий таймлайн айди
- Наивысший таймлайн айди найденный в сторадже
Пример
wal-g wal-verify [space separated list of checks]
# For example:
wal-g wal-verify integrity timeline # perform integrity and timeline checks
wal-g wal-verify integrity # perform only integrity check
По умолчанию вывод wal-verify это плейнтекст. Чтобы переключить на json добавь флаг --json
Пример обычного вывода:
[wal-verify] integrity check status: OK
[wal-verify] integrity check details:
+-----+--------------------------+--------------------------+----------------+--------+
| TLI | START | END | SEGMENTS COUNT | STATUS |
+-----+--------------------------+--------------------------+----------------+--------+
| 3 | 00000003000000030000004D | 0000000300000004000000F0 | 420 | FOUND |
| 4 | 0000000400000004000000F1 | 000000040000000800000034 | 836 | FOUND |
+-----+--------------------------+--------------------------+----------------+--------+
[wal-verify] timeline check status: OK
[wal-verify] timeline check details:
Highest timeline found in storage: 4
Current cluster timeline: 4
Пример json вывода:
{
"integrity":{
"status":"OK",
"details":[
{
"timeline_id":3,
"start_segment":"00000003000000030000004D",
"end_segment":"0000000300000004000000F0",
"segments_count":420,
"status":"FOUND"
},
{
"timeline_id":4,
"start_segment":"0000000400000004000000F1",
"end_segment":"000000040000000800000034",
"segments_count":836,
"status":"FOUND"
}
]
},
"timeline":{
"status":"OK",
"details":{
"current_timeline_id":4,
"highest_storage_timeline_id":4
}
}
}
wal-receive
Получает wal поток используя postgresql streaming replication и пушит это в сторадж
Ты можешь указать имя слота репликации в переменной WALG_SLOTNAME
(по умолчанию walg
). Имя слота может содержать только цифры буквы и подчеркивания. Для загрузки wal в s3 пользователь должен указать полный путь до архива
backup-mark
Бэкапы могут быть помечены как постоянные (permanent) для предотвращения удаления их при запуске команды delete
. Постоянность бэкапа может быть изменена через эту команду. Нужно скормить сюда имя бэкапа (получить его можно из вывода wal-g backup-list --pretty --detail --json
), и тогда он и предыдущие связанные с ним бэкапы будут помечены как постоянные. Обратное действие доступно через флаг -i
catchup-push
Чтобы создать догонный инкрементальный бэкап, пользователь должен указать путь до постгресовой диры на мастере и LSN реплики для которой делается бэкап
Пошагово:
- Остановка реплики
- Получение LSN реплики
- Начало загрузки инкрементального бэкапа на мастере
wal-g catchup-push /path/to/master/postgres --from-lsn replica_lsn
catchup-fetch
Чтобы провернуть догон инкрементальным бэкапом сделанным через catchup-push
, пользователю нужно указать путь до постгреса на реплике и имя бэкапа
wal-g catchup-fetch /path/to/replica/postgres backup_name
copy
Эта команда поможет изменить сторадж и перенести туда набор бэкапов или записать бэкапы на магнитную ленту
Например: wal-g copy --from=config_from.json --to=config_to.json
- скопирует все бэкапы
Флаги:
-b, --backup-name string
- скопировать конкретный бэкап-f, --from string
- сторадж-конфиг стораджа из которого нужно копировать-t, --to string
- сторадж-конфиг стораджа на который нужно скопировать-w, --without-history
- копировать бэкапы без истории (wal files)
delete garbage
Удаляет просроченные wal архивы и остаточные файлы бэкапов на сторадже (неуспешные бэкапы или частично удаленные). Удалит все неперманентные объекты до самого раннего неперманентного бэкапа. Эта команда полезна когда бэкапы были удалены через delete target
wal-g delete garbage # Deletes outdated WAL archives and leftover backups files from storage
wal-g delete garbage ARCHIVES # Deletes only outdated WAL archives from storage
wal-g delete garbage BACKUPS # Deletes only leftover (partially deleted or unsuccessful) backups files from storage
The
garbage
target can be used in addition to the other targets, which are common for all storages
wal-restore
Восстанавливает потеряные wal-сегменты которые будут необходимы для выполнения pg_rewind
из стораджа. Текущая версия поддерживает только локальные кластеры
wal-g wal-restore path/to/target-pgdata path/to/source-pgdata
daemon
Архивировать и стягивать все wal-сегменты в фоне. Работает с PostgreSQL archive library walg_archive
или walg-daemon-client
wal-g daemon path/to/socket-descriptor
pgBackRest backups support (beta version)
https://wal-g.readthedocs.io/PostgreSQL/#pgbackrest-backups-support-beta-version
Failover archive storages (experimental)
https://wal-g.readthedocs.io/PostgreSQL/#failover-archive-storages-experimental
Playground
Ты можешь протестить wal-g в с помощью этого playground