-
분산 락(Distributed lock)기타 2024. 11. 17. 20:19
1. 분산 락의 상세 개념
- 정의: 분산 시스템에서 공유 자원에 대한 동시 접근을 제어하는 동기화 메커니즘입니다.
- 작동 방식:
- 모든 서버/프로세스가 접근할 수 있는 공유 저장소(Redis, ZooKeeper 등)에 락을 저장
- 락을 획득하려는 프로세스는 원자적 연산으로 락 생성을 시도
- 락을 획득한 프로세스만 공유 자원에 접근 가능
- 작업 완료 후 락을 해제하여 다른 프로세스가 사용할 수 있게 함
2. 분산 락의 핵심 요구사항
- 상호 배제(Mutual Exclusion): 특정 시점에 하나의 프로세스만 락을 보유할 수 있음
- 데드락 방지(Deadlock Prevention):
- 락 획득 실패 시 적절한 타임아웃 설정
- 락 보유자가 비정상 종료된 경우를 대비한 자동 해제 메커니즘
- 고가용성(High Availability):
- 락 서비스 자체의 안정성 보장
- 장애 상황에서도 시스템 전체가 마비되지 않도록 설계
- 성능(Performance):
- 최소한의 네트워크 통신으로 락 획득/해제
- 적절한 락 밀도(Granularity) 설정
3. 활용 예시
- 다중 서버/인스턴스 환경
- 여러 서버가 동일한 리소스에 접근하는 MSA(Microservice Architecture) 환경
- 오토스케일링으로 인스턴스가 동적으로 증감하는 클라우드 환경
- 서버가 물리적으로 다른 위치에 분산되어 있는 경우
- 다중 database 사용환경
- 글로벌 트랜잭션 관리의 어려움
- 여러 DB간의 트랜잭션 정합성 보장이 필요
- Two-Phase Commit의 성능 오버헤드가 큼
- DB간 동기화 시점 관리
- 각 DB의 복제 지연 발생 가능
- Master-Slave 구조에서의 지연 시간 차이
- 단일 DB의 락으로는 전체 시스템의 동시성 제어가 불가능
- 각 DB는 자신의 트랜잭션만 관리 가능
- DB간 상호 락 인지 불가능
- 글로벌 트랜잭션 관리의 어려움
- 외부 api 요청
- 같은 요청을 2번 이상 하면 안되는 경우
4. 분산 락의 구현
- 각 프로세스는 임계구역에 접근하는 작업시에 락 획득을 요청
- 락 획득 실패(다른 프로세스에서 이미 점유 중)시에는 락 획득 요청 재시도(spin lock)
- 락 획득 제한 횟수 초과시에 작업 실패 처리 후 프로세스 종료
- 락 획득 시에는 프로스에서 임계구역 접근하여 작업처리
- 최대한 짧은 단위로 작업을 수행하여 빠르게 락을 반환해야 한다.
- 락 반환
위와같이 특정 임계구역에 동시에 접근하여 중복된 작업이 생기는 것을 방지하기 위해 분산 락(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
'기타' 카테고리의 다른 글
Github Pages node_modules 접근 (0) 2021.07.06 Xcode Maximum number of app for free development profiles 문제 해결하기. (0) 2021.04.27