Резервирование и восстановление с использованием WAL-G

 

Часть 1. Конфигурирование сервера хранения бэкапов minio

 

Протокол S3 (Simple Storage Service) используется компаниями, предоставляющими услуги по хранению данных большого объема. Приложение, обслуживающее хранилище, может быть быть установлено в сети предприятия. В этой практике используется приложение minio.

 

1) Проверьте установлено ли приложение minio:

 

postgres@tantor:~$ sudo apt-get install minio

Reading package lists... Done

Building dependency tree      

Reading state information... Done

minio is already the newest version (20240321231343.0.0).

0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

 

Приложение установлено.

 

2) Посмотрите содержимое конфигурационного файла minio:

 

postgres@tantor:~$ cat /etc/default/minio

MINIO_ROOT_USER=minioadmin

MINIO_ROOT_PASSWORD=minioadmin

MINIO_VOLUMES="/var/local/minio/disk1"

MINIO_SERVER_URL=http://localhost:9000

 

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

 

3) Запустите службу minio:

 

postgres@tantor:~$ sudo systemctl enable --now minio

Created symlink /etc/systemd/system/multi-user.target.wants/minio.service > /lib/systemd/system/minio.service.

 

4) Запустите браузер и откройте адрес http://127.0.0.1:9000

Введите имя minioadmin и пароль minioadmin

Нажмите кнопу Login и сохраните пароль в браузере.

 

 

5) Создайте корзину (логический контейнер для классификации бэкапов). Нажмите на ссылку Create Bucket или слева в меню выберите Buckets

Введите в поле Bucket Name название bucket1. Нажмите кнопку Create Bucket. Корзина будет создана.

Создавать корзины и давать им названия так чтобы было легко идентифицировать кластер баз данных, который будет резервироваться. Для каждого кластера свою корзину. WAL-G поддерживает backup offloading - резервирование с физической реплики. Для физических реплик создавать отдельные корзины не нужно.

 

6) Этот пункт опционален. Его можно не выполнять, он не требуется для WAL-G. Пункт иллюстириует конфигурирование клиентской утилиты, которая не используется WAL-G. Пункт может быть инетересен тем, что можно получить доступ к тестовому облачному хранилищу minio по адресу https://play.min.io.

 

postgres@tantor:~$  cat << EOF > s3.config

access-key = minioadmin

secret-key = minioadmin

s3-host = localhost

s3-port = 9000

s3-bucket = bucket1

s3-secure = off

EOF

postgres@tantor:~$ sudo chmod 755 /usr/local/bin/mccli

postgres@tantor:~$ /usr/local/bin/mccli alias set local http://127.0.0.1:9000

mccli: Configuration written to `/var/lib/postgresql/.mccli/config.json`. Please update your access credentials.

mccli: Successfully created `/var/lib/postgresql/.mccli/share`.

mccli: Initialized share uploads `/var/lib/postgresql/.mccli/share/uploads.json` file.

mccli: Initialized share downloads `/var/lib/postgresql/.mccli/share/downloads.json` file.

Enter Access Key: minioadmin

Enter Secret Key: minioadmin

Added `local` successfully.

postgres@tantor:~$ cat .mccli/config.json

{

        "version": "10",

        "aliases": {

                "gcs": {

                        "url": "https://storage.googleapis.com",

                        "accessKey": "YOUR-ACCESS-KEY-HERE",

                        "secretKey": "YOUR-SECRET-KEY-HERE",

                        "api": "S3v2",

                        "path": "dns"

                },

                "local": {

                        "url": "http://127.0.0.1:9000",

                        "accessKey": "minioadmin",

                        "secretKey": "minioadmin",

                        "api": "s3v4",

                        "path": "auto"

                },

                "play": {

                        "url": "https://play.min.io",

                        "accessKey": "Q3AM3UQ867SPQQA43P2F",

                        "secretKey": "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG",

                        "api": "S3v4",

                        "path": "auto"

                },

                "s3": {

                        "url": "https://s3.amazonaws.com",

                        "accessKey": "YOUR-ACCESS-KEY-HERE",

                        "secretKey": "YOUR-SECRET-KEY-HERE",

                        "api": "S3v4",

                        "path": "dns"

                }

        }

Можно открыть новую вкладку в браузере и зайти на адрес https://play.min.io

Ввести из файла имя Q3AM3UQ867SPQQA43P2F пароль zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG

На этом сайте можно посмотреть пример работы серверной части minio.

 

 

Часть 2. Установка WAL-G

 

1) Откройте новый терминал и выполните команду:

 

