61
PostgreSQL: промышленная разработка баз данных Лекции 9&10 Основы внутреннего устройства PostgreSQL. Версионная модель организации параллельного доступа (MVCC). Журнал транзакций (WAL). Проблемы реализации принципов ACID на практике. Уровни изоляции транзакций. Основы администрирования. Настройка производительности. Масштабирование БД.

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Embed Size (px)

Citation preview

Page 1: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленнаяразработка баз данных

Лекции 9&10Основы внутреннего устройства PostgreSQL. Версионная модель организации параллельного доступа (MVCC). Журнал транзакций (WAL). Проблемы реализации принципов ACID на практике. Уровни изоляции транзакций.

Основы администрирования. Настройка производительности.

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

Page 2: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Устройство сервера (схема backend­а)

Page 3: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

ACID

Atomicy Consistency Isolation Durability

Все четыре свойства — фундаментальные для любой СУБД

Page 4: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Управление транзакциями

Главное свойство:

до и после транзакции — согласованное состояние БД

    START TRANSACTION;    ...    COMMIT; ­­   ROLLBACK;или

Кроме этого:

изолированность пользователей

Page 5: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Проблемы изоляции

Феномены:

Грязное чтение (dirty read)

Неповторяемое чтение (unrepeatable read)

Фантомы

Уровни изоляции:

READ UNCOMMITED

READ COMMITED

REPEATABLE READ

SERIALIZABLE

В PostgreSQL:

READ COMMITED вместо READ UNCOMMITED;

SERIALIZABLE вместоREPEATABLE READ.

Page 6: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

MVCC: Multi­Version Concurrency Control

При старте транзакции PostgreSQL пишет xid (ID транзакции) в pg_clog каждая запись имеет xid_start и xid_end каждая транзакция видит версию базы в момент xid_start записи не удаляются, а просто помечаются xid_end

Уровень READ COMMITED:

Каждая транзакция видит только результаты успешно завершённых транзакций и резульат собственных успешно завершившихся операций

Требуется «пылесос» (VACUUM) — пересмотр информации о свободном месте.

VACUUM FULL физически удаляет данные и производит «дефрагментацию»

Page 7: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Страница данных (heap, index)

Page 8: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Структура хранения индексов (index) – та же, что и для данных (heap)

Page 9: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Содержимое кортежа данных (tuple)

OID — object id of tuple cmin — creation command id cmax — destruction command id xmin — creation transaction id xmax — destruction transaction id ctid — tuple id (page/item) natts — number of attributes hoff — lenght of tuple header bits — bit map representing NULL values attribute1 attribute2 ...

Page 10: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Write Ahead Log (WAL)

механизм протоколирования всех транзакций позволяет восстановить систему после возможных сбоев

все изменения данных записываются на диск только после их гарантированного журналирования в WAL

PITR – Point In Time Recovery fsync=off – только если 100%­ная гарантия надёжности железа

Page 11: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Схема работы PostgreSQL

Page 12: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Диагностика проблем производительности

Средства операционной системы

Тесты производительности (benchmarks)

Средства PostgreSQL: логи, статистика

Системы внешнего мониторинга

Page 13: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Средства операционной системы

psВозможность увидеть PostgreSQL­процессы− Понимание конкуретной работы с CPU и RAM− Возможность заметить долгие запросы

Page 14: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Средства операционной системы

mpstatПросмотр активности каждого CPU− Используются ли все процессоры?− Является ли CPU узким местом?− Диагностика context switches

Page 15: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Средства операционной системы

vmstat, freeПросмотр использования памяти− Оценка размеров дискового кэша− Хватает ли серверу PostgreSQL памяти?− Не происходит ли swapping­а?

Page 16: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Средства операционной системы

iostatПросмотр дисковой активности− Сервер достиг предела по I/O?− Все ли диски выдают ожидаемый I/O?− Мониторинг checkpoint­ов

Page 17: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Тесты производительности(benchmarks)

bonnie++Тест дисковой подсистемы− Измерьте производительность дисков− Знайте скорость Sequential/Random Read/Write и Random Seek своих дисков

Page 18: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Тесты производительности(benchmarks)

contrib/pgbenchПростейший тест базы данных− Тестирует I/O и скорость соединений− Не тестирует: блокировки, вычислительные задачи, планирование запросов

− Удобен для обнаружения больших HW+OS проблем, мало пригоден для тонкой настройки

Тестируйте систему, подобную вашей− База в shared_buffers− База в дисковом кэше− База не помещается в RAM

Page 19: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Тесты производительности(benchmarks)

contrib/pgbench

Автор: Грег Смит

Page 20: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQLСредства

pg_stat_database, pg_database_size()

Вы должны знать общие параметры БД: Количество соединений Количество транзакций Количество commit­ов и rollback­ов Количество hit­ов (попаданий в буфер) Размер базы данных (помещается в RAM?)

