펜싱 토큰 (Fencing Token)

아재발자·2026년 3월 31일

분산 시스템에서 펜싱 토큰(Fencing Token)은 공유 자원에 대한 접근 권한이 이미 만료된 프로세스가 뒤늦게 자원을 수정하는 것을 방지하기 위해 사용하는 보안 및 일관성 유지 메커니즘입니다.

주로 브레인 분할(Split-brain) 현상이나 STW(Stop-The-World), 네트워크 지연 등으로 인해 발생하는 문제를 해결하기 위해 도입되었습니다.

1. 왜 필요한가요? (문제 상황)

분산 시스템에서는 특정 노드가 죽었는지, 단순히 네트워크가 느린 것인지 완벽하게 구별하기 어렵습니다. 이때 다음과 같은 사고가 발생할 수 있습니다.

  1. 노드 A가 잠금(Lock)을 획득하여 공유 파일(Storage)에 접근합니다.

  2. 노드 A에 갑자기 긴 GC(Garbage Collection)가 발생하여 일시 정지됩니다.

  3. 잠금 서비스(예: ZooKeeper)는 노드 A가 죽었다고 판단하고 잠금을 해제한 뒤, 노드 B에게 잠금을 부여합니다.

  4. 노드 B는 데이터를 쓰기 시작합니다.

  5. 이때 노드 A의 GC가 끝나고 깨어납니다. A는 자신이 여전히 잠금을 가지고 있다고 착각하고 데이터를 씁니다.

결과적으로 노드 B의 데이터가 노드 A에 의해 덮어씌워져 데이터 오염이 발생합니다.

2. 펜싱 토큰의 작동 원리

펜싱 토큰은 잠금을 획득할 때마다 증가하는 숫자(Sequence Number)를 함께 부여함으로써 이 문제를 해결합니다.

토큰 발행

클라이언트가 잠금을 획득할 때, 잠금 서버는 현재 버전보다 높은 숫자(예: 31)를 토큰으로 발행합니다.

검증 요청

클라이언트가 저장소(Storage)에 데이터를 쓸 때 이 토큰(31)을 함께 보냅니다.

저장소의 거부

저장소는 자신이 마지막으로 처리한 토큰 번호를 기억합니다.

만약 이전에 이미 번호 32를 처리했다면, 번호 31을 가진 요청은 "과거의 요청"으로 간주하여 거부합니다.

3. 주요 구성 요소

  • Lock Service
    잠금과 함께 단조 증가하는 토큰을 생성합니다.

  • Resource (Storage)
    가장 최근에 수용한 토큰 번호를 저장하고, 그보다 낮은 번호의 요청은 무시합니다.

  • Client
    잠금을 획득할 때 받은 토큰을 모든 작업 요청에 포함시킵니다.

4. 요약

펜싱 토큰은 "늦게 온 요청이 시스템의 상태를 되돌리지 못하게 하는 안전장치"입니다.

아무리 노드가 자신이 권한이 있다고 주장해도, 토큰 번호가 낮으면 저장소 수준에서 입구 컷(Fencing)을 당하게 됩니다.

profile
안녕하세요. 아재 개발자입니다. 공부한 내용을 기록하고 잘못된 부분에 대해서 조언을 받기 위해 velog를 시작했습니다. :)

0개의 댓글