Blog

[Spring][258] 레디스 분산락을 이용한 동시성 문제 대응

Category
Author
Tags
PinOnMain
1 more property

레디스 분산 락이란?

레디스(Redis) 분산 락은 여러 컴퓨터 또는 프로세스 간에 자원의 동시 접근을 제어하기 위한 메커니즘입니다. 분산 시스템에서 여러 노드가 동일한 자원에 접근하려 할 때, 일관성과 순서를 유지하면서 동시성 문제를 해결하는 데 쓰입니다.

레디스 분산 락의 필요성

동시성 관리: 복수의 인스턴스가 동일한 데이터를 동시에 수정하려 할 때, 데이터 불일치를 방지합니다.
일관성 유지: 분산 시스템 내에서 데이터의 일관성을 유지하며, 작업의 순서를 보장합니다.
데드락 방지: 데드락을 감지하고 해결하는 메커니즘을 제공합니다.

레디스 분산 락의 작동 원리 ( Redisson )

1.
락 회득: Redisson은 Lua 스크핍트를 사용하여 락을 획득합니다. 이 스크립트는 락키가 존재하지 않는 경우에만 락 키를 생성하고, 이 키에 대한 유효 시간 (TTL)을 설정합니다. 이로 인해 서버나 애플리케이션에 문제가 발생하여 락을 해제하지 못하는 경우에도 설정된 유효 시간 이후에 자동으로 락이 해제됩니다.
2.
레디스 키의 유효기간: 락을 회득 시 레디스 키에 유효기간을 설정하여 락 획득자가 특정 시간 안에 작업을 완료하지 못하면 락이 자동으로 해제되도록 합니다. 이를 통해 데드락을 방지합니다.
3.
락 재진입: Redisson은 동일한 락을 여러번 회득 할 수 있는 재진입 가능한 락을 지원합니다. Lua 스크립트는 락을 요청하는 쓰레드나 인스턴스가 이미 락을 보유하고 있는지를 확인하고 만약 락을 가지고 있다면 락 획득 요청을 허용하여 재진입을 가능하게 합니다.
4.
락 해제: 락을 해제할 때도 Lua 스크립트를 사용하여 락 획득자만이 락을 해제할 수 있도록 합니다. 스크립트는 락 획득자의 식별자와 저장된 식별자가 일치하는지 확인하고, 일치할 경우에만 락을 해제합니다.
5.
Pub/Sub 메커니즘: 락이 사용 중일 때 다른 프로제스가 락을 획득하기 위해 대기해야하는 경우, Redisson은 Redis의 발행/구독(pub/sub) 기능을 사용하여 락이 해제될 때까지 대기 중인 프로세스에게 알림을 전달합니다.
→ 모든 작업이 Lua 스크립트를 통해 원자적으로 처리되기에 분산 환경에서도 높은 성능과 일관성을 유지하여 락을 안전하게 관리할 수 있습니다.

레디스 분산 락의 특징

성능: 레디스는 인-메모리 데이터 스토어로, 빠른 성능을 제공합니다.
가용성: 레디스 클러스터를 통해 고가용성을 보장하고, 노드 장애가 발생해도 락 기능이 지속됩니다.
확장성: 큰 트래픽과 데이터 셋에도 확장이 가능합니다.

구현 시 고려사항

락의 안전성: 장애 상황에서 락이 안전하게 해제되는지 확인해야 합니다.
락의 성능: 락이 시스템의 성능에 미치는 영향을 평가합니다.
락 해제 메커니즘: 락을 안전하게 해제할 수 있는 메커니즘이 필요합니다.
시계 동기화: 분산 시스템의 서로 다른 노드 간 시계 동기화 문제를 고려해야 합니다.

Redisson VS ZooKeeper