astra@tantor:~$ sudo dpkg -i wal-g-tantor-all_2.0.1-1astra1.7-1_amd64.deb

Выбор ранее не выбранного пакета wal-g-tantor-all.

(Чтение базы данных … на данный момент установлено 211859 файлов и каталогов.)

Подготовка к распаковке wal-g-tantor-all_2.0.1-1astra1.7-1_amd64.deb …

Распаковывается wal-g-tantor-all (2.0.1-1astra1.7-1) …

Настраивается пакет wal-g-tantor-all (2.0.1-1astra1.7-1) …

 

 

Пакет содержит единственный файл /opt/tantor/usr/bin/wal-g

 

2) Проверьте версию WAL-G:

 

astra@tantor:~$ wal-g --version

wal-g version v2.0.1    b7d53dd7        2024.01.12_16:25:53     PostgreSQL

 

3) Посмотрите как называется файл параметров WAL-G и его местоположение:

 

postgres@tantor:~$ wal-g | grep config

      --config string   config file (default is $HOME/.walg.json)

      --turbo           Ignore all kinds of throttling defined in config

 

По умолчанию местоположение файла параметров $HOME/.walg.json.

 

4) Создайте файл параметров WAL-G в домашнем каталоге пользователя операционной системы postgres:

 

postgres@tantor:~$ cat > .walg.json << EOF

{

"AWS_ENDPOINT": "http://127.0.0.1:9000",

"WALG_S3_PREFIX": "s3://bucket1",

"AWS_ACCESS_KEY_ID": "minioadmin",

"AWS_SECRET_ACCESS_KEY": "minioadmin",

"AWS_S3_FORCE_PATH_STYLE": "true",

"WALG_COMPRESSION_METHOD": "brotli",

"WALG_DELTA_MAX_STEPS": "5",

"PGDATA": "/var/lib/postgresql/tantor-se-16/data",

"PGHOST": "/var/run/postgresql"

}

EOF

 

5) Проверьте, что утилита командной строки wal-g может подсоединяться к серверу по протокуолу S3. Для этого проверьте список бэкапов:

 

postgres@tantor:~$ wal-g backup-list

INFO: 2024/07/04 15:51:48.707457 No backups found

 

Если корзина не существует, то будет выдана ошибка. Пример ошибки:

ERROR: 2024/07/04 15:43:19.396870 failed to list s3 folder: 'basebackups_005/': NoSuchBucket: The specified bucket does not exist

        status code: 404, request id: 17DF031B83CC101C, host id: dd9025bab4ad464b049177c95eb6ebf374d3b3fd1af9251148b658df7ac2e3e8

 

6) Посмотрите какие wal сегменты есть у кластера:

 

postgres@tantor:~$ ls $PGDATA/pg_wal

000000010000000000000019  archive_status

 

7) Посмотрим какой командой передаются WAL-сегменты.

Выполните команду, передав в качестве параметра имя файла WAL-сегмента:

 

postgres@tantor:~$ wal-g wal-push $PGDATA/pg_wal/000000010000000000000019

INFO: 2024/07/04 15:56:05.009296 FILE PATH: 000000010000000000000019.br

 

8) Утилита не удаляет то, что бэкапит. Проверьте, что исходный файл не был удалён:

 

postgres@tantor:~$ ls $PGDATA/pg_wal

000000010000000000000019  archive_status  walg_data

 

В директории журналов была создана поддиректория walg_data/walg_archive_status

 

9) Выполните команду:

 

postgres@tantor:~$ wal-g backup-list

INFO: 2024/07/04 16:01:30.875297 No backups found

 

