Что будет с реплицированными, но незафиксированными журналами в протоколе плота

Предположим, 3-членный плотный кластер a[master],b,c

Клиент отправляет журнал a, реплицирует его на b и c, a применяет журнал к машине состояния и отвечает клиенту. Затем происходит сбой до того, как b и c имеют шанс скопировать зафиксированное состояние на b и c.

b заменяет лидера кластера. Что произойдет с незафиксированным журналом, пока журнал отвечает клиенту?

Будет ли он повторен b снова или просто отброшен?

Тогда предположим, что группа из 4-х плотов a[master],b,c,d

Клиент отправляет журнал в a, реплицирует его на b и c (не на d), a применяет журнал к машине состояния и отвечает клиенту, затем происходит сбой перед репликацией зафиксированного состояния на b и c и d.

d заменяет собой лидера кластера. Тогда что произойдет с незафиксированным журналом, когда журнал получил ответ от клиента? это будет просто отброшено?

3 ответа

Я думаю, что вы путаете "совершенное" с "примененным". Запись считается принятой, поскольку она была сохранена на большинстве серверов, хотя еще не применена. B получает лидера, потому что его журнал обновлен, и когда ему удастся применить одну запись из своего собственного термина, также будет применена эта запись от A.

В вашем втором сценарии D не может быть лидером, потому что его журнал не обновлен, и B и C не предоставят свой голос.

Раздел 5.4.2 и рисунок 8 в "В поисках понятного согласованного алгоритма (расширенная версия)" рассказывают о более сложной ситуации.

Q1. Любой незафиксированный журнал с термином, отличным от CurrentTerm лидера, может быть применен только в том случае, если зафиксирован новый журнал (текущий термин, равный термину лидера). Или они останутся безучастными.

Q2. d не сможет быть лидером (как S5 на рисунке 8.e)

Второй сценарий с кластером из 4 членов практически неправилен. Только нечетное членство имеет явное большинство членов.

Другие вопросы по тегам