Leader Election


Raft는 투표를 관리하기 위해 두 가지 timeout 설정
첫 번째는 Election timeout

[Election timeout](https://texonom.com/election-timeout-ba0b2cc1fe9c44378c457456bf79dd5b)


[Heartbeat timeout](https://texonom.com/heartbeat-timeout-480ed14f91a143bdb523c608a25312d7)




1. Election timeout이 끝나면 Follower는 Candidate가 되고 Election term을 시작합니다.
2. Candidate는 본인에게 투표를 하고 다른 노드들에게 투표 요청 메세지를 전달합니다.
3. 만일 메세지를 받는 노드가 해당 Election term에서 아직 투표를 하지 않았다면, 먼저 메세지를 전달해준 Candidate에게 투표합니다.
4. 투표를 마친 해당 노드는 Election timeout이 초기화 됩니다.
5. 가장 많은 표를 받은 노드가 Leader로 선정


6. 선정 이후 Leader는 Append Entries 메세지를 Follower들에게 전송합니다. (이 메세지는 **Heartbeat timeout** 에 설정된 간격마다 보내게 됩니다)
7. Follower들은 Append Entries 메세지를 받으면 Election timeout이 초기화되고 메세지에 대한 응답을 Leader에게 보냅니다.
8. 만일 Follower에게 Heartbeat가 도달하지 않으면 다시 Election term이 시작되고, Follower는 Candidate 상태로 전환됩니다. (위 그림은 노드A가 죽고 난 이후 노드B가 Leader로 선정되고 Heartbeat 메세지를 전달하는 예시입니다


9. 만일 두 개의 노드가 동시에 Election term을 시작하고 메세지가 동시에 Follower에게 도달한다고 가정해보겠습니다.
10. 이러한 경우 노드A, 노드B는 2표씩 얻게 되고, 표가 동일하므로 해당 Election term에는 Leader가 선정되지 않습니다.
11. Leader가 선정되지 않았으므로 Election timeout에 따라 새로운 Election term을 시작




> [Raft consensus algorithm](https://swalloow.github.io/raft-consensus/)







