Физическая репликация

Физическая репликация основана на непрерывной передаче записей журнала предзаписи (WAL) с мастер-сервера на реплику. Сервер-реплика создается как физическая копия мастера, например, с помощью утилиты pg_basebackup. Для перехода в режим постоянного восстановления в каталоге данных (PGDATA) реплики размещается пустой файл standby.signal, а строка подключения к мастеру настраивается параметром primary_conninfo.
Принцип работы репликации:
- На мастере процесс
walsenderпередает по протоколу репликации записи WAL в потоковом режиме. - На реплике процесс
walreceiverполучает записи WAL, а процессstartupприменяет их в режиме непрерывного восстановления — аналогично восстановлению после сбоя, но без завершения работы. - Мастер должен разрешать подключения по протоколу репликации, что настраивается в файле
pg_hba.conf. - Параметр
wal_levelна мастере должен быть установлен в значениеreplica(по умолчанию).
Операции на реплики
Участие реплики в обработке клиентских запросов определяется параметром hot_standby, который по умолчанию включен. Если параметр отключен, реплика работает только в режиме непрерывного восстановления и не принимает клиентские подключения.
Разрешенные операции:
- читающие запросы (
SELECT,COPY TO); - читающие транзакции (
BEGIN,COMMIT,ROLLBACK); - установка и сброс сессионных параметров (
SET,RESET); - резервное копирование (логическое и физическое).
Запрещенные операции:
- пишущие запросы (
INSERT,UPDATE,DELETEи подобные); - команды DDL (
CREATE,DROP,ALTERи подобные); - операции обслуживания (
VACUUM,ANALYZE,REINDEXи подобные); - команды управления доступом (
GRANT,REVOKE).
Процессы на мастере и реплике
Поскольку мастер-сервер и сервер-реплика выполняют разные задачи, на них запускаются различные наборы процессов.
Процессы на мастере:
walwriter— помещает записи WAL из кеша в файлы сегментов журнала предзаписи. На реплике этот процесс не работает, так как реплика получает записи WAL из потока;autovacuum— выполняет автоочистку. На реплике автоочистка не выполняется;walsender— передает поток репликации на реплику. В обычной топологии работает только на мастере, однако при каскадной репликации может запускаться и на реплике, передавая WAL дальше.
Процессы на реплике:
walreceiver— принимает записи WAL из потока репликации с мастера;startup— применяет полученные записи WAL в режиме непрерывного восстановления.
Настройка мастера
Перед созданием сервера-реплики необходимо убедиться, что мастер-сервер корректно настроен для передачи WAL. Проверка включает два этапа: валидация параметров WAL и проверка правил аутентификации для подключений репликации.
Проверим параметры max_wal_senders и wal_level, используя команду \dconfig с маской в оболочке psql.
[postgres@ServerName ~]$ psql -c '\dconfig (max_wal_se|wal_lev)*'
Разбор команды
\dconfig— служебная командаpsqlдля просмотра параметров конфигурации сервера;- маска
(max_wal_se|wal_lev)*— регулярное выражение, фильтрующее параметры, имена которых начинаются наmax_wal_seилиwal_lev.
List of configuration parameters
Parameter | Value
-----------------+---------
max_wal_senders | 10
wal_level | replica
(2 rows)
Параметр max_wal_senders равен 10, что допускает до 10 одновременных подключений репликации. Параметр wal_level установлен в значение replica — необходимое условие для физической репликации.
Проверим правила аутентификации для подключений репликации в файле pg_hba.conf, обратившись к функции pg_hba_file_rules().
[postgres@ServerName ~]$ psql -c "SELECT type,user_name,address,auth_method FROM pg_hba_file_rules() WHERE 'replication'=ANY(database)"
Разбор команды
- функция
pg_hba_file_rules()возвращает правила аутентификации из файлаpg_hba.confв виде строк таблицы; - выражение
'replication' = ANY(database)отбирает правила, где в столбце баз данных указаноreplication; - поле
databaseсодержит массив значений, поэтому применяется операторANY, гарантирующий, что в результат попадет конфигурация исключительно для репликационных соединений.
type | user_name | address | auth_method
-------+-----------+-----------+---------------
local | {all} | | peer
host | {all} | 127.0.0.1 | scram-sha-256
host | {all} | ::1 | scram-sha-256
(3 rows)
Существуют три правила, разрешающих подключения репликации. При подключении через локальный Unix-сокет (local) применяется метод peer — аутентификация средствами ОС: роль в базе данных должна называться так же, как пользователь операционной системы, и пароль не требуется. При подключении по сети через localhost (127.0.0.1 или ::1) используется метод scram-sha-256 — аутентификация по паролю средствами СУБД.
Подготовка реплики
Для создания сервера-реплики необходимо выполнить физическое копирование данных с мастера. Реплика создается как точная копия мастер-сервера с использованием утилиты pg_basebackup. Все операции выполняются от пользователя postgres — владельца каталога данных.
Определим текущий каталог.
[postgres@ServerName ~]$ pwd
/var/lib/postgres
Домашний каталог пользователя postgres расположен по пути /var/lib/postgres. В нем создаем каталог для данных реплики.
[postgres@ServerName ~]$ mkdir rpl_pgdata
Выполним базовое резервное копирование с мастера в созданный каталог. Данная команда создаст полную физическую копию базы данных и подготовит каталог к работе в режиме репликации.
[postgres@ServerName ~]$ pg_basebackup -D rpl_pgdata/ -c fast -R -T /pgdata/06/newdisk=/home/postgres/newdisk-2
Разбор команды
pg_basebackup— утилита для создания полной физической копии сервера;- опция
-D rpl_pgdata/— путь к каталогу, в который будет скопирована база данных; - опция
-c fast— фиксация начала резервной копии через быстрое подключение; - опция
-R— создание файлаstandby.signalи запись параметраprimary_conninfoвpostgresql.auto.confдля автоматической настройки репликации.
Проверим содержимое созданного каталога.
[postgres@ServerName ~]$ ls rpl_pgdata/
backup_label pg_hba.conf.orig pg_quota.conf PG_VERSION
backup_manifest pg_ident.conf pg_replslot pg_wal
base pg_integrity pg_serial pg_xact
current_logfiles pg_logical pg_snapshots postgresql.auto.conf
global pg_multixact pg_stat postgresql.conf
pg_commit_ts pg_notify pg_stat_tmp postgresql.conf.bak
pg_dynshmem pg_perf_insights pg_subtrans PRODUCT_VERSION
pg_hba.conf pg_pp_cache pg_tblspc standby.signal
pg_hba.conf.bak pg_prep_stats pg_twophase tracing
Каталог rpl_pgdata содержит полную копию данных мастера. Присутствие файла standby.signal подтверждает, что опция -R сработала корректно: при запуске сервер перейдет в режим реплики. В файле postgresql.auto.conf записана строка подключения к мастеру (primary_conninfo).
Если на мастере был создан слот репликации, к команде pg_basebackup необходимо добавить опцию -S <имя_слота>. Тогда в postgresql.auto.conf будет записан также параметр primary_slot_name. Использование слота репликации гарантирует, что мастер не удаляет сегменты WAL, необходимые реплике.
Настройка реплики
Каталог данных реплики, созданный утилитой pg_basebackup, содержит копию файлов конфигурации мастера. Если реплика запускается на том же хосте, что и мастер, необходимо изменить параметры, конфликтующие с мастер-сервером: номер TCP-порта и пути к журналам.
Для запуска экземпляра сервера права на каталог PGDATA должны быть 700 (drwx------) или 750 (drwxr-x---). Установим корректные права рекурсивно и перейдем в каталог реплики.
[postgres@ServerName ~]$ chmod -R go= rpl_pgdata/; cd rpl_pgdata/
Разбор командыы
chmod -R go=— рекурсивное удаление всех прав для группы (g) и остальных пользователей (o), оставляя права только владельцу;cd rpl_pgdata/— переход в каталог данных реплики для выполнения последующих операций.
Реплика по умолчанию прослушивает порт TCP 5432 — тот же, что и мастер. Для одновременной работы двух экземпляров на одном хосте назначим реплике порт 6432. Добавим настройку в файл postgresql.auto.conf.
[postgres@ServerName rpl_pgdata]$ echo 'port = 6432' >> postgresql.auto.conf
Каталог данных реплики является копией мастера, поэтому содержит те же настройки сборщика журналов отчета. На реплике сборщик не требуется — удалим соответствующие строки из postgresql.auto.conf. Строки настроек сборщика идентифицируются по префиксу #log.
[postgres@ServerName rpl_pgdata]$ sed -i '/#log/d' postgresql.auto.conf
Разбор команды
sed— потоковый редактор текста;- опция
-i— изменение файла на месте (без создания резервной копии); - регулярное выражение
/#log/d— удаление всех строк, содержащих подстроку#log(настройки сборщика журналов отчета).
Проверим итоговое содержимое файла postgresql.auto.conf.
[postgres@ServerName rpl_pgdata]$ cat postgresql.auto.conf
# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
primary_conninfo = 'user=postgres passfile=''/var/lib/postgres/.pgpass'' channel_binding=prefer port=5432 client_encoding=UTF8 sslmode=prefer sslcompression=0 sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres target_session_attrs=any'
port = 6432
В файле postgresql.auto.conf записаны два параметра: primary_conninfo (строка подключения к мастеру, созданная автоматически опцией -R утилиты pg_basebackup) и port = 6432 (порт реплики, добавленный вручную). Настройки сборщика журналов отчета успешно удалены.
Запуск реплики
Мастер-сервер запущен через systemctl, репликацию запускаем вручную утилитой pg_ctl. Опция -D указывает каталог данных PGDATA, опция -l — файл журнала отчета.
[postgres@ServerName ~]$ pg_ctl start -D ~/rpl_pgdata/ -l ~/rpl.log
waiting for server to start.... done
server started
Сервер реплики успешно запущен. Проверим журнал отчета для подтверждения корректности запуска.
[postgres@ServerName ~]$ tail -14 ~/rpl.log
2024-11-03 10:15:21.190 MSK [19263] LOG: listening on IPv4 address "0.0.0.0", port 6432
2024-11-03 10:15:21.190 MSK [19263] LOG: listening on IPv6 address "::", port 6432
2024-11-03 10:15:21.196 MSK [19263] LOG: listening on Unix socket "/tmp/.s.PGSQL.6432"
2024-11-03 10:15:21.207 MSK [19267] LOG: database system was shut down in recovery at 2024-11-03 10:13:2 2024-11-03 10:15:21.208 MSK [19268] LOG: idle terminator started
2024-11-03 10:15:21.208 MSK [19267] LOG: entering standby mode
2024-11-03 10:15:21.233 MSK [19267] LOG: redo starts at 0/C000070
2024-11-03 10:15:21.233 MSK [19267] LOG: consistent recovery state reached at 0/C000150
2024-11-03 10:15:21.233 MSK [19267] LOG: invalid record length at 0/C000198: wanted 26, got 0 2024-11-03 10:15:21.233 MSK [19263] LOG: database system is ready to accept read-only connections 2024-11-03 10:15:21.238 MSK [19263] LOG: Start integrity check launcher
2024-11-03 10:15:21.239 MSK [19270] LOG: Start of integrity check
2024-11-03 10:15:21.239 MSK [19271] LOG: License checker started
2024-11-03 10:15:21.248 MSK [19269] LOG: started streaming WAL from primary at 0/C000000 on timeline 1
В журнале отчета зафиксированы ключевые события запуска
- реплика прослушивает порт TCP 6432 (
listening on IPv4 address "0.0.0.0", port 6432); - сервер перешел в режим ожидания (
entering standby mode); - начато применение WAL-записей (
redo starts at 0/C000070); - достигнуто согласованное состояние восстановления (
consistent recovery state reached at 0/C000150); - сервер готов принимать только читающие подключения (
database system is ready to accept read-only connections); - начата потоковая передача WAL с мастера (
started streaming WAL from primary at 0/C000000 on timeline 1).
Убедиться, что мастер и реплика работают корректно, позволяет вывод дерева процессов.
[postgres@ServerName ~]$ ps f -C postgres
PID TTY STAT TIME COMMAND
19263 ? Ss 0:00 /usr/pangolin-{pangolin_version}/bin/postgres -D /var/lib/postgres/rpl_pgdata
19265 ? Ss 0:00 \_ postgres: checkpointer
19266 ? Ss 0:00 \_ postgres: background writer
19267 ? Ss 0:00 \_ postgres: startup recovering 00000001000000000000000C
19268 ? Ss 0:00 \_ postgres: idle sessions terminator
19269 ? Ss 0:00 \_ postgres: walreceiver
19270 ? Ss 0:00 \_ postgres: integrity check launcher
19271 ? Ss 0:00 \_ postgres: license checker
810 ? Ss 0:19 /usr/pangolin-{pangolin_version}/bin/postgres -D /pgdata/06/data
905 ? Ss 0:00 \_ postgres: logger
909 ? Ss 0:00 \_ postgres: checkpointer
910 ? Ss 0:00 \_ postgres: background writer
912 ? Ss 0:00 \_ postgres: idle sessions terminator
922 ? Ss 0:00 \_ postgres: walwriter
923 ? Ss 0:00 \_ postgres: license checker
924 ? Ss 0:00 \_ postgres: autovacuum launcher
925 ? Ss 0:00 \_ postgres: autounite launcher
926 ? Ss 0:00 \_ postgres: integrity check launcher
927 ? Ss 0:00 \_ postgres: logical replication launcher
19272 ? Ss 0:00 \_ postgres: walsender postgres [local] streaming 0/C000198
В выводе дерева процессов подтверждается корректная работа обоих экземпляров. На реплике (-D /var/lib/postgres/rpl_pgdata) запущены процессы startup (непрерывное восстановление) и walreceiver (прием WAL из потока). На мастере (-D /pgdata/06/data) работают процессы walwriter, autovacuum launcher и walsender (передача WAL реплике).
Мониторинг репликации
Вывод дерева процессов подтверждает факт запуска обоих экземпляров, однако для системного контроля работы репликации этого недостаточно. Для своевременного обнаружения рассинхронизации, накопления задержек WAL и сбоев потока репликации необходим мониторинг. Он осуществляется с помощью встроенных функций и системных представлений: функция pg_is_in_recovery() определяет роль сервера, представление pg_stat_activity отражает набор запущенных процессов (walsender на мастере, walreceiver и startup на реплике, а также walwriter, autovacuum launcher и остальных), а представление pg_stat_replication предоставляет детальную информацию о состоянии потока — текущий LSN, задержки, режим синхронизации.
Состояние мастера
Для мониторинга состояния репликации проверим роль сервера (мастер или реплика) и набор запущенных процессов. Подключимся к мастер-серверу в режиме без вывода приветственного сообщения (-q).
[postgres@ServerName ~]$ psql -q
Функция pg_is_in_recovery() возвращает true, если сервер находится в режиме восстановления (реплика), и false, если сервер работает в обычном режиме (мастер).
postgres@postgres=# SELECT pg_is_in_recovery();
pg_is_in_recovery
-------------------
f
(1 row)
Функция вернула false — сервер работает в роли мастера и может выполнять пишущие запросы.
Просмотрим набор процессов сервера через системное представление pg_stat_activity.
postgres@postgres=# SELECT pid, backend_type FROM pg_stat_activity;
pid | backend_type
-------+------------------------------
924 | autovacuum launcher
925 | autounite launcher
926 | integrity check launcher
927 | logical replication launcher
19272 | walsender
19762 | client backend
910 | background writer
909 | checkpointer
922 | walwriter
(9 rows)
На мастер-сервере запущены процессы, недоступные на реплике:
autovacuum launcher— запуск автоочистки;walsender— передача потока репликации на реплику;walwriter— запись WAL из кеша в файлы сегментов.
Процесс walsender может запускаться и на реплике, но только в топологии каскадной репликации, когда реплика передает WAL другой реплике.
Состояние реплики
Подключимся к реплике, указав номер порта 6432.
[postgres@ServerName ~]$ psql -q -p 6432
Проверим роль сервера — реплика должна находиться в режиме восстановления.
postgres@postgres=# SELECT pg_is_in_recovery();
pg_is_in_recovery
-------------------
t
(1 row)
Функция вернула true — сервер работает в режиме постоянного восстановления и является репликой.
Просмотрим набор процессов реплики.
postgres@postgres=# SELECT pid, backend_type FROM pg_stat_activity;
pid | backend_type
-------+--------------------------
19270 | integrity check launcher
19881 | client backend
19267 | startup
19266 | background writer
19265 | checkpointer
19269 | walreceiver
(6 rows)
На реплике присутствуют характерные процессы:
startup— непрерывное применение WAL-записей в режиме восстановления;walreceiver— прием записей WAL из потока репликации с мастера.
Процессы walwriter и autovacuum launcher отсутствуют — на реплике они не запускаются.
Попробуем выполнить пишущий запрос.
postgres@postgres=# CREATE TABLE t();
ERROR: cannot execute CREATE TABLE in a read-only transaction
Операция завершена ошибкой: реплика не поддерживает пишущие запросы.
При включенном параметре hot_standby на реплике разрешены читающие запросы. Проверим значение параметра.
postgres@postgres=# \dconfig+ hot_standby
List of configuration parameters
Parameter | Value | Type | Context | Access privileges
-------------+-------+------+------------+-------------------
hot_standby | on | bool | postmaster |
(1 row)
Параметр hot_standby включен (on), что позволяет выполнять читающие запросы на реплике.
Проверка репликации
Для подтверждения корректной работы репликации выполним пишущие операции на мастере и проверим, что данные отобразились на реплике.
Подключимся к мастеру на порту 5432. Метакоманда \c изменяет параметры текущего подключения: первые два дефиса оставляют неизменными базу данных и роль, последний параметр задает новый порт.
postgres@postgres=# \c - - - 5432
You are now connected to database "postgres" as user "postgres" via socket in "/tmp" at port "5432".
Создадим тестовую базу данных repbase.
postgres@postgres=# CREATE DATABASE repbase;
CREATE DATABASE
Подключимся к созданной базе данных.
postgres@postgres=# \c repbase
You are now connected to database "repbase" as user "postgres".
Создадим таблицу nt со столбцами с типами данных времени и текстового сообщения, затем вставим тестовую строку.
postgres@repbase=# CREATE TABLE nt (dt timestamp DEFAULT now(), msg text);
CREATE TABLE
postgres@repbase=# INSERT INTO nt(msg) VALUES ('Проверка связи...');
INSERT 0 1
Переключимся на реплику, указав порт 6432.
postgres@repbase=# \c - - - 6432
You are now connected to database "repbase" as user "postgres" via socket in "/tmp" at port "6432".
Сеанс подключен к базе repbase на порту 6432 — это реплика. Выполним выборку из таблицы nt, созданной на мастере.
postgres@repbase=# SELECT * FROM nt;
dt | msg
----------------------------+-------------------
2024-11-26 06:49:41.851134 | Проверка связи...
(1 row)
Данные, записанные на мастере, отобразились на реплике. Реплика не выполняла интерпретацию или планирование запросов — процесс startup применил записи WAL, полученные по протоколу репликации, воспроизведя все действия мастера.
Состояние репликации на мастере
Переключимся на мастер и проверим статус активного потока репликации через системное представление pg_stat_replication. Опция \gx переключает формат вывода в режим «одна запись — одна колонка».
postgres@repbase=# \c - - - 5432
You are now connected to database "repbase" as user "postgres" via socket in "/tmp" at port "5432".
postgres@repbase=# SELECT * FROM pg_stat_replication \gx
-[ RECORD 1 ]----+------------------------------
pid | 2971
usesysid | 10
usename | postgres
application_name | walreceiver
client_addr |
client_hostname |
client_port | -1
backend_start | 2024-11-26 06:51:42.717722+03
backend_xmin |
state | streaming
sent_lsn | 0/D6B0FE8
write_lsn | 0/D6B0FE8
flush_lsn | 0/D6B0FE8
replay_lsn | 0/D6B0FE8
write_lag |
flush_lag |
replay_lag |
sync_priority | 0
sync_state | async
reply_time | 2024-11-26 06:51:42.717722+03
Ключевые поля представления pg_stat_replication:
state— текущее состояние потока репликации (значениеstreamingозначает активную потоковую передачу WAL);sync_state— режим синхронизации (значениеasyncуказывает на асинхронную репликацию);sent_lsn/write_lsn/flush_lsn/replay_lsn— контрольные точки (LSN — Log Sequence Number) на этапах обработки WAL: отправка, запись, фиксация и применение;write_lag/flush_lag/replay_lag— задержки между мастером и репликой (пустые значения означают отсутствие измеримой задержки);application_name— имя приложения на стороне реплики (walreceiver);backend_start— время начала сессии репликации.
Репликация работает в режиме потоковой передачи (state = streaming) и асинхронном режиме (sync_state = async). Задержки отсутствуют — реплика синхронизирована с мастером.
Изменение роли реплики
По умолчанию реплика не выполняет пишущие транзакции и не может выполнять всю работу, характерную для мастер-сервера. В случае отказа мастера или его намеренной остановки, например для обслуживания, реплика может взять на себя его функциональность, выполнив повышение роли и став новым мастером.
Процесс повышения роли включает следующие этапы:
- применение всех полученных, но еще не примененных записей WAL;
- разрыв потока репликации, остановка процесса
walreceiver; - завершение работы процесса
startup; - запуск процессов, необходимых для работы мастера;
- перевод сервера в обычный режим и начало обслуживания читающих и пишущих транзакций.
Для повышения роли в PostgreSQL предусмотрено три способа:
- вызов функции
pg_promote(); - выполнение команды
pg_ctl promote; - создание триггерного файла, имя которого задается параметром конфигурации
promote_trigger_file.
Если старый мастер-сервер не остановлен, оба сервера после повышения могут продолжать выполнять пишущие транзакции, что приведет к рассинхронизации данных без простого способа восстановления согласованности.
Повышение роли
Подключимся к реплике на порту 6432.
postgres@postgres=# \c repbase - - 6432
You are now connected to database "repbase" as user "postgres" via socket in "/tmp" at port "6432".
Подтвердим, что сервер находится в режиме восстановления (реплика).
postgres@repbase=# SELECT pg_is_in_recovery();
pg_is_in_recovery
-------------------
t
(1 row)
Функция вернула true — сервер работает в роли реплики.
Вызовем функцию pg_promote() для повышения роли реплики до мастера. Функция возвращает true, если повышение инициировано успешно, и false, если сервер уже является мастером.
postgres@repbase=# SELECT pg_promote();
pg_promote
------------
t
(1 row)
Повышение роли выполнено успешно. Проверим, что на бывшей реплике теперь доступны пишущие запросы.
postgres@repbase=# INSERT INTO nt(msg) VALUES ('Теперь у нас два мастера.');
INSERT 0 1
Запрос выполнен успешно — сервер принял пишущую транзакцию. Проверим содержимое таблицы.
postgres@repbase=# SELECT * FROM nt;
dt | msg
----------------------------+---------------------------
2024-11-26 06:49:41.851134 | Проверка связи...
2024-11-26 06:54:50.550615 | Теперь у нас два мастера.
(2 rows)
В таблице присутствуют обе строки: исходная (созданная на старом мастере) и новая (созданная на бывшей реплике после повышения роли).
Просмотрим набор процессов на новом мастере.
postgres@repbase=# SELECT pid, backend_type FROM pg_stat_activity;
pid | backend_type
-------+------------------------------
24979 | autovacuum launcher
19270 | integrity check launcher
24971 | client backend
24981 | logical replication launcher
24980 | autounite launcher
19266 | background writer
19265 | checkpointer
24978 | walwriter
(8 rows)
Сравнение с набором процессов реплики показывает изменения: запускаются новые процессы, включая autovacuum launcher для автоочистки, walwriter для записи WAL из кеша в сегменты журнала и logical replication launcher для управления логической репликацией. Одновременно останавливаются процессы, характерные для реплики, — startup, отвечающий за непрерывное восстановление, и walreceiver, принимающий записи WAL по протоколу репликации.
Файловая репликация

