Создание физической реплики из базовой резервной копии

«Пост-Грэс-Кью-Эл» свободная объектно-реляционная СУБД. Обмениваемся вопросами и ответами о её работе.
Ответить
AntonS
Сообщения: 116
Зарегистрирован: Пт июн 03, 2022 8:51 am

Создание физической реплики из базовой резервной копии

Сообщение AntonS »

Создание физической реплики подробно рассматривается в курсе Администрирование PostgreSQL 13. Резервное копирование и репликация, далее приведён необходимый минимум команд для создания ведомого сервера БД PostgreSQL (standby-БД) из базовой резервной копии.

Создание слота для репликации #под суперпользователем postgres

Код: Выделить всё

SELECT pg_create_physical_replication_slot('replica');
 pg_create_physical_replication_slot
-------------------------------------
 (replica,)
(1 row)
Добавление прав пользователю, под которым будет выполняться репликация

Код: Выделить всё

DO
$$
BEGIN
	IF EXISTS (SELECT 1 FROM pg_user WHERE usename='student') THEN
		RAISE NOTICE 'Role already exists';
	ELSE
		CREATE ROLE student WITH LOGIN;
	END IF;
END
$$;
ALTER ROLE student WITH createdb;
ALTER ROLE student WITH createrole;
ALTER ROLE student WITH replication;
GRANT pg_read_all_stats TO student;
Создание рабочего каталога для новой базы данных #от имени sudo и root

mkdir /var/lib/postgresql/beta
chown postgres:postgres /var/lib/postgresql/beta
chmod 700 /var/lib/postgresql/beta

Создание базовой резервной копии для новой реплики #под пользователм student
mkdir /home/student/backup
pg_basebackup --pgdata=/home/student/backup -R --slot=replica --progress
353087/353087 kB (100%), 1/1 tablespace

Представление pg_replication_slots показывает, что слот репликации получил явное значение restart_lsn записи wal журнала с которой начнется репликация:

Код: Выделить всё

SELECT * FROM pg_replication_slots \gx
postgres=# SELECT * FROM pg_replication_slots \gx
-[ RECORD 1 ]-------+-----------
slot_name           | replica
plugin              |
slot_type           | physical
datoid              |
database            |
temporary           | f
active              | f
active_pid          |
xmin                |
catalog_xmin        |
restart_lsn         | 0/4B000000
confirmed_flush_lsn |
wal_status          | reserved
safe_wal_size       |
two_phase           | f
conflicting         |
Копирование базовой резервной копии и настройка прав #от имени sudo и root

Код: Выделить всё

rm -rf /var/lib/postgresql/beta/*
cp -R /home/student/backup/* /var/lib/postgresql/beta
chown -R postgres:postgres /var/lib/postgresql/beta
Утилита pg_basebackup создает в рабочем каталоге файл standby.signal и добавляет настройки для репликации в postgresql.auto.conf

Код: Выделить всё

-bash-4.4$ ls -l /var/lib/postgresql/beta/standby.signal
-rw------- 1 postgres postgres 0 Jan  5 21:31 /var/lib/postgresql/beta/standby.signal
-bash-4.4$ cat /var/lib/postgresql/beta/postgresql.auto.conf 
# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
primary_conninfo = 'user=student reusepass=1 passfile=''/home/student/.pgpass'' channel_binding=prefer port=5432 sslmode=prefer sslcompression=0 sslcertmode=allow sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres gssdelegation=0 target_session_attrs=any target_server_type=any hostorder=sequential load_balance_hosts=disable'
primary_slot_name = 'replica'
Настройка порта и запуск реплики #от имени postgres

В файле /var/lib/postgresql/beta/postgresql.conf для новой БД указать номер порта port=5433 отличный от мастера параметр поскольку обе базы данных запускаются на одном Linux

Чтобы не задавать пароль пользователя в /home/student/.pgpass', на тестовом сервере возможно отключить запрос пароля, отредактировав секцию репликации файла pg_hba.conf реплики:

Код: Выделить всё

local   replication     all     trust 
Запуск реплики:

Код: Выделить всё

-bash-4.4$ pg_ctl start -D /var/lib/postgresql/beta
2025-01-05 21:36:17.044 MSK [7413] LOG:  redirecting log output to logging collector process
2025-01-05 21:36:17.044 MSK [7413] HINT:  Future log output will appear in directory "log"
В серверном логе реплики должна появиться запись:

Код: Выделить всё

2025-01-05 21:50:35.626 MSK [10220] LOG:  started streaming WAL from primary at 0/4C000000 on timeline 1
Подключаемся к базе реплики. Функция pg_is_in_recovery показывает режим восстановления:

Код: Выделить всё

postgres=# SELECT pg_is_in_recovery();
 pg_is_in_recovery
-------------------
 t
(1 row)
Снова подключаемся к базе мастера, чтобы убедиться, что слот репликации на мастере продвигает значение restart_lsn по мере применения записей wal журнала на реплике:

Код: Выделить всё

postgres=# SELECT * FROM pg_replication_slots \gx
-[ RECORD 1 ]-------+-----------
slot_name           | replica
plugin              |
slot_type           | physical
datoid              |
database            |
temporary           | f
active              | t
active_pid          | 10222
xmin                |
catalog_xmin        |
restart_lsn         | 0/4C538B68
confirmed_flush_lsn |
wal_status          | reserved
safe_wal_size       |
two_phase           | f
conflicting         |
Ответить