Лабораторная работа 1. PostgreSQL 16 Имена сервисов primary и replica описывают только исходные роли. После pg_promote() сервис replica становится логическим лидером, а остановленный primary остаётся старым лидером. Не выполняйте команды следующего опыта, ориентируясь только на имя контейнера: перед заданиями 4 и 5 стенд нужно создать заново по инструкции ниже. Запуск: docker compose up -d docker compose ps Проверка потоковой репликации: docker compose exec primary psql -U postgres -d lab -c \ "CREATE TABLE IF NOT EXISTS events(id bigserial PRIMARY KEY, value text); INSERT INTO events(value) VALUES ('first');" docker compose exec replica psql -U postgres -d lab -c \ "TABLE events;" docker compose exec primary psql -U postgres -d lab -c \ "SELECT application_name, state, sync_state, write_lag, replay_lag FROM pg_stat_replication;" Пауза и возобновление воспроизведения: docker compose exec replica psql -U postgres -d lab -c \ "SELECT pg_wal_replay_pause();" docker compose exec replica psql -U postgres -d lab -c \ "SELECT pg_wal_replay_resume();" Настройка синхронной реплики: docker compose exec primary psql -U postgres -d lab -c \ "ALTER SYSTEM SET synchronous_standby_names = 'replica1';" docker compose exec primary psql -U postgres -d lab -c \ "SELECT pg_reload_conf();" После этого параметр synchronous_commit=remote_apply можно задавать в отдельной сессии записи. Если воспроизведение на реплике приостановлено, такая запись будет ждать pg_wal_replay_resume(). Возврат к асинхронному режиму перед заданием 3: docker compose exec replica psql -U postgres -d lab -c \ "SELECT pg_wal_replay_resume();" docker compose exec primary psql -U postgres -d lab -c \ "ALTER SYSTEM RESET synchronous_standby_names;" docker compose exec primary psql -U postgres -d lab -c \ "SELECT pg_reload_conf();" docker compose exec primary psql -U postgres -d lab -c \ "SELECT application_name, state, sync_state FROM pg_stat_replication;" В выводе последней команды для replica1 должно быть sync_state=async. Детерминированная потеря асинхронного хвоста и повышение реплики: docker compose stop replica docker compose exec primary psql -U postgres -d lab -c \ "INSERT INTO events(value) SELECT 'lost-' || n FROM generate_series(1, 100) AS n;" docker compose kill primary docker compose up -d --no-deps replica docker compose ps docker compose exec replica psql -U postgres -d lab -c \ "SELECT pg_promote();" Дождитесь готовности replica и проверьте текущую роль: docker compose exec replica psql -U postgres -d lab -c \ "SELECT NOT pg_is_in_recovery() AS is_current_leader;" Флаг --no-deps обязателен: обычный docker compose start replica может автоматически запустить зависимый primary, после чего реплика успеет получить проверяемый хвост и опыт перестанет моделировать потерю лидера. После promotion именно сервис replica является текущим лидером. Для следующего независимого опыта удалите учебные тома и заново создайте исходную пару: docker compose down -v docker compose up -d docker compose ps Дождитесь healthy у обоих сервисов и повторите проверку потоковой репликации. Эта чистая переинициализация обязательна перед заданием 4. Для задания 5 так же начните с чистого стенда, повторите failover, а затем запустите старый primary без переинициализации только ради контролируемой демонстрации split brain. Возвращать его в рабочую топологию без pg_rewind или новой базовой копии нельзя. Удаление стенда вместе с учебными данными: docker compose down -v