Топ ошибок со стороны разработки при работе с PostgreSQL

Intro

В компаниях любого размера бывают проблемы. Откуда они берутся?

  1. Из фич. Начинаем использовать продвинутые фичи, утилиты и прочее. «Хочется взять дежурный пистолет, положить в ящик стола, иногда достать, застрелиться и работать дальше».

  2. Из хранения данных. Когда оно усложняется, больше шансов написать кривой запрос.

  3. Из жизненного цикла. Разработчики пилят, админы настраивают, а улучшать систему некому. База работает с дефолтными конфигами и когда-нибудь ломается.

Наводим порядок

Планирование и мониторинг

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

Что делать? Мониторить и планировать!

Мониторинг:

Масштабирование

Типичный разработчик видит БД как строчку конфига и не интересуется тем, как она работает. Это источник проблем.

OLTP-транзакции — быстрые, короткие, лёгкие. OLAP-транзакции — медленные, долгие и тяжёлые.

Те и другие нужно разносить. Вторые мешают первым. Как масштабировать PostgreSQL так, чтобы разнести нагрузку?

С чего начать?

Приложения и СУБД-транзакции

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

Откуда берутся такие транзакции?

  1. Внешний источник:

    1. Приложение открывает транзакцию
    2. Потом идёт на какой-то другой источник, встречает там ошибку, падает.
    3. Profit, транзакция висит, пока её явно не убьют.
  2. Нет обработки ошибок

  3. Человеческий фактор — открыл и забыл.

Что делать:

Избегайте пустых транзакций любой ценой!

Велосипедостроение

Фоновая обработка событий. Бизнес хочет необычного. Появляются самописные очереди. От долгих транзакций эти таблицы распухают. Растёт время их обработки, очередь перестаёт работать.

Что делать: использовать Skytools PgQ. Но и в нём есть проблемы:

Плюсы PgQ:

Вывод: для каждой задачи сначала ищите инструменты, которые уже изобретены.

Автоматизация

Админы хотят:

Разработчики хотят:

Все хотят autofailover! Но всё не так просто:

Как делать failover?

Контейнеры и оркестрация

А что, если развернуть базу в k8s?

Вывод: использовать для стейджингов и девелоперских машин, но не на проде. Если очень хочется — то использовать local volumes, streaming replication и операторы PostgreSQL.