Бэкапов кластера не найдено, так как мы их пока не делеали.

 

10) Выполните команды:

postgres@tantor:~$ wal-g wal-show

INFO: 2024/07/04 16:02:11.822601 No backups found in storage.

+-----+------------+-----------------+------------------------+------------------------+-------------

| TLI | PARENT TLI | SWITCHPOINT LSN | START SEGMENT          | END SEGMENT            | SEGMENT RANGE | SEGMENTS COUNT | STATUS | BACKUPS COUNT |

+-----+------------+-----------------+------------------------+------------------------+-------------

|   1 |          0 |             0/0 |000000010000000000000019|000000010000000000000019|             1 |

             1 |     OK |             0 |

+-----+------------+-----------------+------------------------+------------------------+-------------

 

postgres@tantor:~$ wal-g wal-verify  timeline

WARNING: 2024/07/04 16:03:17.728025 It seems your archive_mode is not enabled. This will cause inconsistent backup. Please consider configuring WAL archiving.

INFO: 2024/07/04 16:03:17.750944 000000010000000000000019

INFO: 2024/07/04 16:03:17.762117 Building check runner: timeline

INFO: 2024/07/04 16:03:17.762253 Running the check: timeline

[wal-verify] timeline check status: OK

[wal-verify] timeline check details:

Highest timeline found in storage: 1

Current cluster timeline: 1

 

postgres@tantor:~$ wal-g wal-verify integrity

WARNING: 2024/07/04 16:03:43.575246 It seems your archive_mode is not enabled. This will cause inconsistent backup. Please consider configuring WAL archiving.

INFO: 2024/07/04 16:03:43.579362 Current WAL segment: 000000010000000000000019

INFO: 2024/07/04 16:03:43.586333 Building check runner: integrity

WARNING: 2024/07/04 16:03:43.604241 Failed to detect earliest backup WAL segment no: 'No backups found',will scan until the 0000000X0000000000000001 segment.

INFO: 2024/07/04 16:03:43.604378 Running the check: integrity

[wal-verify] integrity check status: WARNING

[wal-verify] integrity check details:

+-----+--------------------------+--------------------------+----------------+-------------------+

| TLI | START                    | END                      | SEGMENTS COUNT |            STATUS |

+-----+--------------------------+--------------------------+----------------+-------------------+

|   1 | 000000010000000000000001 | 000000010000000000000008 |              8 |      MISSING_LOST |

|   1 | 000000010000000000000009 | 000000010000000000000018 |             16 | MISSING_UPLOADING |

+-----+--------------------------+--------------------------+----------------+-------------------+

 

Часть 3. Конфигурирование кластера для архивирования журналов

 

1) Запустите psql и установите значения параметров конфигурации:

 

postgres@tantor:~$ psql

psql (16.1)

Type "help" for help.

postgres=# alter system set archive_command = '/opt/tantor/usr/bin/wal-g wal-push "%p" >> $PGDATA/log/archive_command.log 2>&1';

ALTER SYSTEM

postgres=# alter system set restore_command = '/opt/tantor/usr/bin/wal-g wal-fetch "%f" "%p" >> $PGDATA/log/restore_command.log 2>&1';

ALTER SYSTEM

postgres=# alter system set archive_mode=on;

ALTER SYSTEM

 

Параметр archive_command устанавливает команду, которая будет выполняться после переключения на следующий WAL-сегмент. Команда должна завешаться успешно (возвращать статус "0"), иначе сегмент будет считаться не зарархивированным и не сможет удаляться. %p - переменная которая инициализируется названием и путём к WAL-сегменту в который завершена запись и который должен быть заархивированообщения утилиты которые она выводит в stdout и stderr направляются в файл.

 

Параметр restore_command указывает какая команда будет выполнена процессом startup, который восстанавливает кластер после запуска экземпляра и определяет по файлу backup_label или pg_colntrol какой WAL-сегмент нужен для продолжения восстановления (будет накатываться следующим). Эта команда должна создать WAL-файл в директории $PGDATA/pg_wal

 

Параметр archive_mode включает действие параметра  archive_command.

