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

CodeFest 2019. Иван Панченко (Postgres Pro) — P...

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

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

Avatar for CodeFest

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 Функциональность Долой преждевременную оптимизацию!