DynamoDB 의 Capacity (읽기/쓰기 용량 모드)에 대해 정리했습니다.

2022.01.14

안녕하세요, 임채정입니다.
DynamoDB는 AWS의 대표적인 데이터베이스 서비스입니다.
DynamoDB는 NoSQL 데이터베이스인데 저는 SQL 데이터베이스만 사용했었기 때문에 익숙하지 않아서 이번에 공부를 해보려고 합니다.
그래서 오늘은 DynamoDB 의 Capacity (읽기/쓰기 용량 모드)에 대해 정리했습니다.

아젠다

  1. Capacity modes (용량 모드) 란?
  2. WCU (쓰기 용량 모드)
  3. RCU (읽기 용량 모드)
  4. 파티션의 정의
  5. 예시

1. Capacity modes (용량 모드) 란?

온디맨드 모드

  • 워크로드에 따라 자동으로 읽기/쓰기 확장/축소
  • 용량 계획 불필요
  • 사용량에 대한 비용 지불
    • 무제한 WCU & RCU으로 프로비저닝된 용량보다 2.5배 더 비싸다 (신중하게 사용해야 한다)
    • RRU 및 WRU와 관련하여 사용하는 읽기/쓰기에는 요금이 부과
      • Read Request Units (RRU) - 읽기의 처리량 (RCU와 동일)
      • Write Request Units (WRU) - 쓰기의 처리량 (WCU와 동일)
  • 사용 사례
    • 알 수 없는 워크로드
    • 예측할 수 없는 애플리케이션 트래픽
    • 등등..

프로비저닝 모드 (기본값)

  • 초당 읽기/쓰기 수를 지정
  • 사전에 용량을 계획
  • 프로비저닝된 읽기 및 쓰기 용량 단위 비용 지불
  • 테이블에 프로비저닝된 읽기 및 쓰기 용량 단위가 있어야 한다
    • Read Capacity Units (RCU) - 읽기의 처리량
    • Write Capacity Units (WCU) - 쓰기의 처리량
  • 수요에 맞게 처리량의 자동 확장을 설정하는 옵션

24시간마다 한 번씩 다른 모드로 전환할 수 있습니다.

예시

DynamoDB의 만들어진 테이블의 [추가 설정] 탭에서 읽기/쓰기 용량이 어떻게 되어 있는지 확인할 수 있습니다.

편집을 하면 온디맨드 모드프로비저닝 모드를 변경할 수도 있습니다.

2. WCU (쓰기 용량 모드)

  • 최대 1KB 항목의 쓰기 용량 단위 하나는 초당 쓰기 하나를 나타낸다
  • 항목이 1KB보다 크면 더 많은 WCU가 사용된다 (1KB 씩 up)

ex 1)

항목 크기가 2KB인 초당 12개의 항목을 작성
12 * (2KB/1KB) = 24WCUs

ex 2)

항목 크기가 4.5KB인 초당 10개의 항목을 작성
10 * (5KB/1KB) = 50WCUs

ex 3)

항목 크기가 2KB인 분당 120개의 항목을 작성
(120/60) * (2KB/1KB) = 4WCUs

3. RCU (읽기 용량 모드)

  • 읽기 용량 단위 1개에 대해
    • 4KB 크기의 항목에 대해서 초당 강력한 일관된 읽기 1개
    • 4KB 크기의 항목에 대해서 초당 최종적 일관된 읽기 2개
  • 항목이 4KB보다 크면 RCU가 더 많이 소비됩니다. (4KB 씩 up)

최종적 일관된 읽기 (Eventually Consistent Read)

  • default 설정
  • DynamoDB 테이블에서 데이터를 읽을 때, 응답에 최근 완료된 쓰기 작업의 결과가 반영되지 않을 수 있고 부실 데이터가 일부 포함될 수 있음
  • 쓰기 작업을 하고 잠시 후 읽기 요청을 반복하면 응답이 최신 데이터를 반환합니다.
  • 예시) 위의 사진에서 쓰기를 진행하고 나서 server2와 3이 같은 내용으로 되기 전에 읽어버리면 잘못된 데이터를 읽을 수 있음

강력한 일관된 읽기 (Strongly Consistent Read)

  • DynamoDB는 성공한 모든 이전 쓰기 작업의 업데이트가 반영된 최신 데이터를 포함하는 응답을 반환
  • 단점
    • 네트워크 지연 또는 중단이 발생한 경우에 사용 어려울 수 있고 DynamoDB는 서버 오류(HTTP 500) 를 반환할 수 있음
    • 최종적 일관된 읽기보다 지연 시간이 더 길다
    • 글로벌 보조 인덱스에서는 지원되지 않음
    • 최종적 일관된 읽기보다 처리 용량을 더 많이 사용 (약 2배)
  • 예시) 위의 사진에서 쓰기를 하자마자 바로 읽어서 최신 데이터를 가져올 수 있음

ex 1)

항목 크기가 4KB인 12개의 강력한 일관된 읽기
We need 12 * (4KB/4KB) = 12RCUs

ex 2)

항목 크기가 8KB인 16개의 최종적 일관된 읽기
We need (16/2) * (8KB/4KB) = 16RCUs

ex 3)

항목 크기가 6KB인 12개의 강력한 일관된 읽기
We need 12 * (8KB/4KB) = 24RCUs

4. 파티션의 정의

  • 데이터는 파티션에 저장
  • 파티션 키는 해시 알고리즘을 통해 파티션으로 이동하는 파티션을 파악
  • 파티션 수를 계산하는 방법
    • 파티션 수 (용량 기준) = (RCUs Total/3000) + (WCUs Total/1000)
    • 파티션 단위 (크기별) = (총 크기/10GB)
    • 파티션의 경우 = ceil(max(파티션 수 (용량 기준) , 파티션 단위 (크기별) ))
  • WCU와 RCU는 파티션 전체에 고르게 분포되어 있습니다.
  • 예시)
    • 위의 사진에서 파티션키 ID_13 이 DynanoDB 내부의 해쉬 함수를 통해서 Partition1 으로 이동
    • 위의 사진에서 파티션키 ID_45 이 DynanoDB 내부의 해쉬 함수를 통해서 Partition2 으로 이동

5. 예시

프로비저닝 모드의 설정을 할 때 용량 계산기를 통해 크기나 초 등을 설정해서 드는 돈을 확인할 수 있습니다.

또한 테이블 읽기/쓰기 용량을 끄거나

켜서 최소, 최대 단위를 설정할 수도 있습니다.

지금 설정하고 있는 DynamoDB 테이블은 테스트를 위해 만들었기 때문에 간단하게 설정해주고 저장해주도록 하겠습니다.

편집이 완료되면 사진과 같이 설정한 용량에 대해 확인할 수 있습니다.

지금은 쓰기, 읽기 활동이 없기 때문에 쓰기, 읽기 용량이 1로 자동 설정되었습니다. 그에 대한 자동 크기 조정 활동도 바로 밑에서 확인할 수 있습니다.