본문 바로가기

ChatGPT/AWS Serverless

[AWS][DynamoDB] DynamoDB에서의 분삭 Lock 소개 - 2

반응형

1. 분산 시스템에서의 락의 필요성

분산 시스템에서 락(또는 Lock)은 여러 프로세스 또는 스레드가 공유 자원에 액세스 할 때 상호 배제를 유지하기 위해 사용됩니다. 락은 한 번에 한 사용자만 자원에 액세스할 수 있게 만들어 주어 동시성 문제를 해결하는 데 중요한 역할을 합니다.

분산 시스템에서는 락의 필요성이 더욱 중요해집니다. 분산 환경에서 락은 여러 노드에서 액세스하는 자원에 대한 일관성을 유지하기 위해 사용됩니다. 따라서, 분산 락은 대규모 시스템에서 고성능 및 안정성을 보장합니다.

분산 락을 구현하는 가장 일반적인 방법은 중앙 집중형 뮤텍스와 같은 중앙 집중식 락 메커니즘을 사용하는 것입니다. 하지만 이 방법은 분산 시스템의 확장성과 가용성 문제를 야기할 수 있습니다. 대안적인 방법으로, 분산 환경에서 분산 락 메커니즘을 이용하여 이 문제들을 해결할 수 있습니다.

이후 소개될 DynamoDB의 분산 락은 이러한 문제들을 해결할 수 있는 좋은 대안 중 하나입니다.

2. DynamoDB가 제공하는 분산 Lock 솔루션

Amazon Web Services(AWS)는 분산 시스템에서 락을 관리하기 위한 DynamoDB의 락 매커니즘을 제공합니다. DynamoDB 락은 분산 환경에서 락 메커니즘을 구현하기 위해 분산 요청, 동시성 제어 및 패턴에서 오류 처리를 위한 몇 가지 기능으로 이루어져 있습니다.

DynamoDB 락은 애플리케이션 전반에서 분산 락을 활용할 수 있게 해주기 때문에, 대규모 시스템에서 애플리케이션 레벨로 락을 관리하면서 사용자, 데이터 및 규모에 따라 최적화가 가능합니다.

DynamoDB는 또한 분산 환경에서 락을 관리하기 위한 몇 가지 기본적인 추상화를 제공하여 사용자가 애플리케이션에서 락을 관리하기 위한 특정 동일한 인프라를 만들 수 있어야 하지 않고, 사용자가 더욱 편리하게 락을 활용할 수 있습니다.

이러한 기능을 사용하여 DynamoDB 락을 적극적으로 활용하여 분산 자원에 대한 일관성을 유지할 수 있습니다.

3. DynamoDB의 락 매커니즘 이해하기

DynamoDB는 분산 환경에서 락 메커니즘을 구현하기 위해 두 가지 유형의 락을 제공합니다. 첫 번째 유형의 락은 한 번에 한 사용자가 액세스하는 단일 레코드를 위한 락입니다. 이 빠르고 간단한 락 메커니즘은 DynamoDB에서 제공하는 PutItem 및 DeleteItem과 같은 작업에서 많이 사용됩니다. 다른 유형의 락은 트랜잭션이나 조건부 쓰기를 사용하는 복잡한 조건에서 락을 사용하도록 선택할 수 있습니다.

DynamoDB 락을 사용하는 경우, 각 락은 크게 세 가지 요소로 구성됩니다.

  • Partition Key: 블록을 유일하게 식별하는 데 사용되는 값
  • Lock ID: 락 식별자와 관련된 값
  • Time-to-Live(TTL): 락이 자동으로 식별되는 시간

락을 요청하면 서비스는 먼저 해당 파티션을 찾습니다. 그런 다음 요청이 도착했는지 확인하고 찾은 파티션에서 요청을 실행할 수 있습니다. 때로는 여러 클라이언트가 같은 락을 동시에 요청할 수 있는데, 이 때 서비스는 요청의 순서를 지정한 후에 락을 적용합니다.

DynamoDB 락 메커니즘은 일반적으로 두 가지 방법으로 작동합니다.

  1. Pessimistic Locking (비관적 락) - 필요한 자원을 사용 중인 경우 해당 자원을 다른 대기열에서 대기하도록 설정합니다.
  2. Optimistic locking (낙관적 락) - 여러 사용자가 동시에 자원에 접근하는 것을 허용하고 변경 시도를 제어해 최종 상태가 일치하도록 합니다.

