현재 테스트 중입니다: 완료되면 GitHub 코드를 오픈할 예정입니다.

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 (설정 로드 시 강제 — 그 외는 부팅 거부)
노드 IDleader가 복제된 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 / 600ms450~600ms약 0.9초같은 랙·같은 AZ, 지연이 매우 안정적
100ms / 1000ms750~1000ms약 1.2초같은 AZ
250ms / 2500ms1875~2500ms약 2.8초멀티 AZ
500ms / 2000ms1750~2000ms약 2.4초기본값 — 멀티 AZ에서 균형
500ms / 5000ms3750~5000ms약 5.3초교차 리전·지연이 크게 튀는 환경
  • 평상시 처리 지연은 이 값들과 무관합니다(실측 p50 변화 없음) — 장애 시 회복 시간만 좌우합니다.
  • 팔로워가 죽는 경우는 어떤 값에서도 클라이언트에 영향이 없습니다. 리더가 죽을 때만 위 지연이 발생합니다.
  • 제약: cluster_election_timeout_ms는 최소 600ms, 그리고 하트비트의 4배 이상이어야 합니다. (부하 중 스케줄링 지연 한 번이 하트비트 두 번을 통째로 삼키는 것이 실측돼 있습니다.)

노드 수가 3 또는 5인 이유

커밋에는 과반이 필요합니다. 짝수 구성은 비용만 늘고 장애 허용은 늘지 않아 서버가 거부합니다.

노드 수과반동시 장애 허용
220대 — 1대만 죽어도 정지. 싱글보다 나을 게 없음
321대
431대 — 3대와 같음(비용만 증가)
532대

장애 시 동작 요약

상황동작
리더가 아닌 노드에 클라이언트 요청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) — 하트비트가 이 시간 동안 끊기면 팔로워가 리더가 죽었다고 보고 선거를 시작하는 대기 시간. 노드마다 무작위로 달라, 동시에 후보가 되는 것을 줄입니다.