У этого параметра есть еще значение always, что означает что archive_command будет выполняться и во время восстановления из бэкапа и в режиме физической реплики.

 

Утилита wal-g использует файл параметров $HOME/.walg.json. Если нужно иметь несколько файлов параметров, то можно использовать параметр --config. Пример:

alter system set archive_command = '/opt/tantor/usr/bin/wal-g --config /var/lib/postgresql/.walg.json wal-push "%p" >> $PGDATA/log/archive_command.log 2>&1';

 

2)  Перезапустите экземпляр:

 

postgres@tantor:~$ pg_ctl stop

postgres@tantor:~$ sudo systemctl start tantor-se-server-16

 

3)  Проверьте, что в директории журналов появилась поддиректория archive_status:

 

postgres@tantor:~$ ls -a $PGDATA/pg_wal/archive_status

.  ..  00000001000000000000001A.done

 

В директории присутствует пустой файл.

 

 

4) Проверьте, что появился файл archive_command.log путь к которому был указан в параметре archive_command:

 

postgres@tantor:~$ cat $PGDATA/log/archive_command.log

INFO: 2024/07/04 16:34:37.373971 FILE PATH: 00000001000000000000001A.br

 

Если файл не появился и опечаток нет, это может означать, что экземпляр не был остановлен, а был перезапущен опцией restart (процесс postgres не выгружался из памяти).

 

5)  Выполните команду:

postgres@tantor:~$ wal-g wal-verify integrity

INFO: 2024/07/04 16:43:29.235139 Current WAL segment: 00000001000000000000001B

INFO: 2024/07/04 16:43:29.244838 Building check runner: integrity

WARNING: 2024/07/04 16:43:29.266445 Failed to detect earliest backup WAL segment no: 'No backups found',will scan until the 0000000X0000000000000001 segment.

INFO: 2024/07/04 16:43:29.266730 Running the check: integrity

[wal-verify] integrity check status: WARNING

[wal-verify] integrity check details:

+-----+--------------------------+--------------------------+----------------+-------------------+

| TLI | START                    | END                      | SEGMENTS COUNT |            STATUS |

+-----+--------------------------+--------------------------+----------------+-------------------+

|   1 | 000000010000000000000001 | 00000001000000000000000A |             10 |      MISSING_LOST |

|   1 | 00000001000000000000000B | 000000010000000000000018 |             14 | MISSING_UPLOADING |

|   1 | 000000010000000000000019 | 00000001000000000000001A |              2 |             FOUND |

+-----+--------------------------+--------------------------+----------------+-------------------+

 

Файлы журнала  были заархивированы.

 

6)  Зарезервируйте директорию кластера. WAL-G запускается на хосте с кластером, поэтому можно не пользоваться протоколом репликации, а копировать содержимое директории.

Для этого передать в качестве параметра название директории кластера:

 

postgres@tantor:~$ wal-g backup-push $PGDATA

INFO: 2024/07/04 16:45:29.484805 Couldn't find previous backup. Doing full backup.

INFO: 2024/07/04 16:45:29.514046 Calling pg_start_backup()

INFO: 2024/07/04 16:45:29.630427 Starting a new tar bundle

INFO: 2024/07/04 16:45:29.630574 Walking ...

INFO: 2024/07/04 16:45:29.632062 Starting part 1 ...

INFO: 2024/07/04 16:45:35.436669 Packing ...

INFO: 2024/07/04 16:45:35.439440 Finished writing part 1.

INFO: 2024/07/04 16:45:35.814169 Starting part 2 ...

INFO: 2024/07/04 16:45:35.814216 /global/pg_control

INFO: 2024/07/04 16:45:35.816267 Finished writing part 2.

INFO: 2024/07/04 16:45:35.816305 Calling pg_stop_backup()

INFO: 2024/07/04 16:45:35.864195 Starting part 3 ...

INFO: 2024/07/04 16:45:35.868956 backup_label

INFO: 2024/07/04 16:45:35.869596 tablespace_map

INFO: 2024/07/04 16:45:35.871637 Finished writing part 3.

