Share
Embed
CodeFest 2019. Иван Панченко (Postgres Pro) — Postgres: High Load Checklist
Рассказ о том, как грамотно и аккуратно учитывать особенности постгреса при проектировании, разработке и внедрении высокопроизводительных приложений.
CodeFest
April 06, 2019
Transcript
27 slides
-
Очевидные оговорки Приведены не все рецепты Универсальных рецептов нет Что-то
может не помочь Не обязательно делать всё Не стоит торопиться с оптимизацией Нужно грамотное НТ Вначале подумай, потом сделай. См. предпоследний слайд. 5 -
СУБД занимает особое место Хуже всего масштабируется Естественное узкое место
6 App Server App Server App Server App Server App Server App Server Database -
Разгрузить базу Оптимальный SQL Правильные настройки СУБД Все лишние операции
– на App Server Меньше коннектов Транзакции покороче Грамотное использование реплик Секционирование таблиц Асинхронная обработка 8 -
Разгрузить базу: Оптимальный SQL Осторожно с CTE! (v12 – по-другому)
Очень осторожно с временными таблицами (см ниже)! Разумный подход к ORM Не использование ORM? Возможность ручного указания запросов Хранимые процедуры! Не использование? Сокращение savepoint’ов Выбор языка (включая C) Не возвращать больших таблиц Prepare запросов 9 -
Разгрузить базу: Кстати, о временных таблицах Приложение создавало, но не
удаляло временные таблицы…. 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 -
Разгрузить базу: Настройки СУБД Память 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 -
Разгрузить базу: Лишние операции – на App Server Бизнес-логику -
вон и базы! Особенно из триггеров Пред- и пост-обработка данных Парсинг/генерация HTML Построение отчетов Накопление данных 12 -
Разгрузить базу: Меньше коннектов Лучше отказываться от отображения пользовательских сессий
в серверные. И от временных таблиц. Не хранить на сервере временные и сессионные пользовательские данные. pgbouncer-ready app. Одна транзакция – один вызов. 13 -
Разгрузить базу: Транзакции покороче Транзакция не должна ждать пользователя! В
транзакции не нужно ждать ответа внешнего сервиса! В транзакции не нужно лишних вычислений 14 -
Разгрузить базу: Транзакции и внешний сервис 15 Плохо! BEGIN; COMMIT;
HTTP Status = ‘wait‘ tx_id =… Демон Status = ‘done‘ result =… HTTP Хорошо! -
Разгрузить базу: Использование реплик потоковая репликация read-only реплики для коротких
запросов read-only реплики для бэкапа логическая репликация реплики для аналитики синхронная логическая реплика дорого стоит триггерная репликация хорошо подумать, прежде чем использовать 16 -
Проблемы с длинными запросами на потоковой реплике см 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 -
Разгрузить базу: Секционирование таблиц <=10 pg_pathman, >=11 CREATE PARTITION Что
даёт для производительности TRUNCATE VACUUM Storage Parallel append Прямая работа с секциями Грамотный выбор ключа секционирования возможность ресекционирования 18 -
Разгрузить базу: Асинхронная обработка Входные очереди (вне БД!) персистентность очереди.
Сохранение порядка. WAL приложения. Многоступенчатые очереди (агрегация) Очереди постобработки. Асинхронная постобработка. Пакетная постобработка. Отложенная синхронизация и денормализация 19 -
Разделить базу Шардинг уровня СУБД Шардинг уровня приложения Разделить систему:
Распределенное решение с неполной консистентностью и синхронизацией 20 -
Разделить базу: Шардинг уровня СУБД 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 -
Разделить базу: Шардинг уровня приложения Часто предпочтительнее Нужно сразу думать
о: resharding целостном резервном копировании 22 -
Разделить базу: Разделить всю систему 23 App Server App Server
Database App Server App Server Database Отложенная синхронизация -
Всё богатство фич РСУБД В т.ч. Даже ACID резко сокращается.
Чем больше производительность, тем меньше богатство фич Так что же, почему мы тогда используем полноценную СУБД, а не ? 24 -
Преимущества полноценной СУБД Highload – не везде. Highload – не
всегда. 25 Функциональность Долой преждевременную оптимизацию! -
PgConf.Russia 2020 февраль или март Следите за анонсами на https://pgconf.ru/
Международная конференция по PostgreSQL