ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 분산 락(Distributed lock)
    기타 2024. 11. 17. 20:19

    1. 분산 락의 상세 개념

    • 정의: 분산 시스템에서 공유 자원에 대한 동시 접근을 제어하는 동기화 메커니즘입니다.
    • 작동 방식:
      • 모든 서버/프로세스가 접근할 수 있는 공유 저장소(Redis, ZooKeeper 등)에 락을 저장
      • 락을 획득하려는 프로세스는 원자적 연산으로 락 생성을 시도
      • 락을 획득한 프로세스만 공유 자원에 접근 가능
      • 작업 완료 후 락을 해제하여 다른 프로세스가 사용할 수 있게 함

    2. 분산 락의 핵심 요구사항

    • 상호 배제(Mutual Exclusion): 특정 시점에 하나의 프로세스만 락을 보유할 수 있음
    • 데드락 방지(Deadlock Prevention):
      • 락 획득 실패 시 적절한 타임아웃 설정
      • 락 보유자가 비정상 종료된 경우를 대비한 자동 해제 메커니즘
    • 고가용성(High Availability):
      • 락 서비스 자체의 안정성 보장
      • 장애 상황에서도 시스템 전체가 마비되지 않도록 설계
    • 성능(Performance):
      • 최소한의 네트워크 통신으로 락 획득/해제
      • 적절한 락 밀도(Granularity) 설정

    3. 활용 예시

    1. 다중 서버/인스턴스 환경
      • 여러 서버가 동일한 리소스에 접근하는 MSA(Microservice Architecture) 환경
      • 오토스케일링으로 인스턴스가 동적으로 증감하는 클라우드 환경
      • 서버가 물리적으로 다른 위치에 분산되어 있는 경우
    2. 다중 database 사용환경
      • 글로벌 트랜잭션 관리의 어려움
        • 여러 DB간의 트랜잭션 정합성 보장이 필요
        • Two-Phase Commit의 성능 오버헤드가 큼
      • DB간 동기화 시점 관리
        • 각 DB의 복제 지연 발생 가능
        • Master-Slave 구조에서의 지연 시간 차이
      • 단일 DB의 락으로는 전체 시스템의 동시성 제어가 불가능
        • 각 DB는 자신의 트랜잭션만 관리 가능
        • DB간 상호 락 인지 불가능
    3. 외부 api 요청
      • 같은 요청을 2번 이상 하면 안되는 경우

    4. 분산 락의 구현

    1. 각 프로세스는 임계구역에 접근하는 작업시에 락 획득을 요청
    2. 락 획득 실패(다른 프로세스에서 이미 점유 중)시에는 락 획득 요청 재시도(spin lock)
    3. 락 획득 제한 횟수 초과시에 작업 실패 처리 후 프로세스 종료
    4. 락 획득 시에는 프로스에서 임계구역 접근하여 작업처리
      • 최대한 짧은 단위로 작업을 수행하여 빠르게 락을 반환해야 한다.
    5. 락 반환

     

    위와같이 특정 임계구역에 동시에 접근하여 중복된 작업이 생기는 것을 방지하기 위해 분산 락(Distributed Lock)을 활용할 수 있따.

     

    Redis 를 통해 분산 락을 구현한 코드는 다음 링크에서 확인 가능하다.

    https://github.com/O-Seonsik/lock-test/tree/master/src/modules/distributed-lock

    분산 락 테스트를 위한 모듈을 같은 프로젝트의 다른 모듈에 구성해두었다. 다음 링크에서 확인 가능하다.

    https://github.com/O-Seonsik/lock-test/tree/master/src/modules/products

Designed by Tistory.