개발계발/인프라

DynamoDB 톺아보기

냥냥친구 2022. 10. 29. 15:28

Dynamo(다이나모) DB가 NoSQL이라 key-value 구조로 데이터를 저장한다는 것만 알고 있었는데, 이번에 처음 도입해 보니 생각보다 알아야 할 게 많았다. 여기저기 문서를 참고하며 배운 내용을 기록해보자.

 

DynamoDB란?

AWS 에서 제공하는 NoSQL 기반 데이터베이스 서비스로, 데이터 읽고 쓰기, 인덱싱, 샤딩과 백업 등을 지원한다.

 

필드가 고정이 아니다.

RDB와 달리 필드가 고정이 아니다. 아래의 People 테이블에서 보듯이 AddressFavoriteColor가 없는 row도 가능하다. 여기서 없다는 것은 null이 아닌 키조차도 없음을 의미한다.

People

{
    "PersonID": 101,
    "LastName": "Smith",
    "FirstName": "Fred",
    "Phone": "555-4321"
},
{
    "PersonID": 102,
    "LastName": "Jones",
    "FirstName": "Mary",
    "Address": {
                "Street": "123 Main",
                "City": "Anytown",
                "State": "OH",
                "ZIPCode": 12345
    }
},
{
    "PersonID": 103,
    "LastName": "Stephens",
    "FirstName": "Howard",
    "Address": {
                "Street": "123 Main",
                "City": "London",                                    
                "PostalCode": "ER3 5K8"
    },
    "FavoriteColor": "Blue"
}

 

기본키는 필요하다.

다만, 다이나모도 RDB와 같이 기본키(Primary Key)가 필요하다. 다이나모에는 Partition Key와 Sort Key가 있는데, Parition Key를 단독으로 기본키로 사용하거나 Partition Key와 Sort Key를 복합키로하여 기본키로 사용할 수 있다. Key에 해당 하는 필드는 row에 값이 있어야 하며, 기본키는 고유한 값이어야 한다.

 

1. 파티션 키(Partition Key)

다이나모는 데이터를 파티션(Partition)으로 저장하는데 이 Key를 사용해 어떤 파티션에 저장할지 결정한다. 아래의 이미지와 같이 파티션 키를 해시함수 인자로 사용해서 출력되는 결과로 어떤 파티션에 저장할지 결정한다고 하는데, 이는 dynamoDB의 역할이므로 우리가 관리하지는 않는다. 

Partition Key만으로 기본키로 사용하면 해당 필드는 고유해야 한다.  People 테이블에서는 PersonId가 해당한다.

 

2. 정렬 키(Sort Key)

파티션이 고유하지 않다면 정렬 키를 사용해 복합키로써 고유키를 지정할 수 있다. 파티션에서는 이 정렬 키를 사용해 row를 정렬한다.

 

쿼리 VS 스캔

테이블의 데이터를 조회할 때 조회 방식으로 쿼리와 스캔이 있다.

 

쿼리

기본키나 인덱스를 기준으로 데이터를 조회한다. 인덱스를 기준으로 데이터를 탐색하기 때문에 빠른 결과를 기대할 수 있다. 한 번의 쿼리를 기준으로 최대 1MB의 데이터를 반환한다.

 

스캔

인덱스로 지정되지 않은 필드로 데이터을 조회한다. 풀스캔하기 때문에 쿼리보다 질의 속도가 느리다.

 

인덱스

1. 로컬 보조 인덱스 (Local Secondary Index)

테이블에 파티션 키와 정렬 키를 설정하면, 해당 키들로 인덱싱도 가능하다. 이 기본키들로 생성된 인덱스를 로컬 보조 인덱스(LSI)라고 한다.

 

2. 글로벌 보조 인덱스 (Global Secondary Index)

파티션 키, 정렬 키 외에도 다른 필드로 필터를 해야 한다면, 글로벌 보조 인덱스(GSI)로 지정할 수 있다. People 테이블에서 FirstName이 같은 사람들을 쿼리하고 싶다면 FirstName로 인덱스를 추가할 수 있다. GSI는 테이블 등록 시점에 생성할 수도 있고 이미 생성된 테이블에 추가할 수도 있다. 다만, 데이터 양에 영향을 받기 때문에 인덱스 생성 속도가 느려질 수 있다.

 

읽기 단위, 쓰기 단위

읽기 단위

읽기 단위가 1이면 4KB 용량에 대해 초당 1회의 강력한 일관성 읽기 또는 초당 2회의 최종 읽관성 읽기를 나타낸다. 만약 읽기 단위가 10인 테이블을 생성한다면, 이 테이블은 4KB 항목에 대해 초당 10개의 row를 읽을 수 있다. 만약 4KB보다 큰 용량의 row를 읽으면 읽기 단위 2를 사용한다.

 

쓰기 단위

쓰기 단위가 1이면 1KB 용량에 초당 1회 쓰기를 나타낸다. 만약 쓰기 단위가 10인 테이블을 생성한다면, 이 테이블은 초당 10 회 row를 쓸 수 있다. row 하나씩 쓰기 때문에, row 별 용량에 따라 쓰기 단위를 사용한다.