분산 락킹 구현 방법 (2016)

1 week ago 7

분산 잠금 구현하기

  • Redis 웹사이트에서 Redlock 알고리듬을 발견하고, 이 알고리듬이 Redis 위에서 내결함성 분산 잠금을 구현한다고 주장함.
  • Redlock에 대한 여러 독립적인 구현이 이미 존재하며, 이 알고리듬에 의존하는 사람이 있을 수 있어 필자의 노트를 공유하기로 결정함.
  • Redis는 일시적이고 빠르게 변하는 데이터를 서버 간에 공유할 때 유용하지만, 강한 일관성과 내구성이 요구되는 데이터 관리 영역으로 확장되는 것은 우려됨.

잠금의 목적

  • 잠금은 여러 노드 중 하나만 특정 작업을 수행하도록 보장하는 역할을 함.
  • 효율성을 위해 잠금을 사용하는 경우, 단일 Redis 인스턴스를 사용하는 것이 더 나을 수 있음.
  • 정확성을 위해 잠금을 사용하는 경우, Redlock은 적합하지 않음.

자원을 잠금으로 보호하기

  • 분산 시스템에서의 잠금은 멀티스레드 애플리케이션의 뮤텍스와 다름.
  • 클라이언트가 파일을 읽고 수정 후 다시 쓰는 동안 다른 클라이언트가 동일한 작업을 수행하지 못하도록 방지함.

펜싱을 통한 안전한 잠금 구현

  • 펜싱 토큰을 사용하여 쓰기 요청에 포함시킴으로써 안전한 잠금을 구현할 수 있음.
  • Redlock은 펜싱 토큰을 생성하는 기능이 없어 안전하지 않음.

합의를 위한 시간 사용

  • Redlock은 비동기 모델에서의 알고리듬과 달리 시간에 대한 가정을 많이 함.
  • 시스템 시계가 이상하게 작동하면 키의 만료가 예상보다 빠르거나 느려질 수 있음.

Redlock의 시간 가정 깨기

  • Redlock은 동기 시스템 모델을 가정하며, 네트워크 지연, 프로세스 일시 중지, 시계 오류가 제한적일 때만 올바르게 작동함.
  • GitHub의 90초 패킷 지연 사건과 같은 사례가 Redlock의 안전성을 위협할 수 있음.

결론

  • Redlock은 효율성 최적화 잠금에는 불필요하게 무겁고, 정확성을 요구하는 상황에는 충분히 안전하지 않음.
  • 정확성을 위해 잠금이 필요한 경우, ZooKeeper와 같은 적절한 합의 시스템을 사용하는 것이 좋음.

GN⁺의 정리

  • Redlock 알고리듬은 분산 시스템에서의 잠금 구현에 대한 중요한 논의를 제공함.
  • 이 글은 분산 시스템에서의 시간 가정과 안전성 문제를 강조하며, 올바른 잠금 구현의 중요성을 설명함.
  • ZooKeeper와 같은 대안 시스템을 추천하며, 분산 시스템의 복잡성을 이해하는 데 도움이 됨.

Read Entire Article