DynamoDB: on-demand 모드의 오토 스케일링
발생일: 2021.04.21
키워드: 다이나모디비, 온디맨드, 오토 스케일링, auto scaling
문제:
다이나모디비를 온디맨드 모드로 쓰고 있다.
배치 작업으로 평소보다 많은 데이터를 PUT 했는데, 아래와 같은 에러가 나온다.
Throughput exceeds the current capacity for one or more global secondary indexes. DynamoDB is automatically scaling your index so please try again shortly.
온디맨드 모드는 스케일 제한이 없는 걸로 알았는데 왜 그런걸까?
해결책:
테이블 생성 후, 이전 트래픽 대비 많은 데이터를 넣어서 발생한 문제였다.
요약 먼저:
온디맨드도 내부적으론 오토스케일링으로 동작하는데, 스케일링 기준을 초과한 요청을 보내서 쓰로틀이 발생한 것이었다.
나중엔 스케일링 기준(이전 트래픽 피크치의 2배)를 임의로 필요한만큼 높여두면 쓰로틀링 이슈는 크게 걱정하지 않아도 되겠다.
온디맨드의 스케일링:
- 온디맨드는 트래픽 볼륨에 따라 자동으로 확장됨 (Auto Scaling)
- 테이블은 이전 최대 트래픽의 최대 2배 용량을 즉시 수용할 수 있음
- 예: 이전 트래픽의 최대값이 초당 5만 읽기였으면, 초당 10만 읽기까지 즉시 수용 가능
- 트래픽이 2배보다 더 커지는 경우 오토 스케일링 되면서 더 많은 용량을 할당함
- 단, 30분 이내에 이전 피크의 2배 이상을 초과할 경우 쓰로틀링이 걸릴 수 있음
- 테이블의 최대 피크치는 계속 지속됨
- 온디맨드 테이블의 최초 설정은
- 기존 테이블을 전환한 경우, 기존 테이블의 피크 트래픽의 2배
- 새로 생성한 경우: 최대 초당 4000 쓰기, 12000읽기
팁:
- 온디맨드 테이블의 최대 피크는 히스토리는 지속되므로 트래픽을 발생시켜서 pre-wraming 하는 요령도 있음
- 최대 2배 이상의 트래픽이 30분 이내에 오지 않는 경우라면 신경쓰지 않아도 될 듯
현재 상황:
- 현재 테이블은 기존 테이블을 온디맨드로 변경한 거라서 기본 설정인 초당 4000 쓰기보다 낮았음.
- 메트릭스를 보니 아마도 기존의 최대치는 초당 500 정도였는 듯.
- 테스트할 때 기존 피크의 2배 이상인 초당 1200 쓰기 정도를 호출해서 쓰로틀이 걸린 것이었음
결론:
- 기본 설정도 초당 12000 읽기 정도라 초반에는 큰 문제는 없을 듯
- 나중에 더 많은 트래픽이 예상될 땐, pre-warming 해둬서 최대 트래픽을 올려두면 문제 없을 듯
참고:
- https://theburningmonk.com/2019/03/understanding-the-scaling-behaviour-of-dynamodb-ondemand-tables/
- 온디맨드 읽기/용량 모드: https://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/HowItWorks.ReadWriteCapacityMode.html#HowItWorks.InitialThroughput