Comments 4
jepsen тесты уже прошли ? :)
Понятно, что ничего не понятно. Calvin и 2PC имеют выделенный узел - sequencer или координатор транзакций. В первом случае отправляется «спланированная транзакция», а во втором «транзакция». И делается вывод, что первое лучше второго, но в чем их разница не ясно от слова совсем.
Я строю догадки - видимо разница в том, что в Calvin нет параллельных транзакций и потому не нужны блокировки. Вместо выполнения N транзакций одновременно выполняется одна, а N+1 параллельно готовятся к выполнению, загружаются данные, вычисляются хеши и все в этом духе.
Ещё sequencer может не ждать пока транзакция завершится, а тупо строить «план» и пушить транзакции на узлы. Единственное условие - транзакции должны быть без рандома любого рода, DateTime.Now, random() и аналоги нужно вычислить ещё на sequencer.
А ещё sequencer мог бы быть достаточно умным, чтобы догадаться, что транзакции независимы и пушить их параллельно.
Все верно говорю или где-то напутал?
К сожалению, не читал работу Йельского университета, однако по поводу изложения имею определенные нарекания: расписана техническая реализация метода, тогда как концептуальные вопросы остались за кадром:
Если говорить очень упрощенно, основная идея Calvin состоит в том, что узлы договариваются о плане выполнения транзакции до того, как поставят блокировки и начнут выполнять транзакцию.
В большинстве случаев план выполнения транзакции не детерминирован и зависит от прочитанных данных. А блокировка -- это и есть своего рода способ договориться последовательности выполнения транзакций с т.з. конечных эффектов. В любом случае, количество треффика между узлами от этого только возрастет, нежели в случае 2PC.
В случае с Calvin и детерминированными системами, недетерминированное событие не отменяет транзакцию целиком.
Ну и хрен-то с ним! Скажите лучше как отменить транзакцию в случае детерминированного события? В качестве примера операция покупки товара:
DB 1 (счета): прочитать регистр счета клиента, проверить, есть ли в наличии необходимая сумма, вычесть цену товара и записать в регистр счета
DB2 (товары): прочитать регистр количество товара на стоке, проверить, есть ли в наличии необходимое количество, вычесть количество купленных, записать обратно в регистр стока.
Как Calvin будет организовывать атомарность данных операций и откат DB1, когда на складе нет достаточного количества?
Calvin: обеспечение принципов ACID для высоконагруженных распределенных систем