INFO: 2024/07/04 16:45:35.989039 Wrote backup with name base_00000001000000000000001C

 

В начале резервирования при вызове функции pg_start_backup() была выполнена контрольная точка в режиме immediate force wait

 

postgres@tantor:~/tantor-se-16/data/log$ tail -n 2 postgresql-2024-07-04_163447.log

2024-07-04 16:45:29.581 MSK [2973] LOG:  checkpoint starting: immediate force wait

2024-07-04 16:45:29.625 MSK [2973] LOG:  checkpoint complete: wrote 0 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.001 s, sync=0.001 s, total=0.045 s; sync files=0, longest=0.000 s, average=0.000 s; distance=16383 kB, estimate=16383 kB; lsn=0/1C000070, redo lsn=0/1C000028

 

 

7)  Проверьте, что созданный бэкап есть в списке:

 

postgres@tantor:~$ wal-g backup-list

name                          modified             wal_segment_backup_start

base_00000001000000000000001C 2024-07-04T13:45:35Z 00000001000000000000001C

 

 

Если при резервировании указать произвольную директорию, а не директорию кластера выдастся ошибка:

 

postgres@tantor:~$ wal-g backup-push abcd

WARNING: 2024/07/04 16:54:15.130694 Data directory for postgres 'abcd' is not equal to backup-push argument '/var/lib/postgresql/tantor-se-16/data'

ERROR: 2024/07/04 16:54:15.131420 Data directory read from Postgres (abcd) is different than as parsed (/var/lib/postgresql/tantor-se-16/data).

panic: Data directory read from Postgres (abcd) is different than as parsed (/var/lib/postgresql/tantor-se-16/data).

Интуитивно не понятно, что обозначается "Postgres" и "parsed", вероятно, директории перепутаны местами.

 

Для просмотра бэкапов через веб-интерфейс нужно на странице корзины кликнуть на иконку папки спрва вверху окна браузера:

 

8)  В директории pg_wal появился файл:

 

 

postgres@tantor:~$ ls  $PGDATA/pg_wal/

00000001000000000000001C.00000028.backup  00000001000000000000001E  archive_status

00000001000000000000001D                  00000001000000000000001F  walg_data

 

