Amazon S3 버킷 성능 끌어올리기

이글은 “How do I improve the performance of my S3 bucket?” 의 내용을 번역한 것입니다. 오역이 있을 수 있습니다.

이슈

Amazon S3 에 작업부하(workload)가 굉장히 높을때, S3 성능은 작업부하에 맞춰서 확장되지 않는다. 이런 상황이 발생하면 때때로 HTTP 500, 503 에러를 받게된다. 다음과 같은 작업부하에서 어떻게 Amazon S3 버킷의 성능을 최적화 할 수 있을까?

  1. 100 request/sec 넘는 혼합된 요청 타입(GET, PUT, DELETE 혹은 GET bucket)
  2. 300 request/sec 넘는 GET 요청.

개관

Amazon S3 는 각 AWS 리전에서 Object Key 이름의 인덱스(index) 를 관리한다. Object Key 들은 인덱스에서 여러 파티션에 걸쳐서  UTF-8 바이너리 순서대로 저장된다. Key 이름은 Key 가 저장되는 파티션을 결정한다. 순차적인 접두사(sequential prefix)를 사용하는것은, timestamp 나 알파벳 순서와 같이, Amazon S3 가 아주 많은 Key들에 대해 특정 파티션을 지정하게될 것이고 이는 잠재적으로 막대한 파티션의 I/O 용량을 쓸 가능성이 높아진다.

해결책

작업부하가 혼합된 요청 타입일때, Key 이름에 접두사처럼 해쉬 스트링을 추가함으로써 키 이름에 랜덤화를 도입하라. Key 이름에 랜덤화 도입으로 인해서, I/O 부하는 여러 인덱스 파티션에 걸쳐 분산되어질 것이다. 예를들어, 문자 순서의 MD5 해쉬를 계산할 수 있으며, Key 이름에 해쉬로부터 3 혹은 4개 문자를 Key 에 접두사처럼 더하는 계획을 세울 수 있다. 다음의 예제는 16진 해쉬의 4문자를 접두사 더한 Key 이름들을 보여준다.

4문자 해쉬 접두사가 없으면, S3는 각 Object 이름이 examplebucket/2013-26-05-15-00-0  시작되는 1이나 2 인덱스 파티션에 모든 부하가 분산될 것이고 인덱스에 모든 Object 는 알파벳-숫자 순서로 저장되어진다. 4문자 해쉬 접두사는 로드를 여러 인덱스 파티션에 걸쳐 분산시켜준다.

작업부하가 대부분 GET 요청을 보내는 거라면, Key 이름에 랜덤화를 추가할 수 있다. 게다가, 여러분은 높은 데이터 전송율과 낮은 레이턴시를 필요로하는 사용자에게 컨텐츠를 분산하기 위해 CloudFront 와 Amazon S3 를 통합해 운영할 수 있다.

Object Key 이름에 랜덤화 도입과 Amazon CloudFront 와 Amazon S3 의 통합 운영에 대한 더 많은 정보는 Request Rate and Performace Considerations 를 봐라.

Post a comment

You may use the following HTML:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">