Page 21: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQLСредства

pg_tables, pg_relation_size()Вы должны знать общие параметры таблиц:

Количество таблиц Размеры таблиц Размеры индексов Количество триггеров «Вздутие» таблиц (bloating)

Page 22: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQLСредства

pg_stat_activity, pg_locksДетали конкурентного доступа к таблицам

Оценка количества idle­соединений Runtime­оценка долгих запросов Лучше, чем ps – больше деталей Все ли нормально с блокировками? Нет ли WAITING­бакендов?

Page 23: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQLСредства

pg_stat[io]_user_tables, pg_stat[io]_user_indexes

Статистика доступа к таблицам Количество SELECT/INSERT/UPDATE/DELETE Количество seqscan vs. indexscan Есть ли неиспользуемые индексы? Drop it! Есть seqscan­ы по большим таблицам? CREATE 

INDEX

Page 24: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQLСредства

pg_stat_bgwriter− Можно видеть, как bgwriter чистит кэш− Помогает при затруднении проходимости 

checkpoint­ов

Page 25: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Системы внешнего мониторинга

PgFouine (анализ логов) Zabbix− Легко расширяется Nagios− Готовое расширение для PostgreSQL pgsnmpd – SNMP­агент для PostgreSQL

Page 26: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Системы внешнего мониторинга

Примеры запросов для мониторинга:select datname,now()-query_start as duration,current_query from

pg_stat_activity;

select datname, case when blks_read = 0 then 0 else blks_hit / blks_read end as ratio from pg_stat_database;

select relname,seq_scan,idx_scan, case when idx_scan = 0 then 100 else seq_scan / idx_scan end as ratio from pg_stat_user_tables order by ratio desc;

select relname,n_tup_ins,n_tup_upd,n_tup_del from pg_stat_user_tables order by n_tup_upd desc;

select indexrelname,idx_tup_read,idx_tup_fetch,case when idx_tup_fetch = 0 then 100 else idx_tup_read / idx_tup_fetch end as ratio from pg_stat_user_indexes order by ratio desc;

select relname,n_tup_ins,n_tup_upd,n_tup_del from pg_stat_user_tables order by n_tup_upd desc;

select l.mode,d.datname,c.relname,l.granted,l.transactionid from pg_locks as l left join pg_database as d on l.database= d.oid left join pg_class as c on l.relation = c.oid;

Page 27: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

postgresql.conf

shared_buffers = 25 ÷ 35% RAMРазмер разделяемой памяти

work_mem = free / max_nconn * 1 ÷ 3Неразделяемая память для сортировок, аггрегирования, вычисления хэш­функций. malloc до нескольких раз за соединение

effective_cache_size = 2/3 * RAMСредний размер дискового кеша

checkpoint_timeout = 600 ÷ 900 secМакс. время между WAL chekpoint­ами

Page 28: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Схема работы PostgreSQL

Page 29: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

postgresql.conf

checkpoint_segments = 3 ÷ 10Макс. время между WAL checkpoint­ами, в WAL­сегментах размером 16MB

commit_delay, commit_siblingsЗадержка и сброс нескольких активных транзакций в 

WAL одним вызовом fsync maintenance_work_mem = 75% от 

pg_relation_size('the_biggest_table')Размер памяти для VACUUM, ANALYZE, CREATE 

INDEX

Page 30: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

postgresql.conf

max_fsm_pages = (n измененных рядов)Количество дисковых страниц, используемых для 

Free Space Map. Правильная настройка может отменить необходимость в VACUUM FULL и REINDEX.

random_page_cost = 2.0 ÷ 4.0Оценка времени случайного доступа (пробег по индексу). 2.0 в случае быстрых дисков, 4.0 в случае, если БД не помещается в RAM

wal_buffers = defaultРазмер буфера WAL в разделяемой памяти, важен для больших транзакций. Забудьте это.

Page 31: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

postgresql.conf

log_destination = 'syslog' redirect_stderr = off silent_mode = on log_min_duration_statement = 500 log_duration = off log_statement = 'none'

Настройки для логгирования через syslog запросов, медленнее 500ms (pgFouine)

Page 32: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

postgresql.conf

stats_command_string = on update_process_title = on stats_start_collector = on stats_block_level = on stats_row_level = on

Настройки для сбора row­level статистики. Ухудшают производительность на ~5%, но дают возможность работы с вышеуказанными сиcтемными представлениями и необходимы для autovacuum

Page 33: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

postgresql.conf

autovacuum = onАвтовакуум

autovacuum_naptime = 1 ÷ 10 minВремя между последовательными автоматическими запусками автовакуума

autovacuum_vacuum_threshold, autovacuum_analyze_threshold = 250 ÷ 1000Пороги по количеству измененных рядов для запуска VACUUM или ANALYZE на конкретную таблицу

Page 34: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

postgresql.conf

