Startup process
Startup process — это специальный процесс в PostgreSQL, который запускается только на standby-сервере (или при восстановлении из бэкапа) и отвечает за применение WAL-записей к данным, чтобы привести кластер в согласованное и актуальное состояние.
ядро механизма восстановления (recovery) и работает только в режиме “реплика” или “восстановление”, но никогда на основном (primary) сервере.
Читать WAL-записи (из файлов
pg_wal/или из архива) и применять их к локальным данным (таблицам, индексам), чтобы восстановить состояние базы на определённый момент времени или синхронизироваться с primary.
Этот процесс делает реплику актуальной и позволяет ей работать в режиме Hot Standby (чтение на реплике).
Когда запускается Startup process?
- При старте standby-сервера, если в каталоге данных есть:
standby.signal(в PostgreSQL ≥12), илиrecovery.conf(в PostgreSQL ≤11).
- При восстановлении из бэкапа (Point-in-Time Recovery (PITR)), если указан
recovery_target_*. Это управляемое восстановление до заданной точки во времени (PITR — Point-In-Time Recovery), обычно выполняемое вручную администратором.
Что именно делает Startup process?
1. Инициализация режима восстановления
- Читает параметры из
postgresql.auto.conf/standby.signal:primary_conninfo— откуда брать WAL,restore_command— как получать WAL из архива,recovery_target_*— до какой точки восстанавливать.
2. Запуск WAL Receiver (если настроена streaming replication)
- Если указан
primary_conninfo, он порождает процессwal receiver, который будет получать WAL напрямую с primary.
3. Чтение и применение WAL
- Startup process последовательно читает WAL-файлы из:
pg_wal/(если они есть локально),- или вызывает
restore_commandдля получения из архива, - или получает через WAL Receiver (streaming).
- Для каждой WAL-записи он выполняет REDO-операцию:
- Обновляет страницы в
shared_buffers, - Применяет изменения к таблицам, индексам, системным каталогам,
- Обновляет CLOG, visibility map и другие служебные структуры.
- Обновляет страницы в
4. Управление видимостью для Hot Standby
- Пока идёт восстановление, backend-процессы могут обслуживать
SELECT(Hot Standby). - Startup process предоставляет специальный snapshot, который позволяет читателям видеть только зафиксированные и применённые данные.
- Он отслеживает, какие XID уже видимы, чтобы не нарушить MVCC.
5. Остановка восстановления (если задан recovery target | Point-In-Time Recovery)
- Если достигнута цель (
recovery_target_time,recovery_target_xidи т.д.):- Startup process останавливает применение WAL,
- Создаёт файл
recovery.done(или удаляетstandby.signal), - Переводит сервер в режим primary (если не указано иное).
6. Подготовка к переходу в primary (при failover)
- При
pg_ctl promote:- Startup process завершает восстановление,
- Очищает состояние recovery,
- Переключает кластер в режим записи.
Важные особенности
- Startup process — единственный процесс, который может модифицировать данные на standby.
- Все остальные backend’ы на standby только читают.
- Он не обрабатывает клиентские запросы — только применяет WAL.
- При остановке (например, при
promote) он гарантирует согласованность: все применённые WAL — в данных, неприменённые — игнорируются. - Если WAL повреждён или отсутствует — останавливает восстановление с ошибкой.
На standby можно проверить прогресс через:
SELECT * FROM pg_stat_wal_receiver; -- если streaming
SELECT pg_last_wal_replay_lsn(); -- до какого LSN применено
SELECT pg_is_in_recovery(); -- true, если Startup ещё работаетWAL receiver ^psql-WAL-receiver
Только для физической репликации
WAL Receiver — это фоновый процесс на standby-сервере (реплике) в PostgreSQL, который принимает WAL-записи от WAL Sender с primary-сервера и записывает их в локальный каталог pg_wal/, чтобы standby мог применить изменения и оставаться синхронизированным.
Он является зеркальной парой WAL Sender’а и ключевым компонентом потоковой (streaming) физической репликации.
Главная задача WAL Receiver
Получать поток WAL-записей по сети от primary и сохранять их на диске standby-сервера, чтобы процесс восстановления (recovery) мог их применить.
- Поддерживать актуальную копию данных,
- Работать в режиме Hot Standby (чтение на реплике),
- Быстро заменить primary при отказе (failover).
Как работает WAL Receiver (по шагам)
- Standby-сервер запускается в режиме восстановления (наличие
standby.signalилиrecovery.conf). - Он устанавливает репликационное подключение к primary (указанному в
primary_conninfo). - На standby запускается процесс
WAL Receiver. - WAL Receiver:
- Принимает WAL-записи по TCP от WAL Sender на primary,
- Пишет их в локальный каталог
pg_wal/(точно такие же файлы, как на primary), - Обновляет метаданные: до какого LSN данные получены и записаны.
- Процесс Startup (на standby) читает эти WAL-файлы и применяет изменения к локальным данным (heap, индексы и т.д.).
WAL Receiver не применяет данные сам — он только принимает и сохраняет WAL.
Применение делает Startup process.
На standby можно проверить состояние через:
SELECT * FROM pg_stat_wal_receiver;- WAL Receiver не работает без Startup process — а тот запускается только в режиме recovery.
- При потере связи с primary WAL Receiver:
- Повторяет попытки подключения (если настроено),
- Standby переходит в режим archive recovery (если настроен
restore_command), - Или останавливается (если архив недоступен).
- WAL Receiver не шифрует трафик — для безопасности нужен SSL в
primary_conninfo. - При использовании replication slot WAL Receiver сообщает primary, до какого LSN он получил данные, чтобы тот не удалял нужные WAL-файлы.