PostgreSQL и логи

топ 100 блогов klink0v — 12.07.2024

Чё-то меня торкнуло пойти разбираться как устроено логирование в PostgreSQL. Короткий ответ: непросто.

А в чём вообще суть проблемы, спросите вы?

Очень многие разработчики пытаются оптимизировать свои запросы к базе данных, для чего им требуется какая-нибудь более-менее наглядная статистика из серии "что выполняется быстро, что медленно". Некоторые из них для этой цели требуют развернуть для них pgbadger. Который парсит логи Postgres-а и формирует ту самую статистику.

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

У Postgres-а под Linux-ом предусмотрено три основных способа логирования (всякие хипстерские JSON в расчет не берем): stderr, syslog, собственный коллектор. И они ни разу не тождественные. Вот в этой доке описаны нюансы работы каждого из них.

По умолчанию в Debian-системах "из коробки" включен первый способ (stderr). Проверить это можно псевдо-SQL запросом вида "show log_destination;" в psql-клиенте. В момент старта демона утилита pg_ctl подменяет ему файловый дескриптор stderr на файл в директории "/var/log/postgresql", поэтому для пользователя системы это выглядит так, как будто Postgres пишет логи напрямую в файл. Собственно, так оно и есть, но... мы не можем делать ротацию такого лога иначе как методом copytruncate. Что превращает работу с жирными логами в весьма ресурсоёмкую задачу. Кроме того, постоянно открытый дескриптор на супержирный файл приводит к тому, что он не может "вымыться" из кеша VFS, понапрасну расходуя оперативную память. Плохо.

Встроенный постгресовский лог-коллектор — фичастая, разухабистая и весьма мощная штука. Но он заточен под то, чтобы "не потерять ни единой записи". Как следствие, если этот коллектор по каким-то причинам затупит под нагрузкой (например, почему-то начал медленно отвечать носитель, на который он пишет), то следом за ним станет тупить и основной процесс Postgres-а. То есть фактически на ровном месте произойдёт деградация сервиса. Совсем плохо.

Остается syslog. Вроде как он лишен недостатков предыдущих двух методов. Вопрос только в том что дальше делать с данными, которые в этот syslog сваливаются. Если пихать их по умолчанию в общесистемный бинарный journald, то оный очень быстро забьется, в нём все перемешается и на фоне сообщений Postgres-а искать какие-то другие системные события будет весьма затруднительно. Да и фильтрация одних от других тоже будет на таких объемах происходить небыстро.

Для себя я вижу только выход переключать выхлоп Postgres-а в отдельный инстанс (Log Namespace) journald, хранилище которого размещать на отдельной файловой системе. Как это делать, я уже писал раньше. Благо, pgBadger в числе прочего умеет работать и с journalctl тоже. Пожалуй, единственный недостаток — придется объяснять разработчикам где отныне лежат логи и как их смотреть. Но это не самая большая проблема, поэтому по всей вероятности пойду как раз этим путём.

Всем информативных логов и удобной работы с ними.

Оставить комментарий

Архив записей в блогах:
Вчера выбрались в гости на последнюю свечу Хануки — заодно и на день рождения дочкиной свекрови из Ришона.  Всё славненько было, душевно, вкусно и безопасно, потому что все собираются на уик-энд в Эйлат, и у всех проверка на корону пройдена.  Сваха моя кулинарка, каких ...
Собирался по-отечески отвесить подзатыльника, но потом передумал. Лапищи больше, чем у меня )) ...
Ну вот. Картина маслом. Никто никуда не идет. Действительно, Дамаску сейчас очень не просто. А с чего бы? Кстати, кому интересно оригинальное, не на заказ и не сфизженное откуда-то мнение на сей счет, вновь рекомендую . Но в конкретном случае ...
""Украина, это крупнейшее независимое и потенциально во всех отношениях богатейшее и перспективнейшее европейское государство."" Ребят,вы меня извините,у ...
Инсайд -не инсайд, но коррелирует со многими вещами. Да и параллель с 1917 годом давно на лицо.включая июльский кризис. Короче задорно и с огоньком. ----------------------------------------------------------------------------------------------------------------------------------- Делюсь о ...