SlideShare a Scribd company logo
Длинная
транзакция,
или когда размер
имеет значение
Mikhail Balayan, database architect
Ingram Micro Cloud
Учет использования ресурсов
Выбрали
подписки
Запросили
объемы
потребления*
Обновили*
* в 16 потоков
Учет использования ресурсов в цифрах
• Большая таблица ресурсов (> 12 миллионов строк);
• 1% обновлений (~ 250 тысяч update’ов);
• С соблюдением иерархии (customer – reseller -- provider);
• С бизнесовой проверкой на превышение ограничений;
• В несколько потоков (16 по умолчанию);
Код процедуры обновления, hibernate
SELECT subscription_id FROM subscriptions
WHERE app_id = <dropbox_id>;
…
Get cur_usage_value from external API call;
SELECT * FROM resources
WHERE resource_id = <resource_id> FOR UPDATE;
IF cur_usage_value < usage_limit THEN
UPDATE resources
SET usage_value = cur_usage_value
WHERE resource_id = <resource_id>;
Тестирование, обычно
Тестирование, однажды
241 712 ресурсов
1 час 13 минут
165 425 ресурсов
3 часа 17 минут
44% за 10 минут
Причина?
• Проблемы сервера;
• Проблемы настроек базы;
• Автовакуум
• Фоновая нагрузка;
Эврика!
=# begin;
=# create table x(n numeric);
=# <оставляем транзакцию открытой>
• Не создает нагрузки
• Не блокирует бизнесовые
таблицы
Вывод
НЕ ИСПОЛЬЗУЙТЕ
ДЛИННЫЕ
ТРАНЗАКЦИИ
Вопросы
• Почему именно этот
функционал?
• Что можно с этим
сделать?
• 10% за 1 минуту?!
Длинная транзакция –
это сколько?
Что имеем
Воспроизводимость
PostgreSQL 9.6
Подробный лог активности приложения
Фоновая активность приложения
Java
Hibernate
x3
x3
Код процедуры обновления, postgresql
PERFORM pg_sleep(0.003);  имитация задержки
cur_usage_value := trunc(random()*10000);
FOREACH resource IN resource_id LOOP
SELECT *
FROM resources
WHERE resource_id = <resource_id>
FOR UPDATE;
END LOOP;
IF cur_usage_value < usage_limit THEN
FOREACH resource IN resource_id LOOP
UPDATE resources
SET usage_value = cur_usage_value
WHERE resource_id = <resource_id>;
END LOOP;
TIMEPOINTS
(BREAKPOINTS)
1
2
3
4
5
6
Проблемный запрос
…
FOREACH resource IN resource_id LOOP
SELECT *
FROM resources
WHERE resource_id = <resource_id>
FOR UPDATE;
END LOOP;
…
Анатомия транзакций в PostgreSQL
• Что такое транзакция
• Как PostgreSQL обеспечивает согласованность и изолированность
• Некоторые оптимизации PostgreSQL
• И роль длинной транзакции
• Решения (или хотя бы попытки уменьшить влияния)
• Как понять, что у вас проблема распухших записей и длинных
транзакций
Транзакция
Транзакция — группа последовательных операций с базой
данных, которая представляет собой логическую единицу работы с
данными. Транзакция может быть выполнена либо целиком и
успешно, соблюдая целостность данных и независимо от
параллельно идущих других транзакций, либо не выполнена
вообще, и тогда она не должна произвести никакого эффекта.
Одним из наиболее распространённых наборов требований
к транзакциям и транзакционным системам является набор ACID
(Atomicity, Consistency, Isolation, Durability).
(wikipedia)
Multi-Version Concurrency Control
• Читатели не блокируют писателей и других читателей
• Писатели не блокируют читателей и других писателей*
• Все транзакции работают со своими версиями данных
(снимками)
• Т.е. имеем хорошую параллельность, но…
* если, конечно, писателям не нужно менять данные, которые изменены в транзакции,
которая ещё не завершена
Pages
Heap tuples
Heap tuple example
=# create table demo(i int);
=# insert into demo values(1);
=# select lp, t_xmin, t_xmax
from heap_page_items(get_raw_page('demo', 0));
lp | t_xmin | t_xmax
----+--------+--------
1 | 456 | 0
=# update demo set i = 2;
=# select lp, t_xmin, t_xmax
from heap_page_items(get_raw_page('demo', 0));
lp | t_xmin | t_xmax
----+--------+--------
1 | 456 | 457
2 | 457 | 0
Для использования функций из примера, нужно установить расширение pageinspect
| 456 | 0
| 457
| 457 | 0
Heap tuple rollback example
=# begin;
=# delete from demo where i = 2;
=# rollback;
=# select lp, t_xmin, t_xmax
from heap_page_items(get_raw_page('demo', 0));
lp | t_xmin | t_xmax
----+--------+--------
1 | 456 | 457
2 | 457 | 458| 458
Commit Log
=# INSERT;
lp | t_xmin | t_xmax
1 | 456 | 0
=# UPDATE;
lp | t_xmin | t_xmax
1 | 456 | 457
2 | 457 | 0
=# BEGIN;DELETE;
lp | t_xmin | t_xmax
1 | 456 | 457
2 | 457 | 458
=# ROLLBACK;
t1
t2
t3
t4
456
COMMITED
...
456
COMMITED
457
COMMITED
...
456
COMMITED
457
COMMITED
...
458
IN_PROGRESS
456
COMMITED
457
COMMITED
...
458
ABORTED
Transaction snapshot
=# begin;
=# SELECT txid_current();
txid_current
-------------
470
=# SELECT txid_current_snapshot();
txid_current_snapshot
-------------------------------------
463:470:463,466
xmin. Все транзакции до этой – неактивны
xmax. Все транзакции, начиная с этой – активны
xid_list. И эти – активны
Reminder: problem query
SELECT *
FROM resources
WHERE resource_id = <resource_id>
FOR UPDATE;
Indexes
HOT (Heap Only Tuple) Update
Single-page cleanup (minivacuum)
Long transaction suddenly comes
1 value - 16 references from index to heap
1 value - 128 tuples
Домашнее задание
TRANSACTION 01:
psql> create table x
(n numeric primary key,
s varchar);
psql> insert into x values (1, 'xxxxxx');
psql> alter table x
set (autovacuum_enabled = off);
TRANSACTION 02:
psql> begin;
psql> select txid_current();
psql> <оставляем транзакцию открытой>
BASH:
$ while :; do psql -c "update x set s =
md5(random()::text) where n = 1;" > /dev/null; done
Домашнее задание (cont.)
psql> explain analyze select count(*) from x where n = 1;
--------------------------------------------------------------------------
Aggregate (cost=8.31..8.32 rows=1 width=8) (actual time=0.030..0.031 rows=1
loops=1)
-> Index Only Scan using x_pkey on x (cost=…) (actual time=0.012..0.026
rows=1 loops=1)
Index Cond: (n = '1'::numeric)
Heap Fetches: 1
Planning time: 0.086 ms
Execution time: 0.058 ms
Домашнее задание (cont.)
psql> explain analyze select count(*) from x where n = 1;
Time elapsed,
minutes
# of updates Heap Fetches Execution
time, ms
0 0 1 0.058
5 34 636 289 1.906
10 62 780 524 3.448
20 108 291 903 6.093
30 145 729 1215 8.170
Выводы
1. Данные особо не меняются? Длинные транзакции – не
проблема;
2. Активно меняются, но равномерно размазаны? Не такая
большая проблема;
3. Активно меняются одни и те же данные? Избегай длинных
транзакций;
4. Не можешь? Уводи их на асинхронную реплику*;
5. Не можешь гарантировать их отсутствие? Снижай побочные
эффекты, уменьшай количество порождаемых таплов.
Bulk updates
# Bulk size
Without long
transaction
With long
transaction
Degradation
1
(Bulk size = 1)
no bulk optimization
135 59 56%
2 Bulk size = 5 134 129 3.7%
3 Bulk size = 10 132 131 0.8%
4 Bulk size = 100 102 100 2%
Скорость обработки 50 000 подписок в зависимости от размера пачки
Mikhail
mbalayan@odin.com
Tuples visibility rules