ZooKeeper
합의 알고리즘 기반 ZooKeeper는 Zab이라는 합의 기반 알고리즘을 사용하여 클러스터 내 모든 노드가 데이터에 대해 일관된 뷰를 유지하도록 합니다. 이는 데이터의 일관성이 매우 중요한 트랜잭션 처리나 서비스 발견, 리더 선출 등의 기능에 적합합니다.
높은 일관성 ZooKeeper는 일관성을 중시하지만, 그로 인해 응답 시간이 길어질 수 있는 단점이 있습니다. 특히 분산락과 같이 민감한 작업을 수행할 때 안정적인 처리가 요구됩니다.
복잡한 설정 ZooKeeper를 효과적으로 운영하기 위해서는 상세한 설정과 클러스터 관리가 필요하며 지속적인 상태 유지를 위해 고성능의 디스크 I/O가 필요할 수 있습니다.
Redisson
인메모리 데이터 스토어 Redisson은 Redis의 인메모리 데이터 저장 기능을 활용하여 데이터를 저장하므로 빠른 읽기 및 쓰기 속도를 제공합니다. 이는 실시간 처리가 중요한 작업에 특히 유리합니다.
다양한 데이터 구조와 API Redis는 리스트, 세트, 해시, 스트림 등 다양한 데이터 구조를 지원하고, 이를 위한 풍부한 API를 제공합니다. 개발자들은 이를 통해 다양한 유형의 데이터를 쉽게 처리하고 빠르게 애플리케이션을 개발할 수 있습니다.
간편한 설정과 관리 Redisson의 설치 및 관리는 비교적 단순하며, 다른 솔루션에 비해 유지보수가 적게 필요합니다. 개발과 운영에 있어 시간과 자원을 절약할 수 있는 장점이 있습니다.
확장성과 고성능 Redisson은 Redis 클러스터를 이용한 확장성을 제공하고, 데이터 샤딩과 복제를 통해 높은 가용성을 보장합니다.
책 나눔 서비스는 실시간 처리가 중요하고 빠른 데이터 접근이 필요한 서비스 특성 상, ZooKeeper의 높은 일관성과 복잡한 설정 대신 Redisson의 빠른 데이터 처리 속도와 간편한 관리, 확장성 및 고성능을 중시하여 Redisson을 선택하게 되었습니다.

프로젝트[카프카 분산 환경]에서 가장 적합한 락은?

카프카를 활용하는 다수의 서버가 존재하는 환경에서 데이터베이스 또는 애플리케이션 레벨의 락은 몇 가지 한계점을 드러냅니다. 카프카는 분산 스트리밍 플랫폼으로, 높은 처리량과 메시지 순서의 정확성을 목표로 설계되었습니다. 개별 파티션 내에서는 이러한 목표를 효과적으로 달성하지만, 다수의 파티션에 걸쳐 병렬로 처리될 때 전체 시스템의 일관성 유지는 쉽지 않은 과제가 됩니다.
데이터베이스 락은 일관성을 위해 필수적이긴 하지만 병렬 처리 환경에서 성능 저하와 시스템 복잡도의 증가라는 대가를 치르게 됩니다. 애플리케이션 레벨의 락도 코드 복잡도를 높이고, 데드락과 같은 부작용을 초래할 위험이 있습니다. 특히 분산 환경에서는 여러 인스턴스 간의 상태 동기화에 있어서 이러한 전통적인 락 방식이 한계를 보이는 경우가 많습니다.
이에 반해 레디스를 활용한 분산 락은 분산 시스템 상에서의 서비스 인스턴스 간 동기화 문제에 효과적인 해결책을 제시합니다. 레디스는 인-메모리 데이터 스토어로서, 빠른 처리 속도와 함께 대규모 트래픽을 관리할 수 있는 안정적인 성능을 자랑합니다. 이를 통해 카프카의 병렬 처리 능력을 유지하면서도 레디스의 신속한 데이터 액세스 능력과 결합해, 동시성 문제를 효과적으로 해결하고 시스템의 전반적인 성능을 최적화할 수 있는 방안을 제공합니다.

프로젝트 내 카프카 및 레디스 분산락 구현 흐름도