Если убрать бесконечные споры о расширениях, повседневная работа с PostgreSQL сводится к десятку тем. Знаешь их — и 90% инцидентов, тормозов и «почему прод лёг» разбираются без паники. Ниже — эти десять, с практикой и граблями, а не общими словами.

1. MVCC и VACUUM

PostgreSQL не изменяет строку на месте — при UPDATE/DELETE он создаёт новую версию, а старую помечает «мёртвой» (это и есть MVCC — многоверсионность). Мёртвые версии должен убирать autovacuum. Если он настроен плохо, таблицы и индексы раздуваются (bloat), а задержки ползут вверх неделями — незаметно, пока не станет больно.

Что делать:

2. Индексы под реальные запросы

Индекс полезен только под конкретный паттерн запроса. Ключевые вещи:

Проверяйте гипотезы через EXPLAIN (см. пункт 7), а не «на глаз».

3. Блокировки и DDL

ALTER TABLE может взять ACCESS EXCLUSIVE и заблокировать запись (а иногда и чтение) на всю таблицу. На проде это инцидент.

Безопасные приёмы:

Помните про очередь блокировок: одна ждущая ACCESS EXCLUSIVE блокирует всех, кто встал за ней, даже читателей.

4. Уровни изоляции и аномалии

Три уровня, которые реально используются: Read Committed (дефолт), Repeatable Read, Serializable.

5. Управление соединениями

Каждое соединение в PostgreSQL — это процесс с своей памятью. Слишком много соединений выжигает CPU и RAM быстрее, чем кажется.

6. WAL, checkpoints и репликация

Любая запись сначала идёт в WAL (журнал упреждающей записи). Отсюда три следствия:

7. Основы планировщика запросов

EXPLAIN (ANALYZE, BUFFERS) — это ваш отладчик, а не украшение. Что читать:

Читать план надо снизу вверх и изнутри наружу, обращая внимание на узлы с наибольшим actual time и расхождением rows.

8. Наблюдаемость, привязанная к реальным сбоям

Мониторьте не «всё подряд», а то, что предсказывает боль:

Метрика полезна, если по ней понятно, что чинить, а не просто «красиво».

9. Бэкапы и проверка восстановления

Минимум для прода — базовый бэкап + архивирование WAL (PITR: восстановление на момент времени). Инструменты: pg_basebackup, а лучше pgBackRest/Barman.

Главная ошибка — никогда не проверять восстановление. Во время аварии выясняется, что:

Правило простое: бэкап, который ни разу не восстанавливали, — это не бэкап, а надежда. Регулярно прогоняйте restore на отдельном хосте и замеряйте время.

10. Безопасность и права

Итог

Расширения, экзотические типы индексов и модные надстройки — это последние 10%. Первые 90% надёжности и производительности PostgreSQL держатся на скучных вещах из списка выше: вовремя убранные мёртвые строки, индексы под запросы, аккуратный DDL, понимание изоляции, пул соединений, здоровый WAL и репликация, чтение планов, честная наблюдаемость, проверенные бэкапы и минимальные права. Освойте эти десять — и большинство «магических» проблем перестанут быть магическими.

Авторские права

Автор: Vasiliy Fakunin

Ссылка: https://notes.melancholic.tech/posts/postgresql-10-things/

Лицензия: CC BY-NC-SA 4.0

Использование материалов блога разрешается при условии: указания авторства/источника, некоммерческого использования и сохранения лицензии.

Начать поиск

Введите ключевые слова для поиска статей

↑↓
ESC
⌘K Горячая клавиша