[AWS SAA-C03] AWS DynamoDB 정리

DynamoDB

  • 완전관리형 NoSQL 데이터베이스 서비스
  • 모든 양의 데이터를 저장 및 검색하고 모든 수준의 요청 트래픽을 처리할 수 있는 간단하고 비용 효율적인 서비스
  • 원활한 확장성과 함께 빠르고 예측 가능한 성능 제공
  • 고객은 하드웨어 프로비저닝, 설정 및 구성, 복제, 소프트웨어 패치 또는 클러스터 확장에 대해 걱정할 필요 없이 분산 데이터베이스 운영 및 확장에 따른 관리 부담을 AWS로 분산할 수 있다.
  • DynamoDB 테이블에는 고정된 스키마가 없으며, 테이블은 항목으로 구성되며 각 항목은 서로 다른 수의 속성을 가질 수 있다.
  • DynamoDB는 AWS 리전에 있는 세 개의 시설에 데이터를 동기식으로 복제하여 고가용성과 데이터 내구성을 제공한다.
  • DynamoDB는 빠른 인플레이스 업데이트를 지원한다. 한 번의 API 호출로 숫자 속성을 연속적으로 늘리거나 줄일 수 있다.
  • DynamoDB는 검증된 암호화 방법을 사용하여 사용자를 안전하게 인증하고 무단 데이터 액세스를 방지한다.
  • SSD 스토리지와 자동 3방향 복제를 통해 내구성, 성능, 안정성, 보안이 내장되어 있다.
  • DynamoDB에는 두 가지 종류의 기본 키를 지원한다.
    = 파티션 키(이전에는 해시키라고 함)
    = 하나의 속성으로 구성된 간단한 기본 키
  • 파티션 키 값은 내부 해시 함수에 대한 입력으로 사용되며, 해시 함수의 출력에 따라 항목이 저장될 파티션이 결정된다.
  • 테이블의 두 항목은 동일한 파티션 키 값을 가질 수 없다.
  • 파티션 키 및 정렬 키
    = 복한 기본 키는 두 가지 속성으로 구성된다. 첫 번째 속성은 파티션 키이고 두 번째 속성은 정렬 키이다.
    = 파티션 키 값은 내부 해시 함수의 입력으로 사용되며, 해시 함수의 출력에 따라 항목이 저장될 파티션이 결정된다.
    = 같은 파티션 키를 가진 모든 항목은 정렬 키 값에 따라 정렬된 순서대로 함께 저장된다.
    = 파티션 키와 정렬 키의 조합은 고유해야 한다.
    = 두 항목이 동일한 파티션 키 값을 가질 수는 있지만 두 항목의 정렬 키 값은 서로 달라야 한다.
  • 현재 지원되는 DynamoDB 테이블 클래스
    = DynamoDB Standard 테이블 클래스가 기본값이며 대부분의 워크로드에 권장된다.
    = 저장 공간이 주요 비용인 테이블에 최적화된 DynamoDB 표준-빈번하지 않은 액세스(DynamoDB 표준-IA)
  • DynamoDB 보조 인덱스
    = 성능에 영향을 주지 않으면서 쿼리에 유연성을 추가한다.
    = 인덱스가 정의된 테이블에 존재하는 경우에만 항목이 인덱스에 표시되므로 인덱스에 대한 쿼리가 매우 효율적이다.
    = DynamoDB 처리량과 한 자릿수 밀리초 지연 시간으로 게임, 광고 기술, 모바일 및 기타 여러 애플리케이션에 매우 적합하다.
    = 자주 변경되지 않는 데이터에 대한 많은 양의 읽기를 오프로드하기 위해 DynamoDB 앞에 ElasticCache 또는 DAX를 사용할 수 있다.

