Вызывает ли это реальную проблему, когда я принимаю правило «никогда не фиксирует записи журнала из предыдущих условий путем подсчета реплик» в этой ситуации? - PullRequest
0 голосов
/ 15 декабря 2018

В настоящее время я сам внедряю алгоритм консенсуса Рафта и сталкиваюсь со следующей проблемой.Предположим, что есть 4 узла (A, B, C и D), поэтому запись в журнале может быть зафиксирована с более чем 2 голосами.Теперь мы запускаем кластер и выбираем лидера A с term = 0.Затем происходят следующие вещи:

  1. Отключение подписчика B / D.
  2. Лидер A create LogEntry X.
  3. Лидер A пытается выполнить репликацию на все узлы ив конечном итоге происходит сбой, потому что только 2 узла (A и C).
  4. Узел B переподключается и тайм-аут, он начинает выборы с новым term = 1.
  5. Узел A потерял свое лидерство, потому что он получил УзелRequestVote RPC B.
  6. Узел B не может выиграть выборы, потому что у него нет LogEntry X. Таким образом, в кластере нет Лидера.
  7. Узел Тайм-аут и времяснова выбран в качестве лидера.
  8. Лидер A успешно реплицирует LogEntry X в B.
  9. Теперь узлы A / B / C имеют точно такой же LogEntry X, что (index = 0, term = 0).Однако, согласно статье Плот, Лидер А не может зафиксировать X, хотя он сгенерирован сам, и большинство согласилось с X.

    Плот никогда не фиксирует записи журнала из предыдущих терминов путем подсчета реплик.Только записи в журнале с текущего срока лидера фиксируются путем подсчета реплик;

  10. Предположим, что от клиента для репликации больше нет LogEntry s, поэтому LogEntry X остается незафиксированным.

Мои вопросы:

  1. Это реальная проблема?
  2. Есть ли какие-то решения для этого?На самом деле уже есть некоторые сообщения о SoF, которые подчеркивают важность этого правила.И в этом посте , кажется, говорится, что мы можем создать копию Y X и реплицировать Y. Это работает или, возможно, существует общее решение?

1 Ответ

0 голосов
/ 27 февраля 2019
  1. Нет

  2. Да.В печатном документе на странице 13. у вас есть следующее:

Свойство полноты лидера гарантирует, что у лидера есть все зафиксированные записи, но в начале его срока,он может не знать, что это такое.Чтобы выяснить это, нужно зафиксировать запись со своего срока.Плот решает эту проблему, заставляя каждого лидера вносить в журнал пустую запись без операции в начале срока его действия

В вашем случае после шага 7. A создаст NoOpЗаписать запись, и он сможет реплицировать ее, зафиксировать, и, таким образом, все предыдущие записи будут зафиксированы.

...