В настоящее время я сам реализую алгоритм консенсуса Raft и сталкиваюсь со следующей проблемой. Предположим, что имеется 4 узла (A, B, C и D), поэтому запись в журнале может быть зафиксирована более чем двумя голосами. Теперь мы запускаем кластер и выбираем лидера А с помощью term = 0
. Затем происходит следующее:
- Отсоединение ведомого B / D.
- Лидер A создать
LogEntry
X. - Лидер A пытается реплицироваться на все узлы и в конечном итоге терпит неудачу, потому что только 2 узла (A и C).
- Узел B повторно подключается и истекает время ожидания, он начинает выборы с новым
term = 1
. - Узел A потерял лидерство, потому что получил
RequestVote
RPC узла B. - Узел B не может победить на выборах, потому что у него нет
LogEntry
X. Итак, в кластере нет лидера. - Узел Тайм-аут и снова быть избранным лидером.
- Лидер A успешно реплицирует
LogEntry
X в B. - # P2 #
# P3 #
- Предположим, что от клиента больше нет
LogEntry
для репликации, поэтомуLogEntry
X остается незафиксированным.
Мои вопросы:
- Это настоящая проблема?
- Есть ли какие-то решения для этого? Фактически, уже есть несколько сообщений о SoF, которые подчеркивают важность этого правила. И в этом сообщении мы, кажется, может создать копию Y из X и реплицировать Y. Работает ли это или, может быть, существует общее решение?