vacuum_cost_delay = 50 ÷ 250 msОткладывание VACUUM на данное время

vacuum_cost_limit = 100 ÷ 200Откладывание VACUUM при достижении данной стоимости операций

vacuum_page_hit = 1 ÷ 10Условная стоимость одной из основных операций 

VACUUM

Page 35: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Bgwriter & shared buffers flags (BM_DIRTY) refcount (is pinned?) usage_count (BM_MAX_USAGE_COUNT)

LRU – Least Recently Used Round

Page 36: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Bgwriter & shared buffers bgwriter_delay = 50 ÷ 200 msПауза между циклами bgwriter­а

bgwriter_lru_percent = 1.0 ÷ 5.0Предел на сканирование LRU­буферов / цикл

bgwriter_all_percent = 0.3 ÷ 1.0Предел на сканирование всех буферов / цикл

bgwriter_lru_maxpages = 5 ÷ 20Количество LRU­буферов, записанное на диск / цикл

bgwriter_all_maxpages = 5 ÷ 20

Page 37: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQLПроизводительность

Диски > RAM > CPU Чем больше дисков, тем лучше Отделяйте pg_xlog от данных RAID 1+0 / 0+1 > RAID 5 Не ставьте на сервер другие приложения

Page 38: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQLПроизводительность

Диски > RAM > CPU Чем больше дисков, тем лучше Отделяйте pg_xlog от данных RAID 1+0 / 0+1 > RAID 5 Не ставьте на сервер другие приложения

Page 39: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Репликация

Отказоустойчивость Балансировка нагрузки Масштабирование

Page 40: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

(failover)Отказоустойчивость

Page 41: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Балансировка нагрузки

Load balancer

Page 42: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Масштабирование(scale-out, scale-up)а не

Page 43: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Репликация

Master/Slave – synchronous Master/Slave – asynchronous Multi­Master – synchronous Multi­Master – asynchronous

Page 44: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

РепликацияMaster/Slave – synchronous

sync

Page 45: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

РепликацияMaster/Slave – asynchronous

async

Page 46: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

РепликацияMulti-Master – synchronous

sync

Page 47: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

РепликацияMulti-Master – asynchronous

async

With conflicts resolution!

Page 48: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Pgpool-II

pgpool

INSERT, UPDATE, DELETEна все узлы

SELECT на один узел

Page 49: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Pgpool-II

Менеджер соединений (connection pooling + кеш)

Failover (обнаружение отказа и переключение на резервный сервер)

Репликация (синхронная, мульти­мастер)

Page 50: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Pgpool-II

Балансировка нагрузки Master/Slave режим ­­ работа вместе с другой системой репликации: Slony­I, WAL, ...

Параллельное выполнение запросов Нет ограничений на число узлов кластера (как было в pgpool­I)

Кэш запросов GUI Линейная масштабируемость на «dblink»­запросах

Page 51: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Pgpool-II

Page 52: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Slony-I Master to multiple slaves

Самая известная репликация для PostgreSQL

Асинхронная система

Десятки слейвов

Каскады реплицируемых серверов

Page 53: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Slony-I

Page 54: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PgCluster Синхронный мультимастер

Балансировка нагрузки

Высокодоступная (HA) система

Cluster DBs, Load Balancer, Replicator

Для ленивых: решение от Cybertec, Austria

Page 55: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

WAL shipping

Асинхронная система

Встроена в PostgreSQL

Hot backup

Нельзя читать со слейвов

walmgr.py

Скоро read queries!

Page 56: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Skype

PL/Proxy: проксирование запросов

PgBouncer: легкий менеджер соединений

SkyTools: управление кластером

Page 57: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Skype

Page 58: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Skype

Page 59: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Skype

Page 60: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Литература: рекомендации для данной  лекции

● PostgreSQL Documentation● Chapter 13. Concurrency Control● Chapter 14. Performance Tips● III. Server Administration● Chapter 43. Overview of PostgreSQL Internals● Chapter 53. Database Physical Storage

● Гарсиа­Молина, Г., Ульман, Дж., Уидом, Дж. Системы баз данных. Полный курс.

● 8.6. Транзакции и SQL● Глава 11. Принципы хранения информации

● Кузнецов С. Д. Введение в модель данных SQL  http://www.intuit.ru/department/database/sqlmdintro/ 

● Лекция 8. Средства языка SQL для обеспечения авторизации доступа к данным, управления транзакциями, сессиями и подключениями

● Bruce Momjian's writings http://momjian.us/main/writings/pgsql 

● Русскоязычные статьи http://postgresmen.ru/articles/ 

Page 61: PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

PostgreSQL: промышленная разработка баз данных. Лекции 9 и 10

Контакты

[email protected]

● Blog: http://nikolay.samokhvalov.com

● XMPP/GTalk: [email protected]

● Skype: samokhvalov & postgresmen

● +7 905 783 9804