Chapter 10. NoSQL : DynamoDB

- NoSQL DB는 4가지 종류가 있다 : 도큐먼트, 키-값 저장소, 그래프, 컬럼 (https://namu.wiki/w/NoSQL#s-5)

- DynamoDB는 키-값 저장소 데이터베이스다.


10.1 DynamoDB 운영하기

- DynamoDB를 사용하면 설치, 업데이트, 서버 스토리지, 백업에 대해 걱정할 필요가 없다.

  . 다운로드할 수 있는 SW가 아니라 서비스로서의 데이터베이스(DaaS) = 설치 할 수 없다.

  . AWS가 운영하는 일련의 서버에서 실행된다.

  . 데이터를 여러 서버와 여러 데이터센터에 복제한다. 백업은 DynamoDB가 책임진다.

- DynamoDB 비용 : https://aws.amazon.com/ko/dynamodb/pricing/

  . 요금 개요에는 GB당 시간당 요금, 쓰기 용량 유닛, 읽기 용량 유닛이 있다.

- RDS와의 비교 (수평적 증가 vs 수직적 증가)

웹 2.0 환경과 빅데이터가 등장하면서 RDBMS는 난관에 부딪히게 되었는데, 바로 ‘데이터를 처리하는 데 필요한 비용의 증가’때문이다. 데이터와 트래픽의 양이 기하급수적으로 증가함에 따라 한 대에서 실행되도록 설계된 관계형 데이터베이스를 사용하는 것은 하드웨어적으로 큰 비용이 들게 되었다. 장비의 성능이 좋을수록, 성능을 향상시키는 데(Scale-up : 수직적 확장) 비용이 기하급수적으로 증가하기 때문이다.

NoSQL은 데이터의 일관성을 약간 포기한 대신 여러 대의 컴퓨터에 데이터를 분산하여 저장하는 것(Scale-out : 수평적 확장)을 목표로 등장하였다. NoSQL의 등장으로 작고 값싼 장비 여러 대로 대량의 데이터와 컴퓨팅 부하를 처리하는 것이 가능하게 되었다.  (나무위키 왈)

  . 처리하는 장비의 성능을 키우는 수직적 확장(Scale-up)과 처리하는 장비의 수를 늘리는 수평적 확장(Scale-out)


10.2 개발자를 위한 DynamoDB

- 테이블 : 아이템의 집합을 구성

- 아이템 : 속성의 모음

- 속성 : 이름-값 쌍으로 이루어짐

  . 속성값은 스칼라(숫자, 문자열, 바이너리, 불리언), 다중값(숫자 집합, 문자 집합, 바이너리 집합) 또는 JSON 문서(객체, 배열)이 될 수 있

- 같은 테이블의 각 아이템은 서로 다른 속성을 가져도 상관없다!! 스키마로 강제하지 않는다!

- 테이블 이름과 키 스키마는 변경 할 수 있음 (여기서 키 스키마는 기본 키ㅋ)


- 기본 키 : 테이블 내에서 고유하고 각 아이템을 식별. 아이템을 찾으려면 필요함.

  . 해시키 단독으로 구성되거나, 해시키와 범위키의 쌍으로 구성된다.

    (해시키는 파티션(partition key)키, 범위키는 정렬키(range)로 바뀌었대)

  . 해시키는 그냥 고유한 기본키 ㅋ 아이템의 속성 하나를 이용해서 해시 인덱스 생성하는 것! ex : { id : jieun }

  . 해시키 + 범위키 : 데이터 검색할 때 범위 부분을 추가해서 조회할 수 있는 것! 범위 부분은 해시 내에서 정렬됨.

     ex : id = jieun, timestamp = 20180907, jieun 이라는 아이디로 20180907에 발생한 데이터를 검색하라


10.3 할일 앱 프로그래밍하기

- nodejs 앱

- 기능 :

  . 사용자 생성 및 삭제

  . 태스크 생성 및 삭제

  . 태스트 완료 표시

  . 태스크 목록 조회 (다양한 필터지원)

  . 태스크를 할당할 수 있는 카테고리

명령어 :

node index.js user-add : 새로운 사용자 추가

                  user-rm : 사용자 제거

                  user-ls : 사용자 조회

                  user : 특정 사용자 상세 조회

                  task-add : 새로운 태스크 추가

                  task-rm : 태스크 삭제

                  task-ls : 태스크 목록 조회

                  task-la : 카테고리별 태스크 목록 조회

                  task-done : 태스크 완료 표시

- 관계형 DB는 SQL로 데이터 생성/조회/갱신/삭제를 하지만

- DynamoDB는 HTTP REST API를 호출하는 SDK로 접근한다!


- 테이블 생성하기 : 정적 스키마를 필요로하진 않지만, 기본키로 사용될 속성은 정의해야 한다!

- 해시키로 사용자 테이블 만들기

aws dynamodb create-table --table-name todo-user --attribute-definitions AttributeName=uid,AttributeType=S --key-schema AttributeName=uid,KeyType=HASH --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5

- 테이블 상태 확인

-aws dynamodb describe-table --table-name todo-user

- 복합 기본 키로 태스크 테이블 만들기

  . 태스크는 항상 사용자로부터 수행되는거니까, 태스크 관련 명령어는 항상 사용자 ID를 포함해야함!

  . 모든 태스크 관련 기능에는 사용자 ID가 필요하니, uid를 전체 키의 해시 부분으로 선택하고, 태스크 ID(tid, 생성시 타임스탬프)를 해당 키의 범위 부분으로 선택한다.

aws dynamodb create-table --table-name todo-task --attribute-definitions AttributeName=uid,AttributeType=S AttributeName=tid,AttributeType=N --key-schema AttributeName=uid,KeyType=HASH AttributeName=tid,KeyType=RANGE --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5

- Node.js todo 앱 실행하기 (https://github.com/AWSinAction/code/tree/master/chapter10)

  . node.js는 모두 깔려있겠지?

  . 종속성 설치하기 : npm install

  . 사용자 추가 : node index.js user-add jenny hello@myemail.com 01010041004    ----->  user added with uid jenny

  . 태스크 추가 : node index.js task-add jenny "aws study" aws --dueat=20180909

  . 태스크 추가 왜 안돼??   


- 데이터 검색하기

  . 키로 데이터 얻기 : DynamoDB SDK의 getItem 함수 사용

  . 키와 필터로 질의하기 : DynamoDB SDK에 query 라는 함수가 있고, 아이템의 집합을 찾아준다.

     > 인덱스 없이 작동해서 모든 아이템을 검사함으로써 필터링이 느려질 수 있음.

     > query 함수에서 기본키 또는 복합 기본키로 질의할 때에는 KeyConditionExpression

     > query 함수에서는 필터링으로 질의할 때에는 FilterExpression

  . 보조 인덱스 사용하기 : category 속성을 보조 인덱스로 추가하기

     > 원본 테이블을 복사해서 만드는 읽기 전용 테이블이라고 생각해도 됨

     > 인덱스는 스토리지을 요구하고, 원본 테이블과 같은 비용이 발생함

aws dynamodb update-table --table-name todo-task --attribute-definitions AttributeName=uid,AttributeType=S AttributeName=tid,AttributeType=N AttributeName=category,AttributeType=S --global-secondary-index-updates '[{"Create": {"IndexName": "category-index", "KeySchema": [{"AttributeName": "category", "KeyType": "HASH"}, {"AttributeName": "tid", "KeyType": "RANGE"}], "Projection": {"ProjectionType": "ALL"}, "ProvisionedThroughput": {"ReadCapacityUnits": 5, "WriteCapacityUnits": 5}}}]'

이건 또 왜 안되는거야??

  . 모든 아이템 뒤지기 : scan 함수 사용

    > 반환할 아이템의 최대 수 지정

    > 샘플 예제에서 next가 의미하는게 뭔지 모르겠음


- 최종 일관된 데이터 검색하기

  . DynamoDB에서 원자 단위는 아이템 하나다. 최종 일관성을 제공한다.

  . 여러 개의 서버에 아이템이 있을 수 있고, 한 아이템이 변경되었으면 모든 서버에 전파될 때까지는 변경된 값이 아니라 이전 값을 반환함

  . 최종 일관된 읽기말고 엄격하게 일관된 읽기로 동작하려면 "ConsistentRead":true 추가하면 됨

  . 그러나 최종 일관된 읽기보다 느리고 읽기 용량도 더 소비함


- 아이템 제거 : 기본키로 지정해서 제거 가능. deleteItem API 사용하면 됨


- 데이터 변경 : UpdateExpression 옵션이 있고, updateIdem API 제공

  . 예 : SET attr1 = :attr1val (덮어쓰기), REMOVE attr1 (속성제거)


- 용량 늘리기

  . 테이블이나 전역 보조 인덱스를 생성할 때는 반드시 처리량을 프로비저닝해야 한다.

  . 읽기 용량과 쓰기 용량으로 구분됨. ReadCapacityUnits, WriteCapacityUnits

  . 용량의 단위는 어떻게 지정되는지? 아래 명령어.. DynamoDB에서 사용한 용량 단위 반환

aws dynamodb get-item --table-name todo-user --key '{"uid": {"S": "michael"}}' --return-consumed-capacity TOTAL --query "ConsumedCapacity"   --> getItem은 0.5 용량 단위를 요구한다.

aws dynamodb get-item --table-name todo-user --key '{"uid": {"S": "michael"}}' --consistent-trad --return-consumed-capacity TOTAL --query "ConsumedCapacity"   --> 두배의 용량 단위를 요구한다.



'개발' 카테고리의 다른 글

0713 kernel  (1) 2019.07.13
컴파일러  (0) 2019.01.08
[AWS] 스케일업, 스케일다운: 오토스케일링과 클라우드와치  (0) 2018.10.13
aws 네트워크  (0) 2018.08.05
aws 시스템보안  (0) 2018.08.02

+ Recent posts