Redis 분산 락

헨도·3일 전
0

Redis

목록 보기
1/3
post-thumbnail

Redis 분산 락이란?

Redis 분산 락은 여러 인스턴스나 서버가 동시에 같은 자원(데이터)을 수정하거나 접근할 때 발생할 수 있는 충돌이나 Race Condition을 막기 위해 사용하는 일종의 락(Lock) 시스템

이를 Redis 의 빠른 In-Memory 특성을 활용하여 구현!

즉, 여러 서버/프로세스가 동시에 공유 리소스에 접근할 때, 한 시점에 하나만 접근 가능하게 보장해주는 락
-> 서버 간에도 락을 공유해야하기 때문에 Redis 같은 중앙 In-Memory 저장소를 활용

Redis 락의 기본 원리

락 선점

대표적인 방식으로 SET key value NX PX expireTime 사용

SET lock_key unique_value NX PX 3000
  • NX : 키가 없을 때만 세팅 (즉, 이미 누가 락을 잡았으면 실패)
  • PX 3000 : 3초동안만 락 유지 (타임아웃 방지)
  • unique_value : 락을 누가 잡았는지 구분하기 위한 고유 값 (UUID 같은 값 사용)

예시

SET lock:seat:123 abc123 NX PX 3000

락 해제

락을 해제할 땐 반드시 자기가 잡은 락인지 확인 후 지워야함
(unique_value 를 확인하고 지우는 로직을 Lua Script 를 활용하여 실행)

if redis.call("get", KEY[1]) == ARGV[1] then
	return redis.call("del", KEYS[1])
else
	return 0
end

Redlock 알고리즘

Redlock 은 네트워크 장애나 Redis 장애에도 일정 수준의 안정성을 가져갈 수 있도록 설계된 분산 락 알고리즘
단일 Redis 에 의존하지 않고 여러 개의 Redis 노드에 락을 잡아서 다수결로 락 획득 여부를 결정

동작 방식

  1. 락을 N개 Redis 인스턴스에 동일하게 잡는다.
  2. 과반수 성공 시 락 획득
  3. 시간 기준으로 타임아웃 관리
  4. 락 해제는 동일하게 과반수 해제

주의 사항

락 타임아웃 설정

  • 락이 영구히 걸리면 데드락 발생이 되므로 반드시 expireTime 설정

락 획득 실패 시 재시도 정책

  • 일정 시간 뒤에 재시도 (exponential backoff)

락 해제 시 본인이 잡은 락인지 확인

  • unique_value 값을 확인한 후 일치하면 삭제

단일 Redis 환경에서는 Redis 장애 시 락 보장 불가

  • 고가용성이 필요하면 Redlock 알고리즘 추천
profile
Junior Backend Developer

0개의 댓글