분산 락(Distributed Lock)
•
분산 락이란 네트워크상에 분산된 여러 시스템들 사이에서 공유 자원에 대한 접근을 안전하게 조정하기 위해 사용하는 메커니즘입니다.
•
분산 시스템에서 각각의 컴퓨터는 독립적인 처리를 수행하지만, 공유 자원에 대해 동시에 접근하려 할 때는 일관성과 무결성을 유지해야 합니다.
분산 락은 이러한 환경에서 데이터 또는 자원의 상태가 예기치 않게 변경되는 것을 방지합니다.
•
분산 락을 구현하는 것은 일반적인 락보다 훨씬 복잡합니다. 네트워크 지연, 시스템 장애, 메시지 손실 등의 문제를 처리할 수 있어야 하며, 데드락을 방지하고 고가용성을 보장해야 합니다.
Redis 분산락
Redis는 고성능의 인메모리 데이터 저장소로서, 분산 락을 구현하는 데 사용될 수 있습니다.
Redis의 기능 중 하나인 'SETNX' (Set if not exists) 명령어는 특정 키가 존재하지 않을 때만 값을 설정할 수 있게 해주므로, 분산 락을 구현하는 데 유용합니다.
여러 시스템이 동일한 키를 기준으로 락을 시도할 때, 'SETNX' 명령어를 사용하면 오직 한 시스템만이 키를 성공적으로 설정할 수 있고, 이를 통해 락을 획득하게 됩니다.
Redis 분산락을 사용하는 과정
1.
락을 얻기 위해, 시스템은 'SETNX' 명령어를 사용하여 특정 키를 설정합니다.
2.
만약 키가 설정되면 (즉, 아직 락이 걸리지 않았다면), 시스템은 락을 획득합니다.
3.
키가 이미 존재한다면 (다른 시스템이 락을 걸었다면), 시스템은 락을 획득하지 못하고 대기합니다.
4.
락을 건 시스템이 작업을 완료하면, 해당 키를 삭제하여 락을 해제합니다.
주의점
Redis 분산락은 단일 실패 지점 없이 안정적으로 분산 시스템의 동시성 문제를 해결할 수 있는 방법 중 하나입니다.
하지만, 네트워크 지연이나 노드 실패와 같은 분산 시스템 특유의 문제를 고려하여 락을 구현해야 합니다.
예를 들어, 락을 해제하기 전에 시스템이 실패할 경우, 자원이 무한히 락 상태에 머물러 있지 않도록, 락에 타임아웃을 설정하는 것이 일반적입니다.