postgres@tantor:~$ cat $PGDATA/pg_wal/*.backup

START WAL LOCATION: 0/1C000028 (file 00000001000000000000001C)

STOP WAL LOCATION: 0/1C000130 (file 00000001000000000000001C)

CHECKPOINT LOCATION: 0/1C000070

BACKUP METHOD: streamed

BACKUP FROM: primary

START TIME: 2024-07-04 16:45:29 MSK

LABEL: 2024-07-04 16:45:29.514037 +0300 MSK m=+0.118109848

START TIMELINE: 1

STOP TIME: 2024-07-04 16:45:35 MSK

STOP TIMELINE: 1

 

Часть 4. Восстановление из бэкапа созданного WAL-G

 

В конфигурации есть физическая реплика. Проверьте, что слот репликации используется:

 

postgres=# select * from pg_stat_replication\gx

-[ RECORD 1 ]----+------------------------------

pid              | 2981

usesysid         | 16384

usename          | replicator

application_name | walreceiver

client_addr      | ::1

client_hostname  |

client_port      | 41306

backend_start    | 2024-07-04 16:34:47.297025+03

backend_xmin     |

state            | streaming

sent_lsn         | 0/1D000198

write_lsn        | 0/1D000198

flush_lsn        | 0/1D000198

replay_lsn       | 0/1D000198

write_lag        |

flush_lag        |

replay_lag       |

sync_priority    | 0

sync_state       | async

reply_time       | 2024-07-04 17:04:43.201876+03

 

postgres=# select * from pg_replication_slots \gx

-[ RECORD 1 ]-------+-----------

slot_name           | pgstandby1

plugin              |

slot_type           | physical

datoid              |

database            |

temporary           | f

active              | t

active_pid          | 2981

xmin                |

catalog_xmin        |

restart_lsn         | 0/1D000198

confirmed_flush_lsn |

wal_status          | reserved

safe_wal_size       | 1090518632

two_phase           | f

conflicting         |

 

 

2) Если предыдущая часть этой практики была успешно выполнена, то есть архивирование журналов выполнялось, бэкап был сделан, то остановите кластер и удалите директорию PGDATA:

 

postgres@tantor:~$ pg_ctl stop

waiting for server to shut down.... done

server stopped

postgres@tantor:~$ rm -rf $PGDATA/*

 

Команда симулирует полную потерю мастера ("disaster") Команда удаляет в том числе и текущий WAL-сегмент, который не был записан в архив. Транзакции, которые находятся в этом файле не будут восстановлены.

 

2)  Выполните команду восставновления директории кластера из бэкапа:

 

postgres@tantor:~$ wal-g backup-fetch $PGDATA LATEST

INFO: 2024/07/04 17:09:21.604287 Selecting the latest backup...

INFO: 2024/07/04 17:09:21.608464 LATEST backup is: 'base_00000001000000000000001C'

INFO: 2024/07/04 17:09:21.648710 Finished extraction of part_003.tar.br

INFO: 2024/07/04 17:09:28.920711 Finished extraction of part_001.tar.br

INFO: 2024/07/04 17:09:28.926843 Finished extraction of pg_control.tar.br

INFO: 2024/07/04 17:09:28.927310

Backup extraction complete.

 

Директория восстановлена.

 

3) Проверьте содержимое директории журналов:

 

postgres@tantor:~$ ls $PGDATA/pg_wal

 

Директория пуста.

 

4) Посмотрите содержимое управляющего файла:

 

postgres@tantor:~$ pg_controldata

pg_control version number:            1300

Catalog version number:               202307071

Database system identifier:           7353194261070147214

Database cluster state:               in production

pg_control last modified:             Thu 04 Jul 2024 04:45:29 PM MSK

Latest checkpoint location:           0/1C000070

Latest checkpoint's REDO location:    0/1C000028

Latest checkpoint's REDO WAL file:    00000001000000000000001C

Latest checkpoint's TimeLineID:       1

Latest checkpoint's PrevTimeLineID:   1

Latest checkpoint's full_page_writes: on

Latest checkpoint's NextXID:          764

Latest checkpoint's NextOID:          16529

Latest checkpoint's NextMultiXactId:  1

Latest checkpoint's NextMultiOffset:  0

Latest checkpoint's oldestXID:        723

Latest checkpoint's oldestXID's DB:   1

Latest checkpoint's oldestActiveXID:  764

Latest checkpoint's oldestMultiXid:   1

Latest checkpoint's oldestMulti's DB: 1

Latest checkpoint's oldestCommitTsXid:0

Latest checkpoint's newestCommitTsXid:0

Time of latest checkpoint:            Thu 04 Jul 2024 04:45:29 PM MSK

Fake LSN counter for unlogged rels:   0/3E8

Minimum recovery ending location:     0/0

Min recovery ending loc's timeline:   0

Backup start location:                0/0

Backup end location:                  0/0

End-of-backup record required:        no

wal_level setting:                    replica

wal_log_hints setting:                off

max_connections setting:              100

max_worker_processes setting:         8

max_wal_senders setting:              10

max_prepared_xacts setting:           0

max_locks_per_xact setting:           64

track_commit_timestamp setting:       off

Maximum data alignment:               8

Database block size:                  8192

Blocks per segment of large relation: 131072

WAL block size:                       8192

Bytes per WAL segment:                16777216

Maximum length of identifiers:        64

Maximum columns in an index:          32

Maximum size of a TOAST chunk:        1996

Size of a large-object chunk:         2048

Date/time type storage:               64-bit integers

Float8 argument passing:              by value

Data page checksum version:           0

Mock authentication nonce:            5c6cff5b22f9ce01ca3ad035abc27d15de5499782456494a5dbc7016b5fdc3a9

 

Управляющий файл - образ того который существовал на момент резервирования.

На это указывают строки:

Database cluster state:               in production

pg_control last modified:             Thu 04 Jul 2024 04:45:29 PM MSK

 

5)  Вместо управляющего файла будет использоваться backup_label

Посмотрите что он присутствует и не пуст:

postgres@tantor:~$ cat $PGDATA/backup_label

START WAL LOCATION: 0/1C000028 (file 00000001000000000000001C)

CHECKPOINT LOCATION: 0/1C000070

BACKUP METHOD: streamed

BACKUP FROM: primary

START TIME: 2024-07-04 16:45:29 MSK

LABEL: 2024-07-04 16:45:29.514037 +0300 MSK m=+0.118109848

START TIMELINE: 1

 

6) Попробуйте запустить экземпляр:

 

postgres@tantor:~$ pg_ctl start

waiting for server to start....

2024-07-04 17:16:12.130 MSK [3368] СООБЩЕНИЕ:  передача вывода в протокол процессу сбора протоколов

2024-07-04 17:16:12.130 MSK [3368] ПОДСКАЗКА:  В дальнейшем протоколы будут выводиться в каталог "log".

 stopped waiting

pg_ctl: could not start server

Examine the log output.

 

Экземпляр не смог запуститься, нет журналов для синхронизации файлов кластера, так как в директории pg_wal нет ни одного файла журнала.

 

7) Создайте файл, который укажет, что выполняется восстановление из бэкапа:

 

postgres@tantor:~$ touch $PGDATA/recovery.signal

 

8) Запустите экземпляр:

 

postgres@tantor:~$ pg_ctl start

waiting for server to start....

2024-07-04 17:21:25.081 MSK [3445] СООБЩЕНИЕ:  передача вывода в протокол процессу сбора протоколов

2024-07-04 17:21:25.081 MSK [3445] ПОДСКАЗКА:  В дальнейшем протоколы будут выводиться в каталог "log".

. done

server started

 

Кластер был восстановлен и экземпляр запущен. Последний примененный журнальный файл тот, который был заархивирован. Было выполнено неполное восстановление.

Журнальные файлы, которые не попали в архив не были применены и транзакции которые могли бы в них быть были потеряны.

 

9) Посмотрите содержимое директории с журналами:

 

postgres@tantor:~$ ls -a $PGDATA/pg_wal

.   00000002000000000000001E  000000020000000000000020  archive_status  walg_data

..  00000002000000000000001F  00000002.history          .wal-g

 

Директория непустая. Была создана новая линия времени.

Помимо прочего, появились файл 0000002.history и пустая директория .wal-g/prefetch/running

 

10) Проверьте, что слоты репликации, которые существовали в начале этой части практики были удалены:

 

postgres@tantor:~$ psql

psql (16.1)

Type "help" for help.

 

postgres=# select * from pg_stat_replication\gx

(0 rows)

 

postgres=# select * from pg_replication_slots \gx

(0 rows)

 

Причина: неполное восстановление.

 

 

Часть 5. Использование WAL-G с файловой системой

 

 

WAL-G кроме использования протокола S3 может резервировать и восстанавливать из директории в файловой системе. Директория не обязательно на локальном диске, можно смонтировать любую файловую систему, например, NFS.

 

1) Создайте файл параметров WAL-G:

 

postgres@tantor:~$ cat > /var/lib/postgresql/.walgf.json <<EOF

{

    "WALG_FILE_PREFIX": "/var/lib/postgresql/tantor-se-16",

    "WALG_COMPRESSION_METHOD": "brotli",

    "WALG_DELTA_MAX_STEPS": "5",

    "PGHOST": "/var/run/postgresql/.s.PGSQL.5432",

    "PGDATA": "/var/lib/postgresql/tantor-se-server-15/main/$(cat /etc/hostname)"

}

EOF

 

Резервирование будет выполняться в директорию, на которую указывает ключ WALG_FILE_PREFIX

 

2) Создайте бэкап, выполнив команду:

 

postgres@tantor:~$ wal-g --config /var/lib/postgresql/.walgf.json backup-push $PGDATA

INFO: 2024/07/04 18:38:13.859671 Couldn't find previous backup. Doing full backup.

INFO: 2024/07/04 18:38:13.884199 Calling pg_start_backup()

INFO: 2024/07/04 18:38:13.937985 Starting a new tar bundle

INFO: 2024/07/04 18:38:13.938445 Walking ...

INFO: 2024/07/04 18:38:13.939263 Starting part 1 ...

INFO: 2024/07/04 18:38:16.984992 Packing ...

INFO: 2024/07/04 18:38:16.987214 Finished writing part 1.

INFO: 2024/07/04 18:38:16..987498 Starting part 2 ...

INFO: 2024/07/04 18:38:16.987877 /global/pg_control

INFO: 2024/07/04 18:38:16.988634 Finished writing part 2.

INFO: 2024/07/04 18:38:16.988737 Calling pg_stop_backup()

INFO: 2024/07/04 18:38:17.021268 Starting part 3 ...

INFO: 2024/07/04 18:38:17.022452 backup_label

INFO: 2024/07/04 18:38:17.022772 tablespace_map

INFO: 2024/07/04 18:38:17.023600 Finished writing part 3.

INFO: 2024/07/04 18:38:17.039974 Wrote backup with name base_00000002000000000000001F

 

3) Посомтрите какие директории и файлы были созданы:

 

postgres@tantor:~$ ls -a /var/lib/postgresql/tantor-se-16

.  ..  basebackups_005  data

postgres@tantor:~$ ls -a /var/lib/postgresql/tantor-se-16/basebackups_005

.   base_00000002000000000000001F

..  base_00000002000000000000001F_backup_stop_sentinel.json

postgres@tantor:~$ wal-g --config /var/lib/postgresql/.walgf.json backup-push $PGDATA

INFO: 2024/07/04 18:49:13.386080 LATEST backup is: 'base_00000002000000000000001F'

INFO: 2024/07/04 18:49:13.386934 Delta backup from base_00000002000000000000001F with LSN 0/1F000028.

INFO: 2024/07/04 18:49:13.430095 Calling pg_start_backup()

INFO: 2024/07/04 18:49:13.492602 Delta backup enabled

INFO: 2024/07/04 18:49:13.492820 Starting a new tar bundle

INFO: 2024/07/04 18:49:13.493022 Walking ...

INFO: 2024/07/04 18:49:13.493596 Starting part 1 ...

INFO: 2024/07/04 18:49:13.536216 Packing ...

INFO: 2024/07/04 18:49:13.541442 Finished writing part 1.

INFO: 2024/07/04 18:49:13.541661 Starting part 2 ...

INFO: 2024/07/04 18:49:13.541839 /global/pg_control

INFO: 2024/07/04 18:49:13.543270 Finished writing part 2.

INFO: 2024/07/04 18:49:13.543529 Calling pg_stop_backup()

INFO: 2024/07/04 18:49:13.590353 Starting part 3 ...

INFO: 2024/07/04 18:49:13.590899 backup_label

INFO: 2024/07/04 18:49:13.591465 tablespace_map

INFO: 2024/07/04 18:49:13.592343 Finished writing part 3.

INFO: 2024/07/04 18:49:13.598641 Wrote backup with name base_000000020000000000000021_D_00000002000000000000001F

postgres@tantor:~$ ls -a /var/lib/postgresql/tantor-se-16/basebackups_005

.

..

base_00000002000000000000001F

base_00000002000000000000001F_backup_stop_sentinel.json

base_000000020000000000000021_D_00000002000000000000001F

base_000000020000000000000021_D_00000002000000000000001F_backup_stop_sentinel.json

 

Часть 6. Остановка архивирования журналов

 

1) Выполните команды:

postgres@tantor:~ $ rm -rf /var/lib/postgresql/tantor-se-16/basebackups_005

postgres@tantor:~ $ psql -c "alter system set archive_mode = off;"

ALTER SYSTEM

postgres@tantor:~ $ pg_ctl stop

waiting for server to shut down.... done

server stopped

postgres@tantor:~ $ sudo systemctl start tantor-se-server-16

postgres@tantor:~$ sudo systemctl stop tantor-se-server-16-replica

 

Значение параметра archive_mode = off отключает резервирование WAL-сегментов.