[매일매일] 백엔드 기술 일기: 분산 환경에서 Redis를 활용한 잠금은 어떻게 구현할까?
다수의 서버가 동시에 하나의 자원에 접근하지 않도록 제어할 수 있을까?Redis의 분산 잠금 기법과 RedLock 알고리즘을 통해 알아보자!
✅ 1. 왜 분산 잠금이 필요할까?분산 시스템에서는 여러 서버에서 동일한 리소스(예: 재고, 계좌, 주문 등)에 동시에 접근할 수 있기 때문에, 경쟁 상태(Race Condition)를 방지하기 위한 잠금(Lock) 메커니즘이 필요합니다.단일 서버에서는 자바의 synchronized나 DB의 SELECT FOR UPDATE 같은 방법으로 제어할 수 있지만,분산 환경에서는 모든 서버가 공유할 수 있는 저장소(예: Redis)를 활용한 잠금이 필요합니다.
🔧 2. Redis를 활용한 기본적인 분산 잠금Redis는 다음과 같은 명령어 조합으로 분산 잠금을 구현할 수 있습니다:
SET lock_key unique_value NX EX 10
NX: Key가 존재하지 않을 때만 설정EX: 만료 시간 설정 (예: 10초)unique_value: 요청한 서버를 식별할 수 있는 UUID 등
이 명령어는 “만약 락이 존재하지 않으면 생성하고, 10초 뒤에는 자동으로 만료”라는 의미입니다.
🔄 잠금 해제는?잠금 해제 시에는 반드시 unique_value를 비교 후 삭제해야 합니다.
if redis.call(“get”,KEYS[1]) == ARGV[1] then return redis.call(“del”,KEYS[1]) else return 0 end
⚠️ 3. 단일 Redis 노드 사용의 문제점Redis를 마스터-레플리카 구조로 구성한 경우, 마스터 장애 발생 시 레플리카가 마스터로 승격되는 동안 데이터 복제가 완료되지 않으면 잠금 정보가 유실될 수 있습니다.예시 시나리오서버 A가 잠금을 획득 (SET lock_key A)마스터 장애 → 레플리카가 마스터로 승격아직 레플리카에는 lock_key가 복제되지 않음다른 서버 B가 다시 lock_key를 획득💥 동일한 자원에 대해 중복 작업 발생
🛡️ 4. RedLock 알고리즘으로 문제 해결Redis의 창시자인 Salvatore Sanfilippo(antirez)가 제안한 RedLock 알고리즘은 위와 같은 장애 상황을 대비한 분산 락 프로토콜입니다.RedLock 동작 방식5개의 독립된 Redis 노드에 동시에 lock 요청과반수(3개 이상)의 노드에서 lock을 획득lock 획득 시간 < TTL 이내일 경우에만 유효작업이 끝난 후 모든 노드에 lock 해제장점마스터 장애에도 락 유실 가능성 감소고가용성 보장데이터 복제 지연에 안전단점5개의 독립 Redis 인스턴스 필요 (운영 부담)네트워크 지연 및 클럭 동기화 이슈 고려 필요여전히 완벽한 해결책은 아님 (⇒ 논란 있음)
실제 운영에서는 RedLock을 그대로 쓰기보단 DB-based Lock + Redis 캐시 조합, Zookeeper 기반 Lock, 분산 트랜잭션, ETCD 같은 대안도 함께 고려합니다.
📚 참고 자료 및 출처https://redis.io/docs/latest/develop/use/patterns/distributed-locks/
Distributed Locks with Redis A distributed lock pattern with Redis redis.io
https://mangkyu.tistory.com/311
[Redis] 레디스가 제공하는 분산락(RedLock)의 특징과 한계
- 분산락의 필요성과 레디스의 분산락(RedLock) [ 분산락의 필요성 ] 분산 환경에서는 서로 다른 클라이언트가 공유 리소스를 사용하는 경우가 많이 있다. 기본적으로 레디스(Redis)는 싱글 스레드로 동작하기 때문에, 단일 레디스 노드를 구축해 사용해도 동시성 문제가 발생하지 않는다. 따라서 리소스에 대해 값을 설정하여, 값이 설정된 경우에는 다른 리소스의 접근을 차단할 수 있다. 이를 잠금이라고 표현할 것이며, 이를 위해 다음과 같은 명령을 사용할 수 있다. // key, value를 저장하는데 NotExists일 경우에만… mangkyu.tistory.com
https://helloworld.kurly.com/blog/distributed-redisson-lock/
풀필먼트 입고 서비스팀에서 분산락을 사용하는 방법 - Spring Redisson 어노테이션 기반으로 분산락을 사용하는 방법에 대해 소개합니다. helloworld.kurly.com
https://blog.wadiz.kr/%EB%B6%84%EC%82%B0-%ED%99%98%EA%B2%BD-%EC%86%8D%EC%97%90%EC%84%9C-%EB%94%B0%EB%8B%A5%EC%9D%84-%EC%99%B8%EC%B9%98%EB%8B%A4/
분산 환경 속에서 ‘따닥’을 외치다 - 와디즈 블로그 와디즈에는 간편 카드 등록을 할 수 있어요. 오직 1개만 등록할 수 있는데 간헐적으로 중복으로 등록되는 버그, ‘따닥 이슈’가 발생했죠. 레디스 분산 락을 걸어 빈도수를 제로에 가깝게 줄였지만, 정확한 뿌리를 찾고자! 여정을 떠났습니다. blog.wadiz.kr
https://channel.io/ko/blog/articles/abc2d95c
Distributed Lock 구현 과정 Distributed Lock을 구현하는 여러 방법과 우리의 선택 channel.io
✍️ 마무리하며Redis를 이용한 분산 잠금은 빠르고 간편하지만, 장애 상황까지 고려한 정교한 설계가 필요합니다.RedLock은 그 한계를 보완하기 위한 좋은 접근법이지만, 사용 환경에 따라 조합 또는 대안도 검토해야 합니다.