Raft 파라미터
| 항목 | 값 |
|---|---|
| 하트비트 간격 | 500ms (cluster_heartbeat_ms) |
| 미응답 판정 시간 | 2000ms (cluster_election_timeout_ms) — 하트비트가 이만큼 끊기면 리더가 죽었다고 판단 |
| 실제 선거 시작 구간 | 1750 ~ 2000ms — 노드마다 무작위로 흩어 동시 후보(split vote)를 막습니다. 최악값이 곧 설정한 미응답 판정 시간입니다 |
| 리더 장애 시 클라이언트 정지 | 실측 미응답 판정 시간 + 0.3~0.5초 (기본값에서 약 2.3~2.5초) — 감지 후 리다이렉트 1회 |
| 노드 수 | 3 또는 5 (설정 로드 시 강제 — 그 외는 부팅 거부) |
| 노드 ID | leader가 복제된 next_node_id에서 발급하는 단조 증가 u64 — 종료된 ID는 재사용하지 않음 |
| 부트스트랩 | 새 cluster_id를 만드는 명시적 최초 동작만 허용. 기존 domain의 quorum state loss 뒤 자동 bootstrap 금지 |
| 로그 저장 | 인메모리(휘발) — 종료 NodeId는 폐기하고 새 NodeId learner가 복제/스냅숏으로 catch-up |
| lease 만료 감지 | 리더가 마감 시각 min-heap의 다음 항목까지 대기한 뒤 Expire를 합의로 커밋 |
wait 타임아웃 입자 | 대기 타임아웃(T)도 같은 100ms 틱에서 판정 — 최대 100ms 늦게 도착할 수 있음 |
| 리더 교체 통지 | 리더가 바뀌면 접속 중인 모든 클라이언트에 L을 즉시 발송 |
하트비트와 미응답 판정 시간 고르기
두 값은 설정의 cluster_heartbeat_ms, cluster_election_timeout_ms로 조절합니다. 미응답 판정 시간(T)이 곧 리더 장애 시 서비스가 멈추는 시간이고, 반대로 너무 짧으면 살아 있는 리더를 죽었다고 오판해 불필요한 선거가 납니다.
| 하트비트 / T | 감지 구간 | 리더 kill 시 최악 지연(실측) | 권장 환경 |
|---|---|---|---|
| 100ms / 600ms | 450~600ms | 약 0.9초 | 같은 랙·같은 AZ, 지연이 매우 안정적 |
| 100ms / 1000ms | 750~1000ms | 약 1.2초 | 같은 AZ |
| 250ms / 2500ms | 1875~2500ms | 약 2.8초 | 멀티 AZ |
| 500ms / 2000ms | 1750~2000ms | 약 2.4초 | 기본값 — 멀티 AZ에서 균형 |
| 500ms / 5000ms | 3750~5000ms | 약 5.3초 | 교차 리전·지연이 크게 튀는 환경 |
- 평상시 처리 지연은 이 값들과 무관합니다(실측 p50 변화 없음) — 장애 시 회복 시간만 좌우합니다.
- 팔로워가 죽는 경우는 어떤 값에서도 클라이언트에 영향이 없습니다. 리더가 죽을 때만 위 지연이 발생합니다.
- 제약:
cluster_election_timeout_ms는 최소 600ms, 그리고 하트비트의 4배 이상이어야 합니다. (부하 중 스케줄링 지연 한 번이 하트비트 두 번을 통째로 삼키는 것이 실측돼 있습니다.)
노드 수가 3 또는 5인 이유
커밋에는 과반이 필요합니다. 짝수 구성은 비용만 늘고 장애 허용은 늘지 않아 서버가 거부합니다.
| 노드 수 | 과반 | 동시 장애 허용 |
|---|---|---|
| 2 | 2 | 0대 — 1대만 죽어도 정지. 싱글보다 나을 게 없음 |
| 3 | 2 | 1대 |
| 4 | 3 | 1대 — 3대와 같음(비용만 증가) |
| 5 | 3 | 2대 |
장애 시 동작 요약
| 상황 | 동작 |
|---|---|
| 리더가 아닌 노드에 클라이언트 요청 | M(리더 주소), 리더를 모르면 E no_leader |
| 리더 장애 | 기본값에서 약 2.3~2.5초 뒤 새 리더 선출. 확정된 M 외에 이미 송신된 acquire는 자동 재전송하지 않고 Indeterminate |
| 계획된 리더 교체 | catch-up한 voter로 leadership을 먼저 넘긴 뒤 새 NodeId learner 교체 |
| 노드 교체 | 새 NodeId learner로 빈 상태에서 합류 → snapshot/log catch-up → membership commit 후 old voter 제거 |
| 단순 네트워크 과반 상실 | commit 불가 → 쓰기 정지(안전 우선), 같은 process state의 과반이 돌아오면 재개 |
| 과반 process state 상실 | 같은 fencing domain 복구를 지원하지 않으며 자동 bootstrap 금지 |
용어
- 과반(quorum) — 전체 노드의 절반 초과(3대면 2대, 5대면 3대). 어떤 결정이든 과반이 동의해야 확정되므로, 통신이 끊겨 갈라진 두 그룹이 동시에 다른 결정을 내릴 수 없습니다.
- 선거 타임아웃(election timeout) — 하트비트가 이 시간 동안 끊기면 팔로워가 리더가 죽었다고 보고 선거를 시작하는 대기 시간. 노드마다 무작위로 달라, 동시에 후보가 되는 것을 줄입니다.