DynamoDB 일관성

  • 각 DynamoDB 테이블은 내구성을 위해 지리적으로 분산된 세 위치에 자동으로 저장된다.
  • 읽기 일관성은 데이터 항목의 성공적인 쓰기 또는 업데이트가 동일한 항목의 후속 읽기 작업에 반영되는 방식과 타이밍을 나타낸다.
  • DynamoDB에서는 사용자가 요청 시점에 읽기 일관성을 최종 일관성 또는 강력 일관성으로 지정할 수 있다.
    = 최종적으로 일관된 읽기(기본값)
    최종 일관성 옵션은 읽기 처리량을 최대화한다.
    모든 복사본의 일관성은 일반적으로 1초 이내에 도달한다.
    그러나 최종적으로 일관된 읽기는 최근에 완료된 쓰기 결과를 반영하지 않을 수 있다.
    짧은 시간 후에 읽기를 반복하면 업데이트된 데이터가 반환되어야 한다.
    DynamoDB는 기볹거으로 최종적으로 일관된 읽기를 사용한다.
    = 강력하게 일관된 읽기
    읽기 전에 성공적인 응답을 받은 모든 쓰기를 반영하는 결과를 반환한다.
    최종적으로 일관된 읽기 비용에 비해 2배이다.
    강력하게 일관된 읽기는 단점이 존재한다.
    * 네트워크 지연 또는 중단이 발생하면 강력하게 일관된 읽기를 사용하지 못할 수 있다. 이 경우
    DynamoDB는 서버 오류(HTTP 500)를 반환할 수 있다.
    * 강력하게 일관된 읽기는 최종적으로 일관된 읽기보다 지연 시간이 더 길 수 있다.
    * 강력하게 일관된 읽기는 글로벌 보조 인덱스에서는 지원되지 않는다.
    * 강력하게 일관된 읽기는 최종적으로 일관된 읽기보다 더 많은 처리량 용량을 사용한다.
    * 읽기 작업(예: GetItem, Query 및 Scan)은 ConsistentRead 매개변수를 제공하며, 이 매개변수를 true로 설정하면 DynamoDB는 작업 중에 강력하게 일관된 읽기를 사용한다.
    * Query, GetItem 및 BatchGetItem 작업은 기본적으로 최종적으로 일관된 읽기를 수행한다.
    * 쿼리 및 GetItem 작업을 강제로 일관성을 유지하도록 설정할 수 있다.
    * 쿼리 작업은 글로벌 보조 인덱스에서 강력하게 일관된 읽기를 수행할 수 없다.
    * 테이블별로 강력하게 일관성을 유지하도록 BatchGetItem 작업을 강제할 수 있다.

DynamoDB 처리 용량

  • DynamoDB 처리 용량은 테이블의 읽기 및 쓰기 처리를 위한 읽기/쓰기 용량 모드에 따라 달라진다.
  • DynamoDB는 두 가지 유형의 읽기/쓰기 용량 모드를 지원한다.
    = 프로비저닝됨 - 애플리케이션이 테이블 또는 인덱스에서 사용할 수 있는 초당 읽기/쓰기 기준 최대 용량이다.
    = 온디맨드 - 용량 계획 없이 초당 수천 건의 요청을 처리한다.
  • DynamoDB 자동 확장 기능은 실체 트래픽 패턴에 따라 사용자를 대신해 프로비저닝된 처리량 용량을 동적으로 조정할 수 있도록 지원한다.
  • DynamoDB 적응형 용량은 불균현한 워크로드를 무한정 실행할 수 있도록 하는 기능이다.

DynamoDB 보조 인덱스

  • DynamoDB 보조 인덱스는 성능에 영향을 주지 않으면서 쿼리에 유연성을 추가한다.
  • 인덱스가 정의된 테이블에 존재하는 경우에만 항목이 인덱스에 표시되므로 인덱스에 대한 쿼리가 매우 효율적이다.
  • 테이블의 DynamoDB 보조 인덱스를 사용하면 기본 키 이외의 속성을 가진 데이터에 효율적으로 액세스할 수 있다.
  • DynamoDB 보조 인덱스는 두 가지 유형을 지원한다.
    = 글로벌 보조 인덱스 - 파티션 키와 기본 테이블의 키와 다를 수 있는 정렬 키가 있는 인덱스이다.
    = 로컬 보조 인덱스 - 기본 테이블과 파티션 키는 같지만 정렬 키는 다른 인덱스이다.

AWS DynamoDB 모범 사례

설계의 차이점

RDBMS 설계와 대조적으로, DynamoDB 스키마 설계 시 차이점이 존재한다. DynamoDB 애플리케이션에서 가능한 한 적은 수의 테이블을 유지해야 한다. 테이블 수가 적으면 확장성이 향상되고, 권한 관리가 덜 필요하며, DynamoDB 애플리케이션의 오버헤드가 줄어든다. 또한 전반적으로 백업 비용을 낮추는 데 도움이 된다.