More Related Content

What's hot

Dennis Anikin - Tarantool Case Studies in Mail.Ru Group
Dennis Anikin - Tarantool Case Studies in Mail.Ru GroupDennis Anikin - Tarantool Case Studies in Mail.Ru Group
Dennis Anikin - Tarantool Case Studies in Mail.Ru Group
Mail.ru Group
 
10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...
10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...
10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...
Ontico
 
Основные кейсы использования in-memory СУБД на примере Тарантула и проектов M...
Основные кейсы использования in-memory СУБД на примере Тарантула и проектов M...Основные кейсы использования in-memory СУБД на примере Тарантула и проектов M...
Основные кейсы использования in-memory СУБД на примере Тарантула и проектов M...
Ontico
 
Опыт миграции между дата-центрами / Михаил Тюрин, Сергей Бурладян (Avito)
Опыт миграции между дата-центрами / Михаил Тюрин, Сергей Бурладян (Avito)Опыт миграции между дата-центрами / Михаил Тюрин, Сергей Бурладян (Avito)
Опыт миграции между дата-центрами / Михаил Тюрин, Сергей Бурладян (Avito)
Ontico
 
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Ontico
 
Пишем свою платформу для управления данными. Это очень просто / Суханов Васил...
Пишем свою платформу для управления данными. Это очень просто / Суханов Васил...Пишем свою платформу для управления данными. Это очень просто / Суханов Васил...
Пишем свою платформу для управления данными. Это очень просто / Суханов Васил...
Ontico
 
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Ontico
 