DynamoDB는 Optimistic Locking 방식을 주로 사용합니다. DynamoDB에서 낙관적 락은 Conditional Writes를 이용해 처리됩니다. Conditional Writes는 업데이트하는 동안 조건문을 설정할 수 있습니다. 그렇게 하면 여러 클라이언트가 동시에 같은 데이터를 업데이트하더라도 최종 결과가 일치하도록 할 수 있습니다.

그러나 낙관적 락이 실패할 경우 서비스는 Conditional Check Failed 예외를 반환합니다. 이때, 해당 예외가 발생했을 경우 락을 다시 시도해야합니다. 이를 위해 DynamoDB는 Retry Mechanism을 내장하고 있습니다.

이렇게 DynamoDB 락 메커니즘은 자원의 일관성과 동시성을 유지하기 위해 낙관적 락 기술과 Retry Mechanism 등의 다양한 기술을 적극 활용합니다.

4. 락을 사용하는 예시 분석

DynamoDB 락 메커니즘은 분산 시스템에서 사용자에게 분산 된 자원에 대한 일관성을 유지할 수 있는 유용한 방법입니다. 락 메커니즘은 여러 클라이언트가 자원에 동시에 액세스할 수 있기 때문에, 조건부 쓰기 및 트랜잭션 작업과 같은 복잡한 작업을 안정적으로 수행할 수 있는 환경을 제공합니다.

예를 들어, 여러 사용자가 동시에 동일한 제품에 대한 주문을 생성한다고 가정해보겠습니다. 이 경우, 락 메커니즘을 사용하면 주문이 동시에 생성되는 것을 방지할 수 있습니다. 즉, 자원의 일관성과 동시성을 보장하는 데 도움이 됩니다.

이와 같은 상황에서 DynamoDB는 조건부 쓰기 기능을 제공합니다. 조건부 쓰기를 사용하면 자원이 일관성을 유지하면서 여러 클라이언트가 동시에 레코드를 변경할 수 있습니다. 예를 들어, 레코드가 추가될 때 조건부 쓰기를 사용하여 해당 레코드가 이전에 존재하지 않는 경우에만 추가할 수 있습니다. 이렇게 하면 다른 클라이언트가 이미 레코드를 추가해 버린 경우를 방지할 수 있습니다.

위 예시에서, 락 메커니즘이 없다면 여러 사용자가 동시에 주문을 생성하면, DynamoDB에서 생성한 주문들 중 어떤 것이 진행되었는지 파악하기 힘들어져, 일관성이 유지되지 않을 가능성이 큽니다. 따라서 락을 활용하여 하나의 주문을 독점적으로 생성하도록 할 수 있습니다.

위 예시에서 보듯이, DynamoDB 락은 분산 시스템에서 자원의 일관성과 동시성을 유지할 수 있는 좋은 방법이며, 다중 사용자 환경에서 데이터 일치성을 보장하는 데 큰 도움을 줍니다.

5. 락을 사용할 때 고려해야 할 사항

DynamoDB 락 메커니즘을 사용하면 분산 시스템에서 자원의 일관성과 동시성을 유지할 수 있지만, 이를 사용하는 데는 몇 가지 고려해야 할 사항이 있습니다.

  1. 락 경합: 락 경합이 발생하면 서비스는 다른 요청과 함께 요청을 처리하려고 시도할 수 있습니다. 이 경우 서비스는 락을 얻은 요청을 처리할 수 있도록 다른 요청을 대기 시킵니다.
  2. 락 타임아웃: 락을 얻을 수 없는 경우 타임아웃이 발생합니다. 이때 시간 제한을 늘리거나 락을 다시 요청하는 등의 처리를 할 수 있습니다.
  3. 락의 획득 및 해제: 락을 사용한 후에는 락을 해제해야 다른 클라이언트가 사용할 수 있습니다. 이를 위해, 모든 클라이언트는 락을 획득할 때 타임스탬프를 저장하고 락을 해제할 때 해당 타임스탬프를 사용합니다.
  4. 락 확장: 락을 확장하는 것은 락을 얻은 기간을 연장하는 것입니다. 락 관리 시스템이 이 기능을 제공할 경우, 락을 확장하여 락 유지 기간을 더 길게 할 수 있습니다.
  5. 락 정책: 락 정책을 설정하여 락을 요청한 사용자에 대한 권한 부여를 할 수 있습니다. 이를 통해 불필요한 락 경합을 방지할 수 있습니다.

