고민의 시작
- redis의 Redlock과 원자적 연산에 대해 개념을 헷갈리는 것 같아 정리했다.
RedLock
redlock은 redis를 이용한 분산 락 알고리즘이다.
- redis를 여러 개의 인스턴스에서 실행할 때, 동일한 키에 대해 신뢰성 높은 락을 보장하는 방법
- 단일 redis 노드에서
SETNX
(SET if Not Exists)로 락을 구현하는 방식이 신뢰성이 부족한 문제를 해결하기 위해 고안됐다.
Redlock이 필요한 이유
기본적으로 redis의 SETNX
를 사용하면 단일 인스턴스에서만 락이 보장된다.
하지만 단일 Redis 서버가 다운되면 락이 풀릴 수 잇는 문제가 있다.
이를 해결하기 위해 여러 개의 Redis노드에 락을 분산 저장하여 가용성과 신뢰성을 높이는 것이 Redlock의 핵심 아이디어이다.
Redlock 동작 원리
Redlock은 N개의 Redis 노드 (보통 5개)를 사용하여 분산 락을 구현한다.
락을 획득하려면 과반수(N/2 +1) 이상의 노드에서 락을 성공적으로 획득해야 한다.
Redlock 프로세스
1, 현재시간을 기록한 후, 순차적으로 Redis 노드(5개)에 SETNX
로 락을 요청
SET resource_name unique_value NX PX expiration_time
- 여기서
unique_value
는 클라이언트가 생성한 랜덤한 값 PX expiration_time
은 TTL
2, N개의 Redis 노드중 과반수(N/2+1) 이상에서 락을 획득해야 성공
- 예를 들어, 5개의 Redis 중 3개 이상에서 성공하면 락 획득 완료
- 모든 노드에 락 요청을 보내는 데 걸린 시간이 TTL의 50%를 초과하면 락을 해제하고 실패처리
3, 락을 해제할 때, 획득했던 각 노드에서 unique_value
를 비교 후 삭제
IF current_value == unique_value THEN DEL key
- 이전 클라이언트의 락이 만료되지 않았는데 다른 클라이언트가 실수로 락을 해제하는 문제 방지
Redlock의 장점
- 고가용성 보장 : 여러 개의 Redis 노드 중 과반수가 정상적으로 동작하면 락을 유지 가능
- 데이터 일관성 유지 : 락을 획득한 클라이언트만 리소스를 수정 가능
- 단일 Redis 장애에 강함 : 일부 노드가 다운되더라도 과반수 이상이 살아 있으면 동작 가능
Redlock의 단점
- 락 획득 지연 가능 : 여러 개의 Redis 노드에 락을 요청해야 하므로 속도가 느려질 수 있음.
- 네트워크 파티션의 문제 : 특정 노드에서 락이 유지되었지만, 다른 노드에서는 해제될 경우 충돌 가능
- 비동기 복제 문제 : Redis가 비동기적으로 데이터를 복제하므로, 노드 간 데이터 불일치 가능
Redlock vs 단순 Redis 락
방법 | 설명 | 신뢰성 | 속도 |
---|---|---|---|
SETNX (단일 노드 락) |
하나의 Redis에서만 락을 관리 | ❌ 단일 노드 장애 시 문제 | 빠름 |
Redlock (분산 락) | 여러 개의 Redis 인스턴스를 활용하여 락을 분산 관리 | ✅ 노드 장애에 강함 | 상대적으로 느림 |
'1분 테크' 카테고리의 다른 글
Redis 너 누구야 ...?!! (0) | 2025.01.21 |
---|---|
Enum (0) | 2024.06.25 |
전략패턴(Strategy) 패턴 (0) | 2024.06.10 |
싱글톤(Singleton) 패턴 (0) | 2024.05.31 |
정규화(Normalization) (0) | 2024.03.31 |
댓글