(응용) AWS - Advanced DynamoDB

AWS에 대해 알아봅니다.

정민호정민호

1. Provisioned Throughput

  • Capacity Unit 단위로 계산

  • 쓰기 (Write Capacity Unit) = WCU

    • 1 Write Capacity Unit = 1초에 1KB 데이터 쓰기

  • 읽기 (Read Capacity Unit) = RCU

    • 1 Read Capacity Unit = 1초에 4 KB SC(Strongly Consistent) 데이터 읽기

    • 1 Read Capacity Unit = 1초에 2 * 4 KB EC(Eventually Consistent) 데이터 읽기 (디폴트)

  • SC(Strongly Consistent)

    • 가장 최신의 데이터를 불러올 수 있으나 EC에 비해 지연 발생

  • EC(Eventually Consistent)

    • 가장 최신의 데이터를 반환하지 않을 수 있음. 즉 실시간으로 업데이트되지 않음

    • 하지만 계속 요청을 보내다보면 최신의 데이터를 받아 볼 수 있음

고객아이디 주문번호 주문날짜

29358235

20003

3/24/2021

73649172

20009

3/29/2021

57497462

20001

3/18/2021

12093221

20006

3/27/2021

  • 5 WCU, 5 RCU

    • 5 * (2 * 4 KB EC 데이터) → 초당 40 KB 데이터 읽음

    • 5 * (4 KB SC 데이터) → 초당 20 KB 데이터 읽음

    • 5 * (1 KB 데이터) → 초당 5 KB 데이터 씀

  • 데이터 크기 > Capacity Unit

    • 추가 비용에 대응하기위해 APP에 따라 RCU / WCU 설정

1.1. RCU 샘플 문제1

  • RCU의 크기는 얼마로 잡아야 할까요?

    • 초당 80개의 데이터를 읽어와야함

    • Strongly Consistent 데이터

    • 1개의 데이터 크기 = 3 KB

1.1.1. RCU 샘플 문제1 해결방안

  • 얼마나 많은 4 KB RCU가 필요한지 구함

    • 3 KB / 4 KB = 0.75

  • 정수로 떨어지지 않으면 반올림

    • 0.75 → 1

  • 초당 얼마나 많은 데이터를 읽어오는지 계산

    • 1 * 80 = 80 RCU

1.2. RCU 샘플 문제2

  • RCU의 크기는 얼마로 잡아야 할까요?

    • 초당 80개의 데이터를 읽어와야함

    • Eventually Consistent 데이터

    • 1개의 데이터 크기 = 3 KB

1.2.1. RCU 샘플 문제2 해결방안

  • 얼마나 많은 4 KB RCU가 필요한지 구함

    • 3 KB / 4 KB = 0.75

  • 정수로 떨어지지 않으면 반올림

    • 0.75 → 1

  • 초당 얼마나 많은 데이터를 읽어오는지 계산

    • 1 * 80 = 80 RCU

  • 위에서 구한 RCU를 2로 나눠줌

    • 80 RCU / 2 = 40 RCU

1.3. WCU 샘플 문제

  • WCU의 크기는 얼마로 잡아야 할까요?

    • 초당 100개의 데이터를 써야함

    • 1개의 데이터 크기 = 512 BYTES

1.3.1. WCU 샘플 문제 해결방안

  • 얼마나 많은 1 KB WCU가 필요한지 구함

    • 512 BYTES / 1KB (1024 BYTES) = 0.5

  • 정수로 떨어지지 않으면 반올림

    • 0.5 → 1

  • 초당 얼마나 많은 데이터를 읽어오는지 계산

    • 1 * 100 = 80 WCU

2. Access Control

  • AWS IAM

    • Users

    • IAM 역할

    • Groups

      • 역할과 그룹에 따라 유저들은 전혀 다른 권한을 가질 수 있음

        • 테이블 생성, 데이터 삽입 & 수정 & 삭제 등

    • 테이블 별로 유저 권한 필터링 → IAM Conditions

      • IAM Conditions : 파티션키 == 유저 아이디 일때만 데이터 읽기 권한 부여

“Sid” : “AllowAccessToOnlyItemsMatchingUserID”,
    “Effect” : “Allow”,
    “Action” : [
                “dynamodb:GetItem”,
                “dynamodb:PutItem”,
                “dynamodb:UpdateItem”
                ],
    “Resource” : [ “arn:aws:dynamodb:ap-northeast-2:123456789012:table/HighScores” ],
    “Condition” : {
        “ForAllValues:StringEquals” : {
            “dynamodb:LeadingKeys” : [
                “${www.minho.com:user_id}”
            ],
        ....
        ...

3. TTL(Time To Live)

  • 데이터 유효기간을 설정하는것

    • 불필요하거나 일시적인 데이터(Session, Event Log) 삭제

    • 테이블 청소로 인하여 데이터 유지 비용 절감

유저아이디 세션아이디 세션생성시간 TTL 세션데이터

84724

657381

1544031271

1544038471

…​

26495

758293

1544013196

1544020396

…​

92742

782938

1544008931

1544018723

…​

  • 세션생성시간/TTL → Epoch Time / Unix Time

    • 1970년 1월 1일 오전 12시 기준, 얼마나 많은 초(seconds)가 지났는지 알려줌

    • (TTL - 세션생성시간) 이 0보다 작을 시 삭제 또는 필터

4. Provisioned Throughput Exceeded & Exponential Backoff

4.1. Provisioned Throughput Exceeded

예외 Exception의 한 종류

  • PTE Exception

    • 너무 많은 읽기/쓰기 요청 발생시 일어남

    • 수용할 수 있는 최대치를 넘겼을 때

  • AWS SDK

    • 요청을 성공적으로 처리할 때까지 계속 전송

      • 그렇지 않다면 DynamoDB 설정에 들어가서 요청 프리퀀시를 조정

      • 동시에 들어오는 요청의 갯수를 줄여 DynamoDB에 요청을 보내는데 있어 부하를 줄이는 방법도 있음

  • No AWS SDK

    • Exponential Backoff

  • 많은 네트워크 요청이 발생함에 따라 서버에 지연이 발생할 수 있고 나아가 요청이 실패할 수 있음

    • 예) 수강신청 등

      • Swich, DNS, ELB 고통받음..

4.2. Exponential Backoff

요청이 실패할 때마다 기다리는 시간을 늘려주는 것

  • 요청 → 요청실패 → 50ms → 요청 재시도 → 요청실패 → 100ms → 요청 재시도 → 성공

    • 요청이 실패할 수록 대기시간을 늘려줌으로써 서버부하 및 병목현상을 줄여줌