| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 |
- 개발
- 대규모시스템
- 스프링빈
- Observability
- 개발자
- Data Engineering
- devsecops
- 인프라
- AWS
- Pub/Sub
- it
- 데이터엔지니어
- 시스템호출
- etcd
- SRE
- 쿠버네티스
- tech
- Kubernetes
- 운영체제
- 코테
- Network
- k8s
- fork()
- 커널
- Kafka
- Monitoring
- OS
- elasticsearch
- 분산시스템
- 엘라스틱서치
- Today
- Total
모래성 말고 철옹성
1편. 분산 합의란 무엇인가? - Raft의 기본 개념 본문

분산 시스템에서 여로 노드가 마치 하나의 물리 노드처럼 일관된 상태를 유지하는 것은 어렵다. 네트워크 장애, 노드 실패, 패킷 손실 등등 다양한 문제들이 발생할 수 있고, 민감한 시스템의 경우 이는 큰 장애로 이어질 수도 있다. 이러한 문제를 해결하기 위해 등장한 개념이 합의 알고리즘(Consensus Algorithm) 이다.
그 중에서도 Raft 알고리즘이 가장 대표적이어 Raft를 한번 톺아보기로 했다.
Raft의 탄생 배경
Raft 이전의 대표적인 합의 알고리즘은 Paxos였다. 하지만 Paxos 알고리즘은 구현의 난이도가 높다는 단점이 있었다. 2013년 스탠포드에서 "Understandability"를 최 우선으로 하는 Raft 알고리즘을 개발했다.
Raft의 핵심 개념
서버 상태 (Server States)
Raft에서 서버의 상태는 아래 세 가지 상태 중에 하나다
1. follwer: 수동적인 상태로, leader와 candidate 요청에만 응답
2. candidate: 리더 선출 과정에서의 임시 상태
3. leader: 모든 클라이언트 요청을 처리하고 로그 항목을 다른 서버들에 복제
Term
Raft는 시간을 Term이라는 단위로 나눈다. 각 term은 고유한 번호를 가지며, 최대 하나의 리더만 존재할 수 있다. term은 선거가 시작될 때마다 증가하며, 분산 시스템에서 논리적인 시계 역할을 한다.
Raft의 세 가지 핵심 메커니즘

1. 리더 선출 (Leader Election)
선거 과정:
- 서버가 시작하면 follower 상태로 시작
- 리더로부터 hearbeat 받지 못하면 candidate가 됨
- 자신의 term을 증가시키고 다른 서버들에게 투표 요청
- 과반수 표를 얻으면 리더가 됨
- 같은 term 에서 다른 서버가 리더가 되었다면 팔로워로 전환
선거 타임아웃:
- 각 서버는 랜덤한 타임아웃을 가짐 (150~300ms)
- 이를 통해 동시에 여러 서버가 후보자가 되는 것을 방지
- split vote 상황 최소화
2. 로그 복제 (Log Replication)
로그 구조:
| 인덱스 | 1 | 2 | 3 | 4 | 5 |
| term | 1 | 1 | 2 | 3 | 3 |
| 명령 | x=3 | y=1 | y=9 | x=2 | x=0 |
복제 과정:
- 클라이언트가 leader에게 명령 전송
- leader가 자신의 로그에 항목 추가
- leader가 follower들에게 AppendEntries RPC 전송
- 과반수의 follower가 응답하면 로그 항목을 커밋
- 리더가 클라이언트에게 성공 응답
로그 일관성 보장:
- 로그 매칭 속성: 두 로그에서 같은 인덱스와 term을 가진 항목이 있다면, 해당 위치까지의 모든 항목이 동일
- leader 완정성: 특정 term에서 커밋된 로그 항목은 그보다 높은 term의 모든 leader에 존재
3. 안정성 (Safety)
핵심 안정성 속성:
- 선거 안정성: 특정 용어에서 최대 하나의 리더만 선출
- 리더 추가 전용: 리더는 기존 로그 항목을 덮어쓰거나 삭제하지 않음
- 로그 매칭: 두 로그의 특정 위치가 같은 용어라면 모든 이전 항목도 동일
- 리더 완전성: 커밋된 항목은 모든 미래 리더에 존재
- 상태 머신 안정성: 서버가 특정 인덱스에 로그 항목을 적용했다면, 다른 서버도 같은 항목 적용
Raft의 장점과 한계
장점
- 제작자의 철학에 맞게 이해하기 쉬워 구현에 용이
- 엄격한 안정성 보장
단점
- 과반수 원칙으로 가용성 제한
- 모든 변경사항에서 과반수 합의 필요로 인한 성능 오버헤드
실제 Raft 알고리즘으로 구현된 오픈소스
- etcd: 클러스터 메타데이터의 일관성 보장
- Consul: 서비스 디스커버리와 구성관리
- TiKV: 분산 트랜잭션 key-value 스토어로 데이터 복제를 위해 Raft 사용
참고.
Raft Consensus Algorithm
What is Raft? Raft is a consensus algorithm that is designed to be easy to understand. It's equivalent to Paxos in fault-tolerance and performance. The difference is that it's decomposed into relatively independent subproblems, and it cleanly addresses all
raft.github.io
https://raft.github.io/raft.pdf
'실험실' 카테고리의 다른 글
| [Python] Python LRU Cache 성능 최적화 (0) | 2025.09.15 |
|---|---|
| 밑바닥부터 시작하는 분산 시스템 시리즈 (0) | 2025.08.28 |