dynamo를 사용하기 위해서 꼭 알고있어야 하는 값들이 있다.
WCU, RCU, partition의 max size.
AWS immersion day session 강의를 들으면서 원래는 외우고 있었던 것들을 이해할 수 있는 시간이 되었다.

왜 nosql?의 내용도 도움이 된다.

partitioning

mysql에서는 sharding을 하지만 비슷한 목적으로 dynamodb는 partitioning을 한다.
즉 data를 partition 단위로 나눈다는 것이다.

이 partition 하나는 10GB를 저장할 수 있고, WCU는 1KB, RCU는 3KB까지 수용할 수 있다.
따라서 저장공간이 10GB가 넘거나 WCU/RCU가 넘치는 경우 partition을 다시 나누도록 한다.

dynamodb 내부구조

dynamo의 내부 architecture에 대해서 배우면 partition에 대한 제약들을 더 잘 이해할 수 있다.

dynamo architecture

위 그림처럼

  1. dynamodb로 request가 들어오면 requestRouter 중에 한 곳으로 할당된다.
  2. requestRouter에서 storageNode로 routing을 한다.

여기서 중요한 점은 storage node는 3개의 node로 이루어져 있다는 것인데, leaderNode와 2개의 followerNode이다.

  • db write가 발생하면 leaderNode가 업데이트되고 leaderNode가 followerNode에 data를 복제한다.
  • 3개 중 2개의 node가 업데이트가 되면 node에서 ack를 보낸다.

내부구조 보고 제약사항 이해하기

위 개념을 이해하면 제약들을 이해하기 쉽다.

하나의 node는 1KB의 CU만을 갖는다.

  • read는 3개의 node에서 이뤄질 수 있으므로 RCU는 \(1KB * 3 = 3KB\).
  • write는 leaderNode에서만 이뤄지므로 WCU는 1KB.

각 node는 10GB의 저장공간을 가지므로 하나의 partition의 max size는 10GB.

eventually consistancy에서 read를 할 경우

  • read 요청이 \(1/3\) 확률로 각 node로 가게 된다.
  • 위에서 말했듯 3개 중 2개의 node가 업데이트 되면 ack를 보내기 때문에 나머지 하나는 업데이트 되지 않았을 수 있다.
  • \(1/3\) 확률 & 1/3의 노드가 아직 업데이트 되기 이전에, read 요청이 들어온 경우 old data를 가져갈 수 있다.
  • 물론 대부분의 case는 그 전에 업데이트 되는 편이다.

strong consistance는 read를 할 경우 항상 leader node로 간다.

partitioning 참고사항

10GB가 되지 않는 경우 하나의 partition은 여러 개의 partition key를 가질 수 있다.
여러 개의 partition key를 가진 data set(partition)이 커질 경우 partition key를 기반으로 두 개의 partition으로 분리된다.
하나의 partition key에 대한 data set이 커지는 경우에도 역시 partition key를 기반으로 partition이 분리된다. dynamodb가 내부적으로 hash된 값을 key로 사용하기 때문에 동일한 partition key에 대해 데이터가 커지는 경우도 커버할 수 있다.

reference

  • AWS immersion day session 강의