Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CodeFest 2019. Иван Панченко (Postgres Pro) — Postgres: High Load Checklist

CodeFest 2019. Иван Панченко (Postgres Pro) — Postgres: High Load Checklist

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

CodeFest

April 06, 2019
Tweet

More Decks by CodeFest

Other Decks in Programming

Transcript

  1. Очевидные оговорки Приведены не все рецепты Универсальных рецептов нет Что-то

    может не помочь Не обязательно делать всё Не стоит торопиться с оптимизацией Нужно грамотное НТ Вначале подумай, потом сделай. См. предпоследний слайд. 5
  2. Разгрузить базу Оптимальный SQL Правильные настройки СУБД Все лишние операции

    – на App Server Меньше коннектов Транзакции покороче Грамотное использование реплик Секционирование таблиц Асинхронная обработка 8
  3. Разгрузить базу: Оптимальный SQL Осторожно с CTE! (v12 – по-другому)

    Очень осторожно с временными таблицами (см ниже)! Разумный подход к ORM Не использование ORM? Возможность ручного указания запросов Хранимые процедуры! Не использование? Сокращение savepoint’ов Выбор языка (включая C) Не возвращать больших таблиц Prepare запросов 9
  4. Разгрузить базу: Кстати, о временных таблицах Приложение создавало, но не

    удаляло временные таблицы…. https://commitfest.postgresql.org/11/831/ Temporary tables prevent autovacuum, leading to XID wraparound… https://postgrespro.ru/list/thread-id/0A3221C70F24FB45833433255569204D1F8A4DC6@G01JPEXMBYT05 https://commitfest.postgresql.org/19/1505/ I'd like to share my (painful) experience, in which temp tables caused PostgreSQL shutdown…Do not use temp tables in PostgreSQL with connection pool… https://postgrespro.ru/list/id/CADU5SwN6K19VqA1jm7M7f9jK+G6Kbu13sBBcH2y6K0xurifOpA@mail.gmail.com 10
  5. Разгрузить базу: Настройки СУБД Память shared_buffers, work_mem maintenance_work_mem Автовакуум Стоимости

    (random_page_cost и т.п.) https://habr.com/ru/post/444018/ https://pgday.ru/presentation/170/59648e053f0f0.pdf Параллельность для OLTP мало полезна (кроме CREATE INDEX) С 11-й версии: JIT Логирование (v12 – сэмплинг) 11
  6. Разгрузить базу: Лишние операции – на App Server Бизнес-логику -

    вон и базы! Особенно из триггеров Пред- и пост-обработка данных Парсинг/генерация HTML Построение отчетов Накопление данных 12
  7. Разгрузить базу: Меньше коннектов Лучше отказываться от отображения пользовательских сессий

    в серверные. И от временных таблиц. Не хранить на сервере временные и сессионные пользовательские данные. pgbouncer-ready app. Одна транзакция – один вызов. 13
  8. Разгрузить базу: Транзакции покороче Транзакция не должна ждать пользователя! В

    транзакции не нужно ждать ответа внешнего сервиса! В транзакции не нужно лишних вычислений 14
  9. Разгрузить базу: Транзакции и внешний сервис 15 Плохо! BEGIN; COMMIT;

    HTTP Status = ‘wait‘ tx_id =… Демон Status = ‘done‘ result =… HTTP Хорошо!
  10. Разгрузить базу: Использование реплик потоковая репликация read-only реплики для коротких

    запросов read-only реплики для бэкапа логическая репликация реплики для аналитики синхронная логическая реплика дорого стоит триггерная репликация хорошо подумать, прежде чем использовать 16
  11. Проблемы с длинными запросами на потоковой реплике см https://postgrespro.ru/docs/postgresql/11/hot-standby standby:

    max_standby_streaming_delay master: vaccum_defer_cleanup_age standby: hot_standby_feedback (также wal_receiver_status_interval и master: old_snapshot_threshold) см также https://commitfest.postgresql.org/21/1683/ !!! 17
  12. Разгрузить базу: Секционирование таблиц <=10 pg_pathman, >=11 CREATE PARTITION Что

    даёт для производительности TRUNCATE VACUUM Storage Parallel append Прямая работа с секциями Грамотный выбор ключа секционирования возможность ресекционирования 18
  13. Разгрузить базу: Асинхронная обработка Входные очереди (вне БД!) персистентность очереди.

    Сохранение порядка. WAL приложения. Многоступенчатые очереди (агрегация) Очереди постобработки. Асинхронная постобработка. Пакетная постобработка. Отложенная синхронизация и денормализация 19
  14. Разделить базу Шардинг уровня СУБД Шардинг уровня приложения Разделить систему:

    Распределенное решение с неполной консистентностью и синхронизацией 20
  15. Разделить базу: Шардинг уровня СУБД pg_shard https://www.citusdata.com/blog/2015/09/09/pgshard-learn-from-failure/ Citus – полукоммерческое

    расширение Postgres Greenplum – форк Postgres, массивно- параллельный OLAP Postgres XL и т.п. pg_shardman (Postgres Pro, github) Шарды могут лежать во внешних storage engine Нужно сразу думать о resharding 21
  16. Разделить базу: Разделить всю систему 23 App Server App Server

    Database App Server App Server Database Отложенная синхронизация
  17. Всё богатство фич РСУБД В т.ч. Даже ACID резко сокращается.

    Чем больше производительность, тем меньше богатство фич Так что же, почему мы тогда используем полноценную СУБД, а не ? 24
  18. Преимущества полноценной СУБД Highload – не везде. Highload – не

    всегда. 25 Функциональность Долой преждевременную оптимизацию!