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

Call of Postgres: Advanced Operations. Part III.

Call of Postgres: Advanced Operations. Part III.

Slides from my tutorial at PgDay 2017 St.Petersburg, Russia

Alexey Lesovsky

July 05, 2017
Tweet

More Decks by Alexey Lesovsky

Other Decks in Education

Transcript

  1. План 03 dataegret.com Postmaster и клиенты. Postgres memory и ввод-вывод.

    Write-Ahead Log и WAL writer. MVCC и Autovacuum. Checkpoint'ы и Bgwriter. Потоковая репликация. Stats collector и Logger.
  2. Postmaster 03 dataegret.com * postmaster.c * This program acts as

    a clearing house for requests to the * POSTGRES system. Frontend programs send a startup message * to the Postmaster and the postmaster uses the info in the * message to setup a backend process.
  3. Postmaster 03 dataegret.com Инициализирует shared buffers. Работает в бесконечном цикле,

    где: • Принимает подключения, запускает клиентские процессы. • Отслеживает работу фоновых процессов. • Завершает всех при выключении.
  4. Postmaster 03 dataegret.com Каждый клиент = отдельный процесс. Много клиентов

    (n_clients > n_core * 10) – плохо. Много активных клиентов (n_clients > n_core) – плохо. Почему? • (относительно) Долгая инициализация бэкенда. • Нагрузка на планировщик ОС. • Конкуренция за (аппаратные) ресурсы.
  5. Процессная модель 03 dataegret.com Postgres opens dedicated backend for each

    client’s connection. Process 2 Process 1 . Process 3 . . Port 5432 Process 4 . . . . . . . . . Clients . . . . . . . . . . . . Backend 4 Backend 3 Backend 2 Backend 1 Client connections Postgres Backends
  6. Postmaster 03 dataegret.com Общая рекомендация – использовать pgbouncer. Предпочтительный режим

    – transaction. Ограничения: • Prepared statements. • SET/RESET. • https://wiki.postgresql.org/wiki/PgBouncer#Feature_matrix_for_pooling_modes Настройки планировщика ОС.
  7. Pgbouncer 03 dataegret.com Pgbouncer keeps only active connections and reuses

    idle ones. Process 2 Process 1 . Process 3 . . Port 5432 Process 4 . . . . . . . . . Clients . . . . Backend 2 Backend 1 Idle Postgres Backends Port 6432 Free Slot Active Pgbouncer Client connections Server connections
  8. Postgres Memory и ввод-вывод 03 dataegret.com Преимущества: • Не тратится

    время на инициализацию бэкенда. • Рестарт PG без отключения клиентов. • Подмена PG без отключения клиентов.
  9. Postgres Memory и ввод-вывод 03 dataegret.com Postmaster и клиенты. Postgres

    memory и ввод-вывод. Write-Ahead Log и WAL writer. MVCC и Autovacuum. Checkpoint'ы и Bgwriter. Потоковая репликация. Stats collector и Logger.
  10. Postgres Memory и ввод-вывод 03 dataegret.com Локальная (local) память: •

    Temp buffers – буфер для временные таблицы. • Work mem – ORDER BY, DISTINCT, hash/merge JOIN. • Maintenance/Autovacuum work mem – VACUUM, REINDEX. Выделяется при необходимости, не затрагивая shared память.
  11. Postgres Memory и ввод-вывод 03 dataegret.com Общая (shared) память: •

    Buffer pool – обработка данных. • WAL buffer – буфер журналов транзакций. • Commit Log – статусы транзакций. • Прочие структуры – фоновые процессы, локи и пр. Инициализируется при старте сервера.
  12. Buffer Manager 03 dataegret.com Backends access data through the buffer

    manager. Backend 2 Backend 1 Buffer Table Buffer Manager Buffer Pool Storage 8K page
  13. Postgres Memory и ввод-вывод 03 dataegret.com Рекомендации: • shared_buffers –

    25% или 75% от объема RAM. • Использовать HugePages при shared_buffers > 32GB • До 9.2 – libhugetlbfs. • 9.3 – исключение. • С 9.4 – встроенная поддержка (huge_pages). • Не стесняться поднимать maintenance/autovacuum_work_mem.
  14. Write-Ahead Log 03 dataegret.com Postmaster и клиенты. Postgres memory и

    ввод-вывод. Write-Ahead Log и WAL writer. MVCC и Autovacuum. Checkpoint'ы и Bgwriter. Потоковая репликация. Stats collector и Logger.
  15. Write-Ahead Log 03 dataegret.com Write-Ahead Log: • Страховка от потери

    данных в случае аварий. • Аварии связанные с hardware, OS, PostgreSQL. • Все изменения (почти) фиксируются в WAL.
  16. Write-Ahead Log 03 dataegret.com Чуть-чуть очевидных вещей: • WAL пишется

    бэкендами, либо асинхронно WAL Writer'ом. • WAL в хранится в файлах-сегментах по 16MB каждый. • WAL хранится в каталоге pg_xlog/ или pg_wal/. • Рекомендуется держать на отдельном диске (например с ОС).
  17. Write-Ahead Log 03 dataegret.com Потенциальные проблемы: • Расход места на

    диске. • Производительность на запись – долгие COMMIT'ы. • Потеря COMMIT'ов в случае аварии при асинхронной записи WAL.
  18. Write-Ahead Log 03 dataegret.com Что есть покрутить? • wal_level –

    всегда или replica или logical. • synchronous_commit = ? • wal_writer_delay – окно потери транзакций. • wal_writer_flush_after.
  19. Write-Ahead Log 03 dataegret.com Что есть покрутить? – продолжение. •

    full_page_writes – снижает риск повреждения данных. • wal_compression – снижает объем записи WAL ценой CPU usage. • wal_log_hints – требуется для pg_rewind.
  20. Write-Ahead Log 03 dataegret.com test* table/index size, MB WAL size,

    MB WAL size, % minimal 256/43 922 0 replica 256/43 922 0.01 logical 256/43 924 0.2 logical (compressed) 256/43 672 -27 * pgbench -i -s 20; update pgbench_accounts set abalance = 1000;
  21. MVCC и Autovacuum 03 dataegret.com Postmaster и клиенты. Postgres memory

    и ввод-вывод. Write-Ahead Log и WAL writer. MVCC и Autovacuum. Checkpoint'ы и Bgwriter. Потоковая репликация. Stats collector и Logger.
  22. MVCC и Autovacuum 03 dataegret.com MVCC (Multi-Version Concurrency Control): •

    Хорошая производительность при конкурентном доступе. • При высокой активности на чтение/запись. • Читатели не блокируют читателей, Писатели не блокируют писателей. • Почти...
  23. MVCC и Autovacuum 03 dataegret.com transaction id timeline xid 1000

    snapshot ? unfinished transaction finished transaction ? ? ?
  24. MVCC и Autovacuum 03 dataegret.com Created: 123 Deleted: Created: 123

    Deleted: 456 Created: 456 Deleted: Created: 456 Deleted: 789 Вставка (INSERT) строки транзакцией №123 Обновление (UPDATE) строки транзакцией №456 Удаление (DELETE) строки транзакцией №789
  25. MVCC и Autovacuum 03 dataegret.com Уровни изоляции транзакций. Правила проверки

    видимости работают со служебными полями. Побочный эффект от MVCC – наличие устаревших версий строк. Задача вакуума – убирать устаревшие версии строк.
  26. Autovacuum 03 dataegret.com AV Launcher AV Worker Postmaster Initialization Shared

    memory Initialization Scan pg_class Check relations Do vacuum Recheck relations Process relations Vacuum/Analyze/Wrap ? Balance costs Process 1 relation Open relation Perform checks Set Xid limits Open indexes Prune HOT chains Freeze tuples Remove idx entries Vacuum heap Vacuum pages Update FSM, VM Close indexes Truncate relation Update FSM Update pg_class Close relation Vacuum TOAST ? Postgres Backend FREEZE ? 1 2 1 2 1 1 1 2 yes FULL ? CLUSTER yes no https://www.slideshare.net/alexeylesovsky/nine-circles-of-inferno-or-explaining-the-postgresql-vacuum
  27. Autovacuum 03 dataegret.com Общий взгляд на autovacuum и ключевые моменты

    работы. Подходы в настройке autovacuum. Потенциальные проблемы.
  28. Autovacuum – общий взгляд 03 dataegret.com Postmaster запускает и AV

    Launcher, и воркеров. AV Launcher решает какую базу вакуумить. Воркер запускается против базы и строит список таблиц для вакуума.
  29. Autovacuum – ключевые моменты 03 dataegret.com Как выбирается таблица? •

    На основе reltuples, n_dead_tuples, changes_since_analyze. • thresh = base_thresh + scale_factor * reltuples
  30. Autovacuum – ключевые моменты 03 dataegret.com Как регулируется нагрузка создаваемая

    вакуумом: • За обработку страницы начисляются очки. • При достижении лимита очков, вакуум ставится на паузу. • После паузы вакуум продолжается, набранные очки сбрасываются. • Лимит очков делится поровну на всех активных воркеров.
  31. Autovacuum – ключевые моменты 03 dataegret.com Как регулируется нагрузка создаваемая

    вакуумом: • За обработку страницы начисляются очки. • При достижении лимита очков, вакуум ставится на паузу. • После паузы вакуум продолжается, набранные очки сбрасываются. • Лимит очков делится поровну на всех активных воркеров. А что если покрутить величину паузы и размер лимита?
  32. Autovacuum – ключевые моменты 03 dataegret.com Antiwraparound vacuum: • Предотвращает

    потерю данных. • Довольно тяжелый до версии 9.6.
  33. Anti-wraparound vacuum 03 dataegret.com recentXid – текущая транзакция. vacuum_freeze_min_age –

    строки с возрастом старше должны быть заморожены. vacuum_freeze_table_age – полное сканирование, если достигнут возраст. autovacuum_freeze_max_age – возраст принудительного запуска wraparound- вакуума.
  34. Autovacuum 03 dataegret.com Агрессивный вакуум, подход через cost-параметры: autovacuum_vacuum_cost_delay =

    10ms – по-умолчанию 20ms vacuum_cost_page_hit = 1 – по-умолчанию 1 vacuum_cost_page_miss = 2 – по-умолчанию 10 vacuum_cost_page_dirty = 5 – по-умолчанию 20 autovacuum_vacuum_cost_limit = 1000 – по-умолчанию -1 Предполагаемая нагрузка: 80MB/s чтение, 16MB/s запись.
  35. Autovacuum 03 dataegret.com Агрессивный вакуум, подход через threshold: autovacuum_max_workers =

    10 – по-умолчанию 3 autovacuum_naptime = 1s – по-умолчанию 1min autovacuum_vacuum_threshold = 50 – по-умолчанию 50 autovacuum_analyze_threshold = 50 – по-умолчанию 50 autovacuum_vacuum_scale_factor = 0.05 – по-умолчанию 0.2 autovacuum_analyze_scale_factor = 0.05 – по-умолчанию 0.1 Вакуумить чаще и меньшими порциями.
  36. Autovacuum 03 dataegret.com Потенциальные проблемы: • Нагрузка на storage –

    пересмотреть cost_delay, cost_limit. • Большой объем генерируемого WAL (+лаг репликации). • Затяжной вакуум (особенно при дефолтах) + bloat таблиц. • Риск wraparound, аварийное выключение.
  37. План 03 dataegret.com Postmaster и клиенты. Postgres memory и ввод-вывод.

    Write-Ahead Log и WAL writer. MVCC и Autovacuum. Checkpoint'ы и Bgwriter. Потоковая репликация. Stats collector и Logger.
  38. Checkpoint'ы и Bgwriter 03 dataegret.com Checkpointer process – cоздает контрольные

    точки: • Сбрасывает «грязные» страницы в момент создания КТ. • Обновляет pg_control после КТ. Background Writer – сбрасывает «грязные» страницы постоянно.
  39. Checkpoint'ы и Bgwriter 03 dataegret.com Особенности чекпоинтов: • Выполняются с

    интервалом. • Выполняются при выключении постгреса – важно при рестарте. • Риск нагрузки на storage.
  40. Checkpoint'ы и Bgwriter 03 dataegret.com Конфигурирование чекпоинтов: • Что легче

    – записать 64GB в 5 минут или 60 минут? • Главная мысль – разумно растянуть чекпоинт по времени: • max_wal_size = ⅒ от размера инстанса – по-умолчанию 1GB • checkpoint_timeout = 1h – по-умолчанию 5min • checkpoint_completion_target = 0.9 – по-умолчанию 0.5 • full_page_writes – быть или не быть? – по-умолчанию «on»
  41. Checkpoint'ы и Bgwriter 03 dataegret.com Конфигурирование Bgwriter: • Главная мысль

    – максимум агрессивности: • bgwriter_delay = 10ms – по-умолчанию 200ms • bgwriter_lru_maxpages = 1000 – по-умолчанию 100 • bgwriter_lru_multiplier = 10.0 – по-умолчанию 2.0
  42. Checkpoint'ы и Bgwriter 03 dataegret.com Особенности эксплуатации: • Достаточно настроить

    один раз. • Мониторинг – pg_stat_bgwriter, постгресовый лог.
  43. План 03 dataegret.com Postmaster и клиенты. Postgres memory и ввод-вывод.

    Write-Ahead Log и WAL writer. MVCC и Autovacuum. Checkpoint'ы и Bgwriter. Потоковая репликация. Stats collector и Logger.
  44. Потоковая репликация 03 dataegret.com Потоковая репликация: • Работает за счет

    передачи и воспроизведения WAL. • Есть и физическая (с 9.0) и логическая (с 10.0). • Легко настраивается, простая и надежная. Ограничения и недостатки: • Работает в 1 поток.
  45. Потоковая репликация 03 dataegret.com Мастер Реплика 5. Получение стартовой позиции

    6. Проверка наличия журнала 7. Запуск WAL sender, отправка журнала 11. Обновление статистики 1. Проверка источника XLOG 2. Запуск WAL receiver 3. Вычисление стартовой позиции 4. Подключение к мастеру, отправка позиции 8. Запись журнала на диск 9. Обновление «отметки» 10. Отправка статистики 11. Воспроизведение журнала Начальная фаза Цикл репликации
  46. Потоковая репликация 03 dataegret.com Какие бывают проблемы: • Лаг репликации:

    • Network/Storage/CPU/Stuck consumer. • Конфликты репликации. • Bloat таблиц/индексов.
  47. Потоковая репликация 03 dataegret.com Особенности настройки: • max_wal_senders – по-умолчанию

    0 • wal_keep_segments – по-умолчанию 0 • wal_sender_timeout – по-умолчанию 60s • wal_receiver_timeout – по-умолчанию 60s • track_commit_timestamp = on – по-умолчанию «off» • hot_standby = on – по-умолчанию «off» • hot_standby_feedback – по-умолчанию «off» • max_standby_streaming_delay – по-умолчанию 30s
  48. План 03 dataegret.com Postmaster и клиенты. Postgres memory и ввод-вывод.

    Write-Ahead Log и WAL writer. MVCC и Autovacuum. Checkpoint'ы и Bgwriter. Потоковая репликация. Stats collector и Logger.
  49. Stats collector и Logging 03 dataegret.com Трекинг событий: • DEBUG,

    INFO, NOTICE, WARNING, ERROR, LOG, FATAL, PANIC. Мониторинг активности: • Системные функции и представления. • Extension'ы.
  50. Stats collector и Logging 03 dataegret.com Статистика и логирование: •

    track_commit_timestamp = on • log_checkpoints = on • log_line_prefix = '%m %p %u@%d from %h [vxid:%v txid:%x] [%i] ' • log_lock_waits = on • log_temp_files = 0 • log_min_duration_statement = 1000
  51. Stats collector и Logging 03 dataegret.com Статистика и логирование –

    продолжение: • track_counts = on • track_activities = on • track_io_timing = on • track_functions = pl • track_activity_query_size = 8192 • log_autovacuum_min_duration = 10000