Вместо того, чтобы напрямую отвечать на ваши вопросы, я попытаюсь объяснить, как можно реализовать транзакцию базы данных с помощью Paxos, возможно, это поможет прояснить ситуацию.
Первое, на что следует обратить внимание, это то, что здесь речь идет о двух «ценностях». Во-первых, это значение базы данных, изменяемые данные уровня приложения. Во-вторых, это решение «зафиксировать» / «прервать». Для транзакций на основе Paxos консенсусной «ценностью» является решение «зафиксировать» / «прервать».
Важный момент, о котором следует помнить о транзакциях базы данных в отношении консенсуса Paxos, заключается в том, что Paxos не гарантирует, что все партнеры, участвующие в транзакции, действительно увидят консенсусное решение. Когда это необходимо, как это обычно бывает с базами данных, приложение должно гарантировать, что это произойдет. Это означает, что состояние, сохраняемое некоторыми одноранговыми узлами, может отставать от других, и любому приложению базы данных, построенному на основе Paxos, потребуется какой-то механизм для обработки этого. Это может быть очень сложно и все зависит от приложения, поэтому я собираюсь полностью игнорировать все это и сосредоточиться на обеспечении того, чтобы простое большинство всех реплик базы данных согласовывалось со значением версии 2 ключа базы данных FOO, что, конечно же, изначально установлен на BAR.
Первый шаг - отправить новое значение для FOO, скажем, BAZ, и это ожидаемая текущая ревизия, 1, вместе с сообщением Paxos Prepare. Когда реплики базы данных получают это сообщение, они сначала ищут свою локальную копию FOO и проверяют, соответствует ли текущая ревизия ожидаемой ревизии, включенной вместе с сообщением Подготовить. Если они совпадают, реплика базы данных объединит флаг «Vote Commit» вместе с сообщением Promise, отправленным в ответ на Prepare. Если они не совпадают, вместо этого будет отправлено сообщение «Отмена голосования» (проверка исправлений защищает от случая, когда значение было изменено с момента последнего чтения приложением. Разрешение перезаписи в этом случае может привести к повреждению состояния приложения).
Как только драйвер транзакции получает кворум сообщений Promise вместе со связанными с ними значениями «Vote Commit» / «Vote Abort», он должен выбрать либо «Commit», либо «Abort». Первым шагом при выборе этого значения является выполнение требования Paxos по проверке сообщений Prepare, чтобы увидеть, принял ли какой-либо репликант базы данных (Acceptor в терминах Paxos) уже сообщение " Принять решение "/" Отменить ". Если какой-либо из них имеет, то драйвер транзакции должен выбрать значение «Фиксация» / «Прервать», связанное с наивысшим ранее принятым идентификатором предложения. Если у них нет, он должен решить сам. Это можно сделать, просмотрев значения «Подтверждение голосования» / «Прерывание голосования», связанные с обещаниями. Если присутствует кворум «Голосование Commmit», драйвер транзакции может предложить «Commit», в противном случае он должен предложить «Abort».
С этого момента происходит обмен стандартными сообщениями Paxos, пока не будет достигнут консенсус по решению «Применить» / «Прервать». Предполагая, что выбрано «Commit», репликанты базы данных обновят значение и ревизию, связанные с FOO, до BAZ и 2, соответственно.
person
Rakis
schedule
05.11.2015