Отладка и устранение проблем в PostgreSQL Streaming Replication.
Отладка и устранение проблем в PostgreSQL Streaming Replication.Отладка и устранение проблем в PostgreSQL Streaming Replication.
Отладка и устранение проблем в PostgreSQL Streaming Replication.
Alexey Lesovsky
 
Zabbix и миллионы метрик: наилучший опыт масштабного мониторинга / Алексей Вл...
Zabbix и миллионы метрик: наилучший опыт масштабного мониторинга / Алексей Вл...Zabbix и миллионы метрик: наилучший опыт масштабного мониторинга / Алексей Вл...
Zabbix и миллионы метрик: наилучший опыт масштабного мониторинга / Алексей Вл...
Ontico
 
BigПочта: как мы строили DataLake в Почте России / Алексей Вовченко (Luxoft)
BigПочта: как мы строили DataLake в Почте России / Алексей Вовченко (Luxoft)BigПочта: как мы строили DataLake в Почте России / Алексей Вовченко (Luxoft)
BigПочта: как мы строили DataLake в Почте России / Алексей Вовченко (Luxoft)
Ontico
 
Брокер сообщений Kafka в условиях повышенной нагрузки / Артём Выборнов (Rambl...
Брокер сообщений Kafka в условиях повышенной нагрузки / Артём Выборнов (Rambl...Брокер сообщений Kafka в условиях повышенной нагрузки / Артём Выборнов (Rambl...
Брокер сообщений Kafka в условиях повышенной нагрузки / Артём Выборнов (Rambl...
Ontico
 
RootConf 2015
RootConf 2015RootConf 2015
RootConf 2015
Evgeny Uskov
 
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
Ontico
 
В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...
В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...
В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...
Ontico
 
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Ontico
 
Monitoring driven эксплуатация / Николай Сивко (HeadHunter)
Monitoring driven эксплуатация / Николай Сивко (HeadHunter)Monitoring driven эксплуатация / Николай Сивко (HeadHunter)
Monitoring driven эксплуатация / Николай Сивко (HeadHunter)
Ontico
 
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
Ontico
 
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)
Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)
Ontico
 
My talk at Highload++ 2015
My talk at Highload++ 2015My talk at Highload++ 2015
My talk at Highload++ 2015
Alex Chistyakov
 
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
Ontico
 

What's hot (20)

Dennis Anikin - Tarantool Case Studies in Mail.Ru Group
Dennis Anikin - Tarantool Case Studies in Mail.Ru GroupDennis Anikin - Tarantool Case Studies in Mail.Ru Group
Dennis Anikin - Tarantool Case Studies in Mail.Ru Group
 
10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...
10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...
10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...
 
Основные кейсы использования in-memory СУБД на примере Тарантула и проектов M...
Основные кейсы использования in-memory СУБД на примере Тарантула и проектов M...Основные кейсы использования in-memory СУБД на примере Тарантула и проектов M...
Основные кейсы использования in-memory СУБД на примере Тарантула и проектов M...
 
Опыт миграции между дата-центрами / Михаил Тюрин, Сергей Бурладян (Avito)
Опыт миграции между дата-центрами / Михаил Тюрин, Сергей Бурладян (Avito)Опыт миграции между дата-центрами / Михаил Тюрин, Сергей Бурладян (Avito)
Опыт миграции между дата-центрами / Михаил Тюрин, Сергей Бурладян (Avito)
 
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
 
Пишем свою платформу для управления данными. Это очень просто / Суханов Васил...
Пишем свою платформу для управления данными. Это очень просто / Суханов Васил...Пишем свою платформу для управления данными. Это очень просто / Суханов Васил...
Пишем свою платформу для управления данными. Это очень просто / Суханов Васил...
 
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
 
Отладка и устранение проблем в PostgreSQL Streaming Replication.
Отладка и устранение проблем в PostgreSQL Streaming Replication.Отладка и устранение проблем в PostgreSQL Streaming Replication.
Отладка и устранение проблем в PostgreSQL Streaming Replication.
 
Zabbix и миллионы метрик: наилучший опыт масштабного мониторинга / Алексей Вл...
Zabbix и миллионы метрик: наилучший опыт масштабного мониторинга / Алексей Вл...Zabbix и миллионы метрик: наилучший опыт масштабного мониторинга / Алексей Вл...
Zabbix и миллионы метрик: наилучший опыт масштабного мониторинга / Алексей Вл...
 
BigПочта: как мы строили DataLake в Почте России / Алексей Вовченко (Luxoft)
BigПочта: как мы строили DataLake в Почте России / Алексей Вовченко (Luxoft)BigПочта: как мы строили DataLake в Почте России / Алексей Вовченко (Luxoft)
BigПочта: как мы строили DataLake в Почте России / Алексей Вовченко (Luxoft)
 
Брокер сообщений Kafka в условиях повышенной нагрузки / Артём Выборнов (Rambl...
Брокер сообщений Kafka в условиях повышенной нагрузки / Артём Выборнов (Rambl...Брокер сообщений Kafka в условиях повышенной нагрузки / Артём Выборнов (Rambl...
Брокер сообщений Kafka в условиях повышенной нагрузки / Артём Выборнов (Rambl...
 
RootConf 2015
RootConf 2015RootConf 2015
RootConf 2015
 
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
 
В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...
В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...
В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...
 
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
 
Monitoring driven эксплуатация / Николай Сивко (HeadHunter)
Monitoring driven эксплуатация / Николай Сивко (HeadHunter)Monitoring driven эксплуатация / Николай Сивко (HeadHunter)
Monitoring driven эксплуатация / Николай Сивко (HeadHunter)
 
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
 
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)
Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)
 
My talk at Highload++ 2015
My talk at Highload++ 2015My talk at Highload++ 2015
My talk at Highload++ 2015
 
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
 

Similar to Длинная транзакция или когда размер имеет значение / Михаил Балаян (Odin — Ingram Micro)

Scorex framework
Scorex frameworkScorex framework
Scorex framework
Dmitry Meshkov
 
PostgreSQL Streaming Replication
PostgreSQL Streaming ReplicationPostgreSQL Streaming Replication
PostgreSQL Streaming Replication
Alexey Lesovsky
 
SECON'2017, Лесовский Алексей, Потоковая репликация в PostgreSQL.
SECON'2017, Лесовский Алексей, Потоковая репликация в PostgreSQL.SECON'2017, Лесовский Алексей, Потоковая репликация в PostgreSQL.
SECON'2017, Лесовский Алексей, Потоковая репликация в PostgreSQL.
SECON
 
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Badoo Development
 
Что такое Postgresql (Максим Богук)
Что такое Postgresql (Максим Богук)Что такое Postgresql (Максим Богук)
Что такое Postgresql (Максим Богук)Ontico
 
PowerShell
PowerShellPowerShell
PowerShell
GetDev.NET
 
Reactive Extensions
Reactive ExtensionsReactive Extensions
Reactive Extensions
GetDev.NET
 
Cassandra db
Cassandra dbCassandra db
Cassandra db
Andrei Poliakov
 
Oracle Timesten
Oracle TimestenOracle Timesten
Oracle TimestenOntico
 
Дмитрий Меньшиков "Топ-10 фейлов на реальном highload проекте"
Дмитрий Меньшиков "Топ-10 фейлов на реальном highload проекте"Дмитрий Меньшиков "Топ-10 фейлов на реальном highload проекте"
Дмитрий Меньшиков "Топ-10 фейлов на реальном highload проекте"
Fwdays
 
Максим Богук. Postgres-XC
Максим Богук. Postgres-XCМаксим Богук. Postgres-XC
Максим Богук. Postgres-XC
PostgreSQL-Consulting
 
High Load 2009 Dimaa Rus Ready
High Load 2009 Dimaa Rus ReadyHigh Load 2009 Dimaa Rus Ready
High Load 2009 Dimaa Rus ReadyHighLoad2009
 
"Мультимастер для PostgreSQL" Кельвич Станислав, Книжник Константин, PostgresPro
"Мультимастер для PostgreSQL" Кельвич Станислав, Книжник Константин, PostgresPro"Мультимастер для PostgreSQL" Кельвич Станислав, Книжник Константин, PostgresPro
"Мультимастер для PostgreSQL" Кельвич Станислав, Книжник Константин, PostgresPro
it-people
 
Дмитрий Куликовский, Алексей Лавренюк - Построение кластеров, нагрузочное тес...
Дмитрий Куликовский, Алексей Лавренюк - Построение кластеров, нагрузочное тес...Дмитрий Куликовский, Алексей Лавренюк - Построение кластеров, нагрузочное тес...
Дмитрий Куликовский, Алексей Лавренюк - Построение кластеров, нагрузочное тес...Yandex
 
Дмитрий Куликовский - Построение кластеров, нагрузочное тестирование, capacit...
Дмитрий Куликовский - Построение кластеров, нагрузочное тестирование, capacit...Дмитрий Куликовский - Построение кластеров, нагрузочное тестирование, capacit...
Дмитрий Куликовский - Построение кластеров, нагрузочное тестирование, capacit...Yandex
 
PostgreSQL performance recipes
PostgreSQL performance recipesPostgreSQL performance recipes
PostgreSQL performance recipes
Alexey Ermakov
 
Multimaster2
Multimaster2Multimaster2
Multimaster2
Stas Kelvich
 
ClickHouse как решение для бизнес аналитики. Дмитрий Кузьмин
ClickHouse как решение для бизнес аналитики. Дмитрий КузьминClickHouse как решение для бизнес аналитики. Дмитрий Кузьмин
ClickHouse как решение для бизнес аналитики. Дмитрий Кузьмин
HOWWEDOIT
 
Breaking logs
Breaking logsBreaking logs
Breaking logs
Ilya Sergeev
 
Tarantool, .net, newsql
Tarantool, .net, newsqlTarantool, .net, newsql
Tarantool, .net, newsql
Anatoly Popov
 

Similar to Длинная транзакция или когда размер имеет значение / Михаил Балаян (Odin — Ingram Micro) (20)

Scorex framework
Scorex frameworkScorex framework
Scorex framework
 
PostgreSQL Streaming Replication
PostgreSQL Streaming ReplicationPostgreSQL Streaming Replication
PostgreSQL Streaming Replication
 
SECON'2017, Лесовский Алексей, Потоковая репликация в PostgreSQL.
SECON'2017, Лесовский Алексей, Потоковая репликация в PostgreSQL.SECON'2017, Лесовский Алексей, Потоковая репликация в PostgreSQL.
SECON'2017, Лесовский Алексей, Потоковая репликация в PostgreSQL.
 
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
 
Что такое Postgresql (Максим Богук)
Что такое Postgresql (Максим Богук)Что такое Postgresql (Максим Богук)
Что такое Postgresql (Максим Богук)
 
PowerShell
PowerShellPowerShell
PowerShell
 
Reactive Extensions
Reactive ExtensionsReactive Extensions
Reactive Extensions
 
Cassandra db
Cassandra dbCassandra db
Cassandra db
 
Oracle Timesten
Oracle TimestenOracle Timesten
Oracle Timesten
 
Дмитрий Меньшиков "Топ-10 фейлов на реальном highload проекте"
Дмитрий Меньшиков "Топ-10 фейлов на реальном highload проекте"Дмитрий Меньшиков "Топ-10 фейлов на реальном highload проекте"
Дмитрий Меньшиков "Топ-10 фейлов на реальном highload проекте"
 
Максим Богук. Postgres-XC
Максим Богук. Postgres-XCМаксим Богук. Postgres-XC
Максим Богук. Postgres-XC
 
High Load 2009 Dimaa Rus Ready
High Load 2009 Dimaa Rus ReadyHigh Load 2009 Dimaa Rus Ready
High Load 2009 Dimaa Rus Ready
 
"Мультимастер для PostgreSQL" Кельвич Станислав, Книжник Константин, PostgresPro
"Мультимастер для PostgreSQL" Кельвич Станислав, Книжник Константин, PostgresPro"Мультимастер для PostgreSQL" Кельвич Станислав, Книжник Константин, PostgresPro
"Мультимастер для PostgreSQL" Кельвич Станислав, Книжник Константин, PostgresPro
 
Дмитрий Куликовский, Алексей Лавренюк - Построение кластеров, нагрузочное тес...
Дмитрий Куликовский, Алексей Лавренюк - Построение кластеров, нагрузочное тес...Дмитрий Куликовский, Алексей Лавренюк - Построение кластеров, нагрузочное тес...
Дмитрий Куликовский, Алексей Лавренюк - Построение кластеров, нагрузочное тес...
 
Дмитрий Куликовский - Построение кластеров, нагрузочное тестирование, capacit...
Дмитрий Куликовский - Построение кластеров, нагрузочное тестирование, capacit...Дмитрий Куликовский - Построение кластеров, нагрузочное тестирование, capacit...
Дмитрий Куликовский - Построение кластеров, нагрузочное тестирование, capacit...
 
PostgreSQL performance recipes
PostgreSQL performance recipesPostgreSQL performance recipes
PostgreSQL performance recipes
 
Multimaster2
Multimaster2Multimaster2
Multimaster2
 
ClickHouse как решение для бизнес аналитики. Дмитрий Кузьмин
ClickHouse как решение для бизнес аналитики. Дмитрий КузьминClickHouse как решение для бизнес аналитики. Дмитрий Кузьмин
ClickHouse как решение для бизнес аналитики. Дмитрий Кузьмин
 
Breaking logs
Breaking logsBreaking logs
Breaking logs
 
Tarantool, .net, newsql
Tarantool, .net, newsqlTarantool, .net, newsql
Tarantool, .net, newsql
 

More from Ontico

Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Ontico
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Ontico
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Ontico
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
Ontico
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Ontico
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Ontico
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
Ontico
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
Ontico
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Ontico
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Ontico
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Ontico
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Ontico
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
Ontico
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Ontico
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Ontico
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
Ontico
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Ontico
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Ontico
 
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Ontico
 
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)
Ontico
 

More from Ontico (20)

Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
 
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
 
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)
 

Длинная транзакция или когда размер имеет значение / Михаил Балаян (Odin — Ingram Micro)

  • 1. Длинная транзакция, или когда размер имеет значение Mikhail Balayan, database architect Ingram Micro Cloud
  • 3. Учет использования ресурсов в цифрах • Большая таблица ресурсов (> 12 миллионов строк); • 1% обновлений (~ 250 тысяч update’ов); • С соблюдением иерархии (customer – reseller -- provider); • С бизнесовой проверкой на превышение ограничений; • В несколько потоков (16 по умолчанию);
  • 4. Код процедуры обновления, hibernate SELECT subscription_id FROM subscriptions WHERE app_id = <dropbox_id>; … Get cur_usage_value from external API call; SELECT * FROM resources WHERE resource_id = <resource_id> FOR UPDATE; IF cur_usage_value < usage_limit THEN UPDATE resources SET usage_value = cur_usage_value WHERE resource_id = <resource_id>;
  • 6. Тестирование, однажды 241 712 ресурсов 1 час 13 минут 165 425 ресурсов 3 часа 17 минут 44% за 10 минут
  • 7. Причина? • Проблемы сервера; • Проблемы настроек базы; • Автовакуум • Фоновая нагрузка;
  • 8. Эврика! =# begin; =# create table x(n numeric); =# <оставляем транзакцию открытой> • Не создает нагрузки • Не блокирует бизнесовые таблицы
  • 10. Вопросы • Почему именно этот функционал? • Что можно с этим сделать? • 10% за 1 минуту?! Длинная транзакция – это сколько?
  • 11. Что имеем Воспроизводимость PostgreSQL 9.6 Подробный лог активности приложения Фоновая активность приложения Java Hibernate
  • 12. x3 x3 Код процедуры обновления, postgresql PERFORM pg_sleep(0.003);  имитация задержки cur_usage_value := trunc(random()*10000); FOREACH resource IN resource_id LOOP SELECT * FROM resources WHERE resource_id = <resource_id> FOR UPDATE; END LOOP; IF cur_usage_value < usage_limit THEN FOREACH resource IN resource_id LOOP UPDATE resources SET usage_value = cur_usage_value WHERE resource_id = <resource_id>; END LOOP; TIMEPOINTS (BREAKPOINTS) 1 2 3 4 5 6
  • 13. Проблемный запрос … FOREACH resource IN resource_id LOOP SELECT * FROM resources WHERE resource_id = <resource_id> FOR UPDATE; END LOOP; …
  • 14. Анатомия транзакций в PostgreSQL • Что такое транзакция • Как PostgreSQL обеспечивает согласованность и изолированность • Некоторые оптимизации PostgreSQL • И роль длинной транзакции • Решения (или хотя бы попытки уменьшить влияния) • Как понять, что у вас проблема распухших записей и длинных транзакций
  • 15. Транзакция Транзакция — группа последовательных операций с базой данных, которая представляет собой логическую единицу работы с данными. Транзакция может быть выполнена либо целиком и успешно, соблюдая целостность данных и независимо от параллельно идущих других транзакций, либо не выполнена вообще, и тогда она не должна произвести никакого эффекта. Одним из наиболее распространённых наборов требований к транзакциям и транзакционным системам является набор ACID (Atomicity, Consistency, Isolation, Durability). (wikipedia)
  • 16. Multi-Version Concurrency Control • Читатели не блокируют писателей и других читателей • Писатели не блокируют читателей и других писателей* • Все транзакции работают со своими версиями данных (снимками) • Т.е. имеем хорошую параллельность, но… * если, конечно, писателям не нужно менять данные, которые изменены в транзакции, которая ещё не завершена
  • 17. Pages
  • 19. Heap tuple example =# create table demo(i int); =# insert into demo values(1); =# select lp, t_xmin, t_xmax from heap_page_items(get_raw_page('demo', 0)); lp | t_xmin | t_xmax ----+--------+-------- 1 | 456 | 0 =# update demo set i = 2; =# select lp, t_xmin, t_xmax from heap_page_items(get_raw_page('demo', 0)); lp | t_xmin | t_xmax ----+--------+-------- 1 | 456 | 457 2 | 457 | 0 Для использования функций из примера, нужно установить расширение pageinspect | 456 | 0 | 457 | 457 | 0
  • 20. Heap tuple rollback example =# begin; =# delete from demo where i = 2; =# rollback; =# select lp, t_xmin, t_xmax from heap_page_items(get_raw_page('demo', 0)); lp | t_xmin | t_xmax ----+--------+-------- 1 | 456 | 457 2 | 457 | 458| 458
  • 21. Commit Log =# INSERT; lp | t_xmin | t_xmax 1 | 456 | 0 =# UPDATE; lp | t_xmin | t_xmax 1 | 456 | 457 2 | 457 | 0 =# BEGIN;DELETE; lp | t_xmin | t_xmax 1 | 456 | 457 2 | 457 | 458 =# ROLLBACK; t1 t2 t3 t4 456 COMMITED ... 456 COMMITED 457 COMMITED ... 456 COMMITED 457 COMMITED ... 458 IN_PROGRESS 456 COMMITED 457 COMMITED ... 458 ABORTED
  • 22. Transaction snapshot =# begin; =# SELECT txid_current(); txid_current ------------- 470 =# SELECT txid_current_snapshot(); txid_current_snapshot ------------------------------------- 463:470:463,466 xmin. Все транзакции до этой – неактивны xmax. Все транзакции, начиная с этой – активны xid_list. И эти – активны
  • 23. Reminder: problem query SELECT * FROM resources WHERE resource_id = <resource_id> FOR UPDATE;
  • 25. HOT (Heap Only Tuple) Update
  • 27. Long transaction suddenly comes 1 value - 16 references from index to heap 1 value - 128 tuples
  • 28. Домашнее задание TRANSACTION 01: psql> create table x (n numeric primary key, s varchar); psql> insert into x values (1, 'xxxxxx'); psql> alter table x set (autovacuum_enabled = off); TRANSACTION 02: psql> begin; psql> select txid_current(); psql> <оставляем транзакцию открытой> BASH: $ while :; do psql -c "update x set s = md5(random()::text) where n = 1;" > /dev/null; done
  • 29. Домашнее задание (cont.) psql> explain analyze select count(*) from x where n = 1; -------------------------------------------------------------------------- Aggregate (cost=8.31..8.32 rows=1 width=8) (actual time=0.030..0.031 rows=1 loops=1) -> Index Only Scan using x_pkey on x (cost=…) (actual time=0.012..0.026 rows=1 loops=1) Index Cond: (n = '1'::numeric) Heap Fetches: 1 Planning time: 0.086 ms Execution time: 0.058 ms
  • 30. Домашнее задание (cont.) psql> explain analyze select count(*) from x where n = 1; Time elapsed, minutes # of updates Heap Fetches Execution time, ms 0 0 1 0.058 5 34 636 289 1.906 10 62 780 524 3.448 20 108 291 903 6.093 30 145 729 1215 8.170
  • 31. Выводы 1. Данные особо не меняются? Длинные транзакции – не проблема; 2. Активно меняются, но равномерно размазаны? Не такая большая проблема; 3. Активно меняются одни и те же данные? Избегай длинных транзакций; 4. Не можешь? Уводи их на асинхронную реплику*; 5. Не можешь гарантировать их отсутствие? Снижай побочные эффекты, уменьшай количество порождаемых таплов.
  • 32. Bulk updates # Bulk size Without long transaction With long transaction Degradation 1 (Bulk size = 1) no bulk optimization 135 59 56% 2 Bulk size = 5 134 129 3.7% 3 Bulk size = 10 132 131 0.8% 4 Bulk size = 100 102 100 2% Скорость обработки 50 000 подписок в зависимости от размера пачки

Editor's Notes

  1. Слайд скорее формальный, пропустим его. Основы набора были сформулированы Джимом Греем в 1981 и дополнены Изоляцией Андреасом Рейтером и Тео Хэрдером в 1983. Атомарность – либо всё, либо ничего. Согласованность – транзакция после завершения сохраняет согласованность данных в базе. Изолированность – во время выполнения транзакции параллельные транзакции не должны влиять на её результат. Устойчивость – если пользователю было сообщено, что транзакция завершилась успешно, значит его изменения не должны потеряться из-за какого-либо сбоя инфраструктуры (проблемы с хранилищем, сетью, операционкой и т.д.). Тему обеспечения Устойчивости мы рассматривать не будем, т.к. это больше про WAL-логи, а вот остальные требования – это про нас (про MVCC, про то, как организованы данные в базе и какие с этим могут быть связаны проблемы).
  2. Многоверсионность (MVCC) – один из возможных способов организации доступа к данным, который используется во многих СУБД, в том числе и в PostgreSQL. Сплошные плюсы, но за них приходится платить определенную цену.
  3. Как Postgresql хранит свои данные? В таблицах! Таблицы, в свою очередь, физически представляют собой файлы на диске. Каждый файл – это массив страниц (блоков) фиксированной длины, обычно 8КБ. Каждый блок состоит из заголовка, указателей на строки и самих строк.
  4. Каждая строка состоит из Заголовка (23 байта) битовой карты NULL значений – по 1 биту на каждый NULL атрибут (в сумме будет 0 бит, если все NOT NULL) Значения OID строки, если таблица создана с указанием атрибута WITH OID Собственно самих данных
  5. На примере мы видим, как выглядят значения t_xmin и t_xmax в реальности. Наличие в тапле информации о номерах вставившей и изменивших транзакций – хорошо, но не достаточно для того, чтобы понять
  6. В случае, если мы, например, удаляем строку и откатываем транзакцию, отметка о t_xmax остается проставленной. Чтобы решить эту проблему видимости, вводится commit log.
  7. Снимок транзакций хранит информацию о состоянии всех транзакций относительно конкретной транзакции и обеспечивает согласованность данных на определенный момент времени для определенной транзакции. Текстовое представление снимка транзакций можно вывести вызовом функции txid_current_snapshot(); имеет следующий смысл: Xmin – все транзакции с номерами ниже этого уже не активны, значит строки, которые были ими отмечены либо видимы (если были закомичены), либо нет (если был rollback). Xmax – все транзакции, начиная с этой (включительно) – ещё активны, либо даже не начались на момент создания снимка, а значит их изменения нам не доступны. Xid_list – список транзакций между xmin и xmax, которые тоже активны и значит их изменения нам опять же не доступны.
  8. Индекс ссылается на указатель в блоке, который уже ссылается на конкретный тапл. Каждый раз при добавлении нового значения в таблицу, в индекс добавляется новая запись ссылающаяся на соответствующий указатель. Но в нашем случае выполняются обновления поля, которое не индексировано и на этот случай в PostgreSQL есть HOT обновления.
  9. Смысл hot обновления в том, чтобы исключить изменение в индексе. Достигается такое за счет добавления в сам тапл, на который ссылается индекс, ссылки на его следующую версию. Но на этом оптимизационные приемы postgresql не заканчиваются. Что должно произойти, когда мы заполним все 8КБ блока?
  10. Все указатели помечаются как неиспользуемые (Unused). В том указателе, на который ссылается индекс, делается перенаправление на последний актуальный тапл, всё остальное пространство используется по новой. Т.е. выделения нового блока не происходит. Но есть нюанс – мы не можем очистить блоки, созданные позже, чем самая ранняя транзакция в системе.
  11. x=0;SECONDS=0;while :; do x=$(($x+1)); psql -c "update x set s = md5(random()::text) where n = 1;" > /dev/null; duration=$SECONDS; if [ $duration -gt 300 ]; then echo $x; break; fi; done
  12. Создали тестовый стенд состоящий из 50 000 подписок. 131, 132, 135 – чуть более 6 минут на всё 59 – чуть более 14 минут
  13. t_xmin_status – статус транзакции, установившей значение xmin для строки