[데이터베이스] 분산 락
분산 락
하나의 서버가 하나의 데이터베이스에 대해 접근하는 경우 프로세스 내 멀티 스레드 환경에서 스레드 간 데이터 경합을 방지하기 위해 데이터 락을 신경써야 한다.
여러 서버가 하나의 데이터베이스에 동시적으로 접근하는 분산 시스템 아키텍처에서는 스레드 뿐만 아니라 프로세스 간 데이터 경합을 위한 데이터 락이 필요하며 이러한 락을 분산 락(distributed lock)이라고 한다. 분산 락을 통한 적절한 동시 실행 제어 메커니즘이 없다면 데이터 결함, 비일관성 문제가 발생하게 된다.
분산 시스템에서 공유 데이터의 일관성 유지를 위해 프로세스의 작업을 동기화하기 위한 방법 또는 메커니즘을 분산 락 관리(distributed lock management)라고 하며 분산 락을 관리하는 역할을 수행하는 소프트웨어 컴포넌트를 분산 락 관리자(distributed lock manager)라고 한다.
분산 락 관리자는 하나의 프로세스가 공유 데이터에 대한 락을 획득하고 독점적으로(exclusive) 점유하여 사용하는 동안 다른 프로세스가 해당 데이터에 접근할 수 없도록 한다.
낙관적 동시 실행 제어(optimistic concurrency control) 기법은 데이터 경합이 발생할 가능성이 낮거나 데이터 락으로 인한 리소스 오버헤드가 높아 데이터 락을 사용하지 않는 것이 효율적이라는 가정을 기반으로 한다. 낙관적 동시 실행 제어는 데이터가 변경되는 도중에 데이터 락을 사용하지 않으며 데이터를 변경하는 트랜잭션이 실행 중이더라도 다른 트랜잭션이 데이터를 변경할 수 있도록 한다. 데이터를 변경하는 트랜잭션 중 하나의 트랜잭션이 변경을 완료하고 커밋하게 되면 다른 트랜잭션은 변경한 데이터를 커밋할 수 없으며 커밋을 시도하는 순간 데이터 충돌이 발생하게 된다. 서로 다른 트랜잭션은 서로의 데이터 변경 사항에 대해 알지 못한 채 자신만의 데이터 변경 작업을 수행하며 커밋을 가장 먼저한 트랜잭션의 데이터 변경 사항이 반영된다. 하나의 데이터를 동시에 변경하는 경우가 많지 않은 경우(데이터 변경이 매우 긴 시간 간격으로 이루어지는 상황) 낙관적 동시 실행 제어가 유용하다.
분산 시스템에서 적절한 동기화가 필요하지 않다면 낙관적 동시 실행 제어만으로도 충분하지만 분산 락이 필요하다면 더 복잡한 알고리즘을 사용한 동기화 메커니즘이 필요하다. 분산 락은 물리적으로 또는 논리적으로 분리된 네트워크 상에서 통신하는 프로세스 간 동기화를 위한 것이므로 프로세스 내 스레드 간 동기화를 위한 락 보다 오버헤드가 크며 구현의 복잡도가 높다.
CAP 정리
컴퓨터 과학에서 CAP 정리란, 분산 컴퓨터 시스템에서 일관성(consistency), 가용성(availability), 분할 허용성(partition tolerance) 모두를 동시에 지원하는 분산 컴퓨터 시스템은 없다는 것을 말한다.
분산 락 구현 방법
주키퍼
헤이즐캐스트 락 API
레드락 알고리즘
레디스 데이터베이스를 사용하여 분산 락 관리를 수행할 수 있다. 레디스는 분산 락의 표준 알고리즘을 제공하는데 이를 레드락(Redlock) 알고리즘이라고 한다.
참고
- https://martin.kleppmann.com/2016/02/08/how-to-do-distributed-locking.html
- https://redis.io/docs/latest/develop/use/patterns/distributed-locks/
- https://redisson.org/docs/data-and-services/locks-and-synchronizers/
- https://docs.hazelcast.com/imdg/4.2/data-structures/fencedlock
- https://docs.hazelcast.com/imdg/4.2/cp-subsystem/fencedlock
- https://redisson.org/glossary/java-fencedlock.html
Comments