이와 같은 고려 사항을 고려하여 DynamoDB 락 메커니즘을 사용하면 분산 시스템에서 안정적으로 자원 관리를 할 수 있습니다.

6. DynamoDB를 이용한 락 활용 팁

DynamoDB 락 메커니즘은 분산 시스템에서 자원의 일관성과 동시성을 유지하는 좋은 방법입니다. 이를 사용할 때 더욱 효율적인 방법으로 다음과 같은 팁을 고려할 수 있습니다.

  1. 적절한 TTL 값 설정하기: TTL 값은 락을 획득한 후 자동으로 락이 해제되는 시간을 지정합니다. 이 값이 너무 작으면 처리 중 문제가 발생할 가능성이 있으며, 반대로 너무 크면 락이 해제되기 전에 오랫동안 대기하게 됩니다. 적절한 TTL 값을 설정하여 최선의 성능을 얻을 수 있도록 합니다.
  2. 조건부 쓰기 기능을 최대한 활용하기: 조건부 쓰기 기능을 사용하면 락을 얻지 않고도 자원에 대한 조건식을 설정할 수 있습니다. 이를 사용하면 불필요한 락 경합을 줄이고 처리의 성능을 높일 수 있습니다.
  3. Retry Mechanism 적용하기: 락을 얻는 과정에서 실패할 경우, Retry Mechanism을 적극적으로 활용해 다시 시도합니다. 이를 통해 락 경합 상황에서의 처리 효율성을 높일 수 있습니다.
  4. 락 사용 제한하기: 락은 효율적이긴 하지만 서비스에서 락을 사용하는 클라이언트 수를 줄이는 게 더 좋을 수 있습니다. 락 사용을 최소화하여 처리 성능을 높였다면, 다른 자원 관리 기술을 찾아보는 것이 좋습니다.
  5. 분산된 자원에 대한 파티션 키 선택하기: DynamoDB는 분산된 자원을 처리할 때 파티션 키를 사용합니다. 이때 파티션 키는 자원의 일관성을 유지하는 데 중요한 역할을 합니다. 따라서 파티션 키에 대한 신중한 선택이 필요합니다.

이와 같은 팁을 고려하면 DynamoDB 락 메커니즘을 효과적으로 활용하여 안정적인 분산 시스템을 구축할 수 있습니다.

7. 마치며

DynamoDB는 매우 유연하고 확장성이 높은 분산형 데이터베이스입니다. 이러한 환경에서 일관성과 동시성을 유지하는 데 DynamoDB 락 메커니즘은 뛰어난 솔루션입니다. 이를 활용하는 방법과 함께 고려해야 할 사항과 유의할 점을 알아보았습니다.

DynamoDB 락은 자원의 일관성과 동시성을 보장하는 데 매우 유용한 도구입니다. 그러나 이를 사용할 때 효율적인 방법을 선택하고 다양한 고려사항을 고려하여 시스템을 구성해야 합니다. 이를 통해 안정적이고 일관되고 동시성이 유지되는 분산 시스템을 구축할 수 있습니다.

만약 DynamoDB를 사용한다면 락 메커니즘을 이용해서 안전하고 확장할 수 있는 체계를 구축하여 새로운 시스템을 만들어 보시길 권해드립니다.

 

https://youtu.be/uDwO5lSTaHE

이 글을 동영상에서 확인할 수 있듯이 OpenAI API를 이용해 구현한 서비스 G-ChatBot을 이용해서 작성하였습니다.

이 글은 기존글과 비교하기 위해 Chat 모드로 작성한 글입니다.

https://tobelinuxer.tistory.com/101

 

[AWS][DynamoDB] DynamoDB에서의 분산 Lock 소개 - 1

1. 분산 시스템에서의 락의 필요성 컴퓨팅 시스템은 대부분 분산 시스템으로 구성되어 있습니다. 이러한 분산 시스템에서는 여러 대의 서버가 데이터를 공유하고 동시에 처리할 수 있습니다. 하

tobelinuxer.tistory.com

 

반응형