CS

분산락

baek-dev 2025. 5. 15. 15:18

분산락(Distributed Lock)이란?

분산락(Distributed Lock)여러 대의 서버 또는 인스턴스가 동시에 공유 자원(예: 데이터, 파일, 외부 API 등)을 수정하거나 사용할 때, 하나의 주체만 접근할 수 있도록 잠금을 거는 방식임.
단일 서버 내에서의 synchronized 나 Lock 과 달리, 분산 환경에서는 서로 다른 프로세스, 서버, JVM 간에도 락을 공유해야 함.


1. 분산 환경에서 왜 락이 필요한가?

예시 상황:

  • 주문 시스템에서 동시에 두 사용자가 같은 상품을 주문하면 재고가 음수가 될 수 있음
  • 스케줄러가 여러 서버에서 동시에 실행되면 중복 작업 수행 가능성 있음
  • 동일한 외부 API를 중복 호출하여 과금 증가 위험 발생

→ 이를 막기 위해 '누가 먼저 락을 잡았는가'를 공유할 수 있는 방식이 필요함 → 분산락


2. 분산락 구현 방식

✅ ① Redis 기반 분산락

Redis의 SET key value NX EX 명령을 활용하여 구현함

SET lock_key unique_id NX EX 10
  • NX: 존재하지 않을 때만 설정
  • EX: 만료 시간 설정 (TTL)
  • unique_id: 락 주체 식별 값

특징:

  • 빠름, 구현 쉬움
  • 단일 노드 Redis 사용 시 장애에 취약함

Redisson 같은 라이브러리를 통해 구현 가능


✅ ② Redlock (Redis 클러스터용 락 알고리즘)

  • Redis의 창시자 Antirez(살바토레) 가 제안한 안정적인 분산락 알고리즘
  • 여러 Redis 노드에 동시에 락을 걸고 과반수 이상 확보 시 유효한 락으로 인정함

조건:

  • 최소 3개 이상의 독립 Redis 인스턴스 필요
  • 락의 TTL, 네트워크 지연 시간 등을 정밀하게 조정해야 함

→ 실무에서는 Redisson이 Redlock 구현을 내장하고 있음


✅ ③ DB 기반 분산락

  • 데이터베이스의 row-level lock 또는 select for update 사용
SELECT * FROM lock_table WHERE resource='stock' FOR UPDATE;
  • 트랜잭션 기반으로 락 보장
  • MySQL, PostgreSQL 등에서 사용 가능

단점:

  • DB 부하 증가
  • 성능 낮음, 확장성 제한

✅ ④ Zookeeper 기반 분산락

  • ZNode(임시 노드) + 순서 노드 방식으로 분산 락 구현
  • 락 경쟁 시 자동으로 대기하고, 락 해제되면 다음 노드가 자동으로 소유함
  • 고가용성 보장, 상태 공유에 강함

단점:

  • 설정 복잡
  • 운영 난이도 있음

3. 분산락에서 고려할 문제

항목 설명
Deadlock (데드락) 락 해제가 되지 않아 무기한 대기 상태 발생
Race Condition 락 획득 과정에서 경쟁 상태 발생 가능
Lock Expire (TTL) 작업이 길어져 락이 먼저 풀리면, 다른 주체가 중복 실행 가능
Lock Ownership 락을 걸었는지 확인할 때 소유자 확인 중요 (unique_id로 비교)

4. 분산락 라이브러리 및 도구

도구 설명
Redisson Redis 기반 분산락 구현 라이브러리 (Java)
ShedLock 스프링 스케줄러 중복 방지용 락 도구, DB 기반
Etcd Zookeeper 대체 가능, gRPC 기반 Key-Value 저장소
Hazelcast JVM 기반 In-Memory 데이터 그리드, 분산 락 API 제공

5. 실무 활용 예시

  • 스케줄러 중복 방지: 여러 인스턴스 중 하나만 실제 작업 수행
  • 재고 감소 로직 보호: 동시에 감소 요청이 들어와도 하나만 처리
  • 결제 중복 방지: 락을 걸어 중복 결제 트랜잭션 차단
  • 이벤트 중복 처리 방지: Kafka/Queue 소비 중 메시지 중복 처리 방지

정리

분산락(Distributed Lock) 은 여러 서버나 인스턴스가 동시에 공유 자원에 접근할 때,
하나의 프로세스만 안전하게 작업하도록 제어하기 위한 동기화 기법임.
Redis, DB, Zookeeper 등을 활용한 다양한 구현 방식이 있으며,
실무에서는 성능, 확장성, 복잡도에 따라 적절한 방식을 선택해야 함.
TTL, 재시도, 락 소유자 확인, 예외 처리 등까지 함께 고려해야 안정적인 락 시스템을 구현할 수 있음.

 

 

 

 

출처 : ChatGPT

'CS' 카테고리의 다른 글

ConcurrentHashMap  (1) 2025.05.19
임계구역  (0) 2025.05.14
Gof 디자인 패턴  (0) 2025.05.13
세션  (0) 2025.05.11
쿠키  (0) 2025.05.10