Vladislav Shpilevoy PRO
Database C developer at Tarantool. Backend C++ developer at VirtualMinds.
Научный руководитель:
Волканов Дмитрий Юрьевич
Научный консультант:
Осипов Константин Аркадьевич
Выполнил:
Шпилевой Владислав Дмитриевич
СУБД
База
данных
API
Задачи СУБД:
Two-Phase Commit
Классический 2PC устарел:
API
Pelkonen T. et al. Gorilla: A fast, scalable, in-memory time series database //Proceedings of the VLDB Endowment. – 2015. – Т. 8. – No. 12. – Pages 1816-1827.
[1]
Реализовать и исследовать распределённый алгоритм двухфазного коммита для баз данных на основе архитектуры базы данных Tarantool.
СУБД
База
данных
Atomicity Consistency Isolation Durability
Транзакции - единицы оперирования данными и гарант всех четырех свойств.
2. Ullman J. D., Garcia-Molina H., Widom J. Database Systems: The Complete Book. – 2002.
[2]
Устойчивость к ошибкам с помощью WAL -
Write Ahead Log.
BEGIN
DML операции
ROLLBACK
COMMIT
Лог
менеджер
конфликтов
ROLLBACK
Применение
OK
Репликация
Фрагментация
2PC Транзакции
Фаза 1: Рассылка и голосование
Фаза 2: Применение результата
Клиенты
Network
Thread
Transactions
Thread
WAL
Thread
Шина обмена сообщениями
In-memory данные
Дисковые данные
t, время
Поток 1
Поток 2
Поток 3
Файбер 1
Файбер 2
Файбер 3
Внутри потока:
Thread
Thread
Thread
Классический
Координатор
Участники
Log(Prepare Txn)
Send(Prepare Txn) x Nучастников
Каждый решает,
может ли сделать Commit, пишет в лог и отправляет ответ
Forced Log(Decision about Txn)
Send(Decision about Txn)
Фаза 1
Фаза 2
Есть хоть один отрицательный ответ?
Да
Нет
Forced Log(Abort Txn)
Forced Log(Commit Txn)
Send(Abort Txn) x N
Send(Commit Txn) x N
Пришел Commit?
Да
Нет
Forced Log(Commit Txn)
Apply Txn
Forced Log(Abort Txn)
Abort Txn
Ack
Presumed-commit
Presumed-either
Presumed-abort
Меньше посылок по сети и форсированных логов в случае "угадывания" результата транзакции.
Как результат, экономия форсированных логов и сетевых сообщений в большем числе исходов.
Классический 2PC + Presumed Commit
Network Thread
Шардинг
Шард...
Шард...
Шард...
Шард
Хеш-таблица соединений
Connection 1
Хеш-таблица идентификаторов транзакций
. . .
TX Thread
Хеш-таблица восстанавливаемых транзакций и TX менеджер
Transaction 1
is_2PC: bool;
is_prepared: bool;
coordinator_id: int;
memory_allocator: allocator;
. . .
Transaction K
Connection N
WAL Thread
Прием сообщений из очереди и запись в лог
WAL Request M
rows: forward_list;
rows[i]: {
type: Abort/Commit/Prepare,
data: encoded_binary
};
. . .
WAL Request 1
Шина обмена сообщениями
. . .
Форсированные логи не блокируют работу
Не нужно Abort участникам, ответившим "нет" на Prepare - они откатываются сразу
2PC Txn1
Single node Txn2
Forced Log
Wait finish...
Commit and forced log
Wait finish...
Finish
Finish
У
К
У
У
У
prepare
К
ok
ok
ok
not ok + abort
К
abort
Планы:
Реализованное решение верное, но можно значительно ускорить. Нужны скорости порядка тысяч транзакций.
By Vladislav Shpilevoy
Database C developer at Tarantool. Backend C++ developer at VirtualMinds.