Виртуальная реальность Стейблкоины

Когда SIGTERM не работает: загадка с PostgreSQL и решение проблемы

Виртуальная реальность Стейблкоины
When Sigterm Does Nothing: A Postgres Mystery

Проблема с тем, что SIGTERM не останавливает запросы в PostgreSQL, стала причиной серьезных перебоев в работе баз данных. Разбираемся в причинах, механизмах и решениях, которые помогут избежать подобных ситуаций и обеспечить стабильность систем с использованием реплик PostgreSQL.

В современной инфраструктуре баз данных PostgreSQL занимает лидирующие позиции благодаря своей надежности, гибкости и мощным возможностям. Однако даже такая продвинутая система порой сталкивается с неисправностями, которые могут поставить в тупик и опытных специалистов. Особенную головоломку представила ситуация, когда стандартные методы остановки запроса, включая отправку сигнала SIGTERM, не дают результата. Эта загадка вывела на свет глубокие архитектурные особенности PostgreSQL, связанные с работой реплик и логической репликацией, и позволила найти эффективные пути решения проблемы. Проблема неявно проявлялась в работе с логической репликацией PostgreSQL на read replica — только что созданный запрос на создание логического репликационного слота зависал на неопределенное время и не поддавался остановке при помощи традиционных средств.

Запрос, который обычно занимает секунды, растягивался на часы, создавая серьезное неудобство для пользователей и создавая угрозу для стабильности базы данных. Причина казалась неочевидной, ведь самим PostgreSQL не отображались какие-либо ожидающие события или блокировки, на которые можно было бы повлиять. Команда, работающая над системой CDC (Change Data Capture), которая отслеживает изменения в базе данных и обеспечивает их потоковую репликацию в аналитическую систему ClickHouse, столкнулась с тем, что управлять непокорным процессом стало практически невозможно. Запрос на создание слота логической репликации показывался как активный, процесс продолжал занимать ресурсы, а отключение клиента либо попытки прервать процесс через pg_cancel_backend и pg_terminate_backend не приносили результата. Единственным выходом из сложившейся ситуации оставался жесткий рестарт экземпляра базы данных, что в продакшене, особенно при использовании managed сервисов, почти недопустимо из-за простоя и риска потери данных.

После признания проблемы глубже, исследователи приступили к изучению низкоуровневого поведения процесса. Анализ работы сервера при помощи strace показал, что процесс, выполняющий запрос на создание логического слота, находится в бесконечном цикле вызовов nanosleep с интервалом в 1 миллисекунду. При таком поведении процесс не делает реальных шагов для завершения операции и просто «спит», занимая ресурс CPU. Разбор кода PostgreSQL обнаружил функцию XactLockTableWait, отвечающую за ожидание завершения транзакций. Создание логической репликации требует установления «консистентной точки» — времени, когда все транзакции, предшествующие ему, уже завершились.

Это необходимо для корректного декодирования изменений с момента создания слота. Если на первичном сервере есть длительные транзакции, read replica должна дождаться их завершения, чтобы не потерять консистентность данных. В первичном сервере механизм ожидания работает организованно: процесс пытается захватить ShareLock на транзакцию, что блокирует выполнение до завершения транзакции, а сама операция чувствительна к сигналам прерывания. Таким образом, пользователи могут отменить или прервать выполнение запроса. Однако на read replica ситуация сложнее.

Благодаря особенностям hot standby режима основной процесс не может получить такую блокировку и поэтому реализует ожидание в виде опроса — проверяя, продолжается ли транзакция, и после каждого неудачного результата засыпая на одну миллисекунду. В этом цикле отсутствуют проверки прерываний, поэтому сигнал SIGTERM просто игнорируется, и процесс кажется «неубиваемым». Подобное поведение вызвано тем, что в standby сервере нет прямого мониторинга транзакций — он наблюдает их только по информации из WAL (журнала транзакций) и хранит KnownAssignedXids, список активных транзакций на первичном сервере. LockAcquire в таком случае сразу завершается, но проверка активна ли транзакция происходит отдельно, что и приводит к циклическому сну. Проблема усугублялась тем, что в системных таблицах Postgres отсутствовала явная индикация ожидания блокировки, что затрудняло диагностику.

В логах появлялась общая информация о необходимости дождаться завершения старых транзакций, но это редко помогало в реальном времени. Поскольку невозможно было отменить запрос нормальными методами, возникала необходимость перезагружать сервер, создавая простой, особенно критичный в managed окружениях. Чтобы исправить ситуацию, команда разработчиков предложила патч для Postgres, который добавлял проверку прерываний в основной цикл ожидания. Теперь перед каждым nanosleep проверяется наличие сигналов прерывания, что позволяет прервать зависший запрос, отправляя ему при этом SIGTERM или другие управляющие сигналы. Патч быстро прошел ревью в сообществе Postgres, был принят и включен во все поддерживаемые версии.