기본 키 설계

  • 기본 키는 DynamoDB 테이블의 각 항목을 고유하게 식별하며, 단순(파티션 키만) 또는 복합(파티션 키와 정렬 키가 결합된) 키일 수 있다.
  • 테이블 기본 키의 파티션 키 부분은 테이블의 데이터가 저장되는 논리적 파티션을 결정하며, 이는 다시 기본 물리적 파티션에 영향을 미친다.
  • Hot Key 및 Hot Partition 피하기 - I/O 요청을 균등하게 분배하지 않는 파티션 키 설계는 "Hot" 파티션을 생성하여 스로틀링을 유발하고 프로비저닝된 I/O 용량을 비효율적으로 사용할 수 있다.
  • 파티션 키에는 고유한 값이 많아야 한다.
  • 핫 파티션을 피하기 위해 읽기/쓰기를 파티션 전체에 균일하게 분산한다.
  • 핫 데이터와 콜드 데이터를 별도의 테이블에 저장한다.
  • 가능한 모든 쿼리 패턴을 고려하여 스캔과 필터를 사용하지 않도록 한다.
  • 애플리케이션의 필요에 따라 정렬 키를 선택한다.

보조 인덱스

  • 애플리케이션의 쿼리 패턴에 따라 인덱스를 사용한다.
  • 로컬 보조 인덱스 - LSI
    = 강력한 일관성이 필요한 경우 기본 키 또는 LSI 사용
    = 항목 컬렉션 확장에 주의(10GB 제한)
  • 글로벌 보조 인덱스 - GSI
    = 처리량을 보다 세밀하게 제어하거나 애플리케이션에서 다른 파티션 키를 사용해 쿼리해야 하는 경우 GSI를 사용한다.
    = 궁극적으로 일관된 읽기 복제본에 사용 가능 - 상위 테이블과 동일한 키 스키마를 가진 글로벌 보조 인덱스를 설정하고, 키가 아닌 속성의 일부 또는 전부를 투영한다.
  • 더 적은 수의 속성 투영 - 보조 인덱스는 스토리지와 프로비저닝된 처리량을 소비하므로 인덱스의 크기를 가능한 작게 유지해야 더 나은 성능을 제공할 수 있다.
  • 인덱스 수를 최소한으로 유지 - 자주 쿼리하지 않는 속성에 대해서는 보조 인덱스를 만들지 않도록한다. 거의 사용되지 않는 인덱스는 애플리케이션 성능을 개선하지 않고 스토리지 및 I/O 비용을 증가시킨다.

큰 항목 및 속성

  • DynamoDB는 현재 테이블에 저장되는 각 항목의 크기를 제한한다.
  • 더 짧으면서도 직관적인 속성 이름을 사용한다.
  • 항목 크기를 작게 유지
  • 압축(GZIP) 사용
  • 큰 속성을 여러 항목으로 분할
  • 메타데이터는 DynamoDB에, 대용량 BLOB 또는 속성은 S3에 저장하기

데이터 쿼리 및 스캔

  • 스캔 및 필터 피하기 - 스캔 작업은 DynamoDB의 다른 작업보다 효율성이 떨어진다. 스캔 작업은 항상 전체 테이블 또는 보조 인덱스를 스캔한다. 그런 다음 값을 필터링하여 결과를 제공하므로 기본적으로 결과 집합에서 데이터를 제거하는 추가 단계가 필요하다.
  • 읽기에 최종 일관성 사용

시계열 데이터

  • 시계열 데이터를 저장하기 위해 일, 주, 월 등의 테이블을 사용한다. 필요한 읽기 및 쓰기 용량과 필요한 인덱스로 프로비저닝된 기간당 하나의 테이블을 만든다.
  • 각 기간이 끝나기 전에 다음 기간에 사용할 테이블을 미리 빌드한다. 현재 기간이 종료되면 이벤트 트래픽을 새 테이블로 보낸다. 테이블에 기록된 기간을 지정하는 이름을 할당한다.
  • 테이블에 더 이상 쓰기를 하지 않는 즉시 프로비저닝된 쓰기 용량을 더 낮은 값(예: 1 WCU)으로 줄이고, 적절한 읽고 용량을 프로비저닝한다. 오래된 테이블은 오래된 만큼 프로비저닝된 읽기 용량을 줄인다. 콘텐츠가 거의 필요하지 않거나 전혀 필요하지 않은 테이블은 아카이브하거나 삭제한다.

출처

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/best-practices.html

반응형