Файловая репликация основана на организации архива сегментов журнала предзаписи (WAL). Она может использоваться самостоятельно или в сочетании с потоковой репликацией.
Файловая репликация применяется в двух сценариях:
- Самостоятельная — сегменты WAL попадают в архив после полного заполнения или при вызове функции
pg_switch_wal(). Это создает значительную задержку применения записей на реплике, так как данные становятся доступны только после ротации сегмента; - Дополнение к потоковой — файловый архив повышает надежность потоковой репликации и позволяет выполнять восстановление на произвольный момент времени в прошлом (Point-In-Time Recovery — PITR).
Реплика автоматически извлекает из архива необходимые сегменты WAL с помощью команды, заданной параметром restore_command.
Поместить сегменты WAL в архив можно двумя способами:
- включить режим архивирования на мастере параметром
archive_mode = onи настроить команду архивированияarchive_command, которая будет копировать заполненные сегменты в архив после ротации; - использовать отдельную программу, подключающуюся к мастеру по протоколу репликации для получения потока WAL и размещения сегментов в архиве.
Итоги
- Реплика создается командой
pg_basebackup -D <каталог> -R— опция-Rсоздаетstandby.signalиprimary_conninfo; - Файл
standby.signalуказывает серверу перейти в режим реплики при запуске; - На мастере работает
walsender, на реплике —walreceiver(прием WAL) иstartup(применение WAL); - На реплике отключены
walwriterиautovacuum launcher— реплика работает в режиме непрерывного восстановления; - Функция
pg_is_in_recovery()возвращаетtrueна реплике иfalseна мастере; - Параметр
hot_standby = on(по умолчанию) разрешает читающие запросы на реплике; - Представление
pg_stat_replicationна мастере показывает статус потока: LSN, задержки, режим синхронизации; - Повышение реплики до роли мастера выполняется функцией
pg_promote()или сигнальным файломpromote.signal; - Файловая репликация использует архив WAL с параметрами
archive_mode,archive_commandиrestore_commandдля PITR.
Самопроверка
Вопрос 1
Какой файл должен быть создан в PGDATA для того, чтобы сервер перешел в состояние hotstandby?
Вопрос 2
Что делает опция -c fast в команде pg_basebackup?
Вопрос 3
Какие процессы работают на мастере, но отсутствуют на реплике? Выберите все верные варианты.
Вопрос 4
Какие процессы работают на реплике в режиме непрерывного восстановления? Выберите все верные варианты.
Вопрос 5
Какой статус выдаст функция pg_is_in_recovery(), если сервер работает в режиме непрерывного восстановления (реплика)?
Вопрос 6
Какой параметр конфигурации должен быть включен (on), чтобы на реплике были разрешены читающие запросы?
Вопрос 7
Какие ключевые поля содержит представление pg_stat_replication на мастере? Выберите все верные варианты.
Вопрос 8
Какая функция повышает роль реплики до мастера?
Вопрос 9
Какие параметры нужны для настройки файловой репликации (архива WAL)? Выберите все верные варианты.