Это значительно повысило управляемость запросов в режиме hot standby и позволило избежать жестких рестартов. Кроме улучшения возможности прерывании запросов был поднят вопрос об улучшении отображения ожиданий в системных метриках. Впереди обсуждение введения нового типа wait_event, который позволит администраторам наглядно отслеживать подобные состояния, а также возможность оптимизации самой механики ожидания транзакций на репликах с точки зрения производительности и прозрачности. Этот кейс прекрасно демонстрирует, что даже самые зрелые и широко используемые технологии, такие как PostgreSQL, имеют свои скрытые сложности, особенно в продвинутых сценариях эксплуатации, где взаимодействие различных механизмов создаёт неожиданные эффекты. Он также подчёркивает важность активного участия пользователей и разработчиков в сообществе open source, когда выявленные проблемы фиксируются и решаются совместно с мейнтейнерами, обогащая всю экосистему.

Опыт команды, которая обнаружила и быстро отреагировала на проблему, позволяет сделать вывод о том, что глубокое понимание внутренней работы баз данных, изучение исходного кода и готовность к экспериментам с инструментами диагностики — неотъемлемые навыки для управления сложными инфраструктурами. Использование таких подходов помогает не только оперативно исправлять конкретные баги, но и создавать устойчивые, масштабируемые системы с минимальными рисками для бизнеса. Кроме технической стороны, этот случай напоминает, что автоматизация и продвинутые архитектуры, такие как репликация и логическое декодирование изменений, требуют постоянного внимания и опытного сопровождения. Поддержка и обновление версий PostgreSQL с включением последних патчей безопасности и стабильности должны быть частью регулярного процесса операций. Для пользователей и организаций, которые применяют PostgreSQL в связке с аналитическими платформами, такими как ClickHouse, важно понимать особенности работы с read replicas и правильную настройку механизмов логической репликации.

Правильная эксплуатация позволяет эффективно использовать преимущества репликации для разгрузки основной базы, повышения отказоустойчивости и ускорения аналитики. В заключение, история с «неубиваемым» запросом по созданию логического репликационного слота в PostgreSQL — это не только о баге, но и о природе сложных распределенных систем, о необходимости постоянного анализа и доработок, о сотрудничестве сообщества и инжиниринга. Это пример того, как глубокое понимание архитектуры и активное взаимодействие с open source проектами ведут к стабильности и прогрессу в развитии технологий баз данных.

Автоматическая торговля на криптовалютных биржах Покупайте и продавайте криптовалюты по лучшим курсам Privatejetfinder.com (RU)

Далее
Switched from a Kindle ereader to Kobo for a week – why I'm never going back
Вторник, 14 Октябрь 2025 Почему я перешёл с Kindle на Kobo и ни разу не пожалел об этом

Переход с Kindle на Kobo изменил моё представление об электронных ридерах. В статье подробно проанализированы преимущества и недостатки обеих платформ, раскрыты особенности удобства использования, функционала, качества сборки и экосистемы.

China jumps ahead in the race to achieve a new kind of reuse in space
Вторник, 14 Октябрь 2025 Китай опережает всех в гонке за новую эру повторного использования спутников в космосе

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

PlanExe
Вторник, 14 Октябрь 2025 PlanExe: Инновационный Инструмент для Автоматизированного Планирования с Искусственным Интеллектом

Подробный обзор возможностей и преимуществ PlanExe — передового решения, использующего искусственный интеллект для создания стратегических и тактических планов на основе простых текстовых запросов.

Freedom's Forge: How WWII's Industrial Mobilization Model Can Win the AI Race
Вторник, 14 Октябрь 2025 Уроки Второй мировой войны: как индустриальная мобилизация помогла бы выиграть гонку искусственного интеллекта

Изучение модели индустриальной мобилизации США во Второй мировой войне раскрывает эффективные стратегии для современной конкуренции в области искусственного интеллекта с Китаем. Анализ исторического опыта показывает важность государственного инвестирования и создания масштабной технологической экосистемы для сохранения технологического лидерства.

Pipeline of Agents Pattern: Building Maintainable AI Workflows with LangGraph
Вторник, 14 Октябрь 2025 Паттерн Pipeline of Agents: Как Создавать Поддерживаемые AI-Рабочие Процессы с LangGraph

Обзор архитектурного паттерна Pipeline of Agents, который позволяет создавать гибкие, модульные и легко поддерживаемые AI-системы на базе LangGraph. Рассматриваются особенности построения многоагентных цепочек, их преимущества в обеспечении строгого разделения ответственности и примеры практической реализации.

The Guinness World Record for Most Escape Rooms in 24 Hours was set at 22 (2018)
Вторник, 14 Октябрь 2025 Рекорд Гиннесса по количеству пройденных квест-комнат за 24 часа: 22 игры подряд

История установки мирового рекорда по прохождению максимального количества квест-комнат за сутки. Узнайте о подготовке, трудностях и впечатлениях команды, покорившей 22 комнаты в Москве в 2018 году, а также секретах успешного прохождения и важности командной работы.

Multiple Vulnerabilities Fixed in Git
Вторник, 14 Октябрь 2025 Обнаружены и устранены множественные уязвимости в системе контроля версий Git: что нужно знать разработчикам

Важное обновление Git: решены критические уязвимости, которые могли привести к выполнению вредоносного кода и потере данных. Разбор выявленных проблем и рекомендации по обеспечению безопасности проектов.