Raft는 투표를 관리하기 위해 두 가지 timeout 설정
첫 번째는 Election timeout
Election timeoutHeartbeat timeout- Election timeout이 끝나면 Follower는 Candidate가 되고 Election term을 시작합니다.
- Candidate는 본인에게 투표를 하고 다른 노드들에게 투표 요청 메세지를 전달합니다.
- 만일 메세지를 받는 노드가 해당 Election term에서 아직 투표를 하지 않았다면, 먼저 메세지를 전달해준 Candidate에게 투표합니다.
- 투표를 마친 해당 노드는 Election timeout이 초기화 됩니다.
- 가장 많은 표를 받은 노드가 Leader로 선정
- 선정 이후 Leader는 Append Entries 메세지를 Follower들에게 전송합니다. (이 메세지는 Heartbeat timeout 에 설정된 간격마다 보내게 됩니다)
- Follower들은 Append Entries 메세지를 받으면 Election timeout이 초기화되고 메세지에 대한 응답을 Leader에게 보냅니다.
- 만일 Follower에게 Heartbeat가 도달하지 않으면 다시 Election term이 시작되고, Follower는 Candidate 상태로 전환됩니다. (위 그림은 노드A가 죽고 난 이후 노드B가 Leader로 선정되고 Heartbeat 메세지를 전달하는 예시입니다
- 만일 두 개의 노드가 동시에 Election term을 시작하고 메세지가 동시에 Follower에게 도달한다고 가정해보겠습니다.
- 이러한 경우 노드A, 노드B는 2표씩 얻게 되고, 표가 동일하므로 해당 Election term에는 Leader가 선정되지 않습니다.
- Leader가 선정되지 않았으므로 Election timeout에 따라 새로운 Election term을 시작
Raft consensus algorithm
Consensus란 분산 시스템에서 노드 간의 상태를 공유하는 알고리즘을 말합니다. 가장 유명한 알고리즘으로 Paxos가 있고, Zookeeper에서 사용하는 Zab이 있습니다. Raft는 이해하기 어려운 기존의 알고리즘과 달리 쉽게 이해하고 구현하기 위해 설계되었습니다. (PS. 이 글은 블록체인에서의 Consensus 알고리즘을 말하는 것이 아닙니다) What is consensus problem...
https://swalloow.github.io/raft-consensus/

