스냅숏
로그로 따라잡기에 너무 뒤처진 노드(새 NodeId learner 등)에게는 FullSnapshot RPC로 현재 상태 전체를 보냅니다. snapshot_bytes 내부는 postcard로 직렬화된 다음 구조입니다.
| 필드 | 내용 |
|---|---|
last_applied | 이 스냅숏이 반영한 마지막 로그 위치 |
last_membership | 멤버십(노드 구성) 정보 |
token_seq | 펜싱 토큰 발급 번호 — 복제되므로 리더가 바뀌어도 토큰 단조성이 유지됨 |
locks | (key, token, owner, remain_ms) 목록 — 보유 중인 락 전부와 각각의 잔여 lease |
remain_ms는 스냅숏 생성 시점의 잔여 lease(밀리초) 입니다. 설치할 때는 스냅숏 보관·전송· decode에 든 시간을 먼저 빼고, 남은 값만 자기 monotonic 시각에 더합니다. 복원 때문에 lease가 연장되어서는 안 됩니다.- 배포에서 정한 최대 시각 오차
Δ는 원래 만료 계산에 정확히 한 번만 반영합니다. snapshot 설치나 learner 교체 때마다Δ를 다시 더하지 않습니다. 인증된 time-health source가 stale·unknown·범위 초과이면 새 Grant와 Expire를 중지합니다. - 정밀도를 위해 여기서만 밀리초 단위를 씁니다(클라이언트 대면 단위는 초).
- Raft 로그는 인메모리(휘발)입니다. 종료된 NodeId는 영구 폐기하고, 새 process는 leader가 발급한 새 NodeId learner로 합류해 로그 복제 또는 이 스냅숏으로 따라잡습니다. 커밋된 상태는 과반의 process state가 남아 있는 한 유지됩니다.
- 스냅숏은 최대 64MiB 단일 frame입니다. key 수·상태 바이트·encoded bytes·동시 decode bytes를 hard limit로 제한하고, 한계에 닿기 전에 새 key acquire를
B로 거부해 scratch 프로세스의 OOM을 막습니다. Release와 Raft 복구용 자원은 별도로 예약합니다.
흐름
리더
뒤처진 노드
새 NodeId learner — 빈 상태로 합류
AppendEntries
로그로 따라잡기엔 너무 뒤처짐
FullSnapshot — 상태 전체를 프레임 하나로
설치: 각 락을 now + remain_ms로 복원
이후는 다시 AppendEntries로 로그만
합의 RPC (Raft)
용어
- 스냅숏(snapshot) — 특정 시점의 상태 전체를 통째로 찍어 둔 사본. 뒤처진 노드가 그동안 쌓인 로그를 처음부터 재생하는 대신, 스냅숏을 설치하고 그 이후의 로그만 따라가면 되게 해 줍니다.
- 멤버십(membership) — 클러스터를 구성하는 노드 목록과 그 역할 정보.