Raft란 무엇인가
Raft는 여러 대의 서버가 하나의 데이터 상태에 대해 서로 동의(합의)하도록 만드는 분산 합의 알고리즘입니다. 분산 시스템에서는 네트워크 지연이나 서버 장애가 언제든 발생할 수 있기 때문에, 여러 노드가 ‘같은 데이터를 같은 순서로’ 기록하도록 조율하는 규칙이 필요합니다. Raft는 이 문제를 ‘리더 선출’과 ‘로그 복제’라는 두 가지 핵심 개념으로 단순하게 풀어낸 알고리즘입니다. 기존에 널리 쓰이던 Paxos가 이론적으로는 뛰어나지만 이해하고 구현하기 어렵다는 평가를 받아온 반면, Raft는 처음부터 ‘이해하기 쉬운 합의 알고리즘’을 목표로 설계되었습니다.
동작 원리: 리더는 어떻게 뽑히나
Raft에서 모든 노드는 Follower, Candidate, Leader 세 가지 역할 중 하나를 가집니다. 평소에는 모든 노드가 Follower 상태로 리더의 신호(하트비트)를 기다립니다. 마치 회의에서 사회자가 주기적으로 ‘저 아직 살아있어요’라고 손을 드는 것과 비슷합니다.
만약 일정 시간(election timeout) 동안 리더의 신호가 오지 않으면, 해당 Follower는 리더가 죽었다고 판단하고 스스로 Candidate가 되어 다른 노드들에게 투표를 요청합니다. 과반수 이상의 표를 얻으면 그 노드가 새로운 Leader가 됩니다. 이 과정을 ‘Election’이라고 부르며, 각 선거마다 ‘Term’이라는 번호가 하나씩 증가해 어떤 선거가 더 최신인지 구분합니다.
리더가 정해지면 이후 모든 데이터 변경 요청은 리더를 거쳐 처리됩니다. 리더는 변경 사항을 로그로 만들어 Follower들에게 전달하고, 과반수 이상이 로그를 저장했다고 응답하면 그 변경을 ‘커밋’된 것으로 확정합니다. 이렇게 하면 일부 노드가 잠시 다운되거나 네트워크가 끊겨도, 과반수만 살아있으면 시스템 전체는 정상적으로 동작할 수 있습니다.
실무에서 왜 쓰는가
Raft는 개념이 명확해서 실제 분산 시스템 구현에 많이 채택됩니다. 대표적으로 다음과 같은 곳에서 사용됩니다.
- etcd: 쿠버네티스의 클러스터 상태 저장소
- Consul: 서비스 디스커버리 및 설정 관리 도구
- CockroachDB, TiDB 같은 분산 데이터베이스
이런 시스템들은 ‘여러 서버 중 어떤 서버가 진짜 정답을 갖고 있는지’를 계속 판단해야 하는데, Raft 덕분에 노드 장애가 발생해도 과반수만 살아있으면 데이터 일관성을 유지하면서 자동으로 새로운 리더를 뽑아 서비스를 이어갈 수 있습니다. 결국 Raft는 ‘분산 환경에서도 마치 하나의 신뢰할 수 있는 서버가 있는 것처럼’ 동작하게 만들어주는 핵심 원리라고 할 수 있습니다.