2015-08-27 7 views
2

Когда лидер получает запись в журнале, он копирует его на другие серверы в кластере. Затем он фиксирует запись и сообщает другим серверам также зафиксировать. Здесь, по-видимому, есть два случая:
1) Лидер совершает запись, а затем сообщает другим серверам также зафиксировать.
2) Лидер сообщает всем, что совершает, а затем он это делает.Состояние гонки в RAFT?

В # 1, если лидер падает, прежде чем сообщать другим о совершении, то делает ли кто-либо, кто станет новым лидером, запись, даже если она не совершена? Если нет, то у нас есть несколько журналов, которые не синхронизированы для последней записи. (Старый лидер применил бы это, а другой не имел бы.) Если да, то как он знает, что это нормально, чтобы зафиксировать это?

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

ответ

3

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

Из-за природы распределенных систем невозможно, чтобы все серверы фиксировали запись одновременно. Вместо этого, Raft гарантирует только, что запись сохранялась на большинстве серверов к тому моменту, когда лидер применяет ее к своей машине состояния. Большинство реализаций Raft используют подход №1, чтобы позволить лидеру применить команду к своему автоответчику и ответить клиенту, прежде чем другие серверы будут применять его к своим государственным машинам.

Что произойдет, если лидер применяет команду, а затем терпит неудачу это:

* We know that the command has been stored on a majority of servers therefore... 
* Raft's election algorithm guarantees that the next server that's elected has that entry 
* When the next leader is elected, it will append a no-op entry to its log and commit it 
* Once the no-op entry is committed, the leader will increase its commitIndex to that of the no-op entry and thereby commit all entries remaining from the previous term (including the original leader's last commit) 
* On the next heartbeat, the leader will send the index of the no-op as the `commitIndex` 
* Remaining followers will be replicated entries up to the leader's no-op and commit entries from the previous leader's term 

Имеет ли это смысл?

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

Ссылки: См раздел 5.4.2 бумаги Плот (https://ramcloud.atlassian.net/wiki/download/attachments/6586375/raft.pdf) для получения информации о совершении записей из предыдущих терминов

+0

BTW форум 'raft-dev' - отличное место, где можно задавать эти вопросы. Я не уверен, что Диего следует за этим тегом: https://groups.google.com/forum/m/#!forum/raft-dev – kuujo

0

Ответ на # 1. Да, новый лидер всегда будет иметь зафиксированное значение из-за «Ограничения выбора», которое было применено для обеспечения полноты Лидера, которая определяет, что «Если запись завершена в срок, то все лидеры лидеров высшего разряда будут, безусловно, имеют эту запись ".

Смежные вопросы