Loading presentation...

Present Remotely

Send the link below via email or IM

Copy

Present to your audience

Start remote presentation

  • Invited audience members will follow you as you navigate and present
  • People invited to a presentation do not need a Prezi account
  • This link expires 10 minutes after you close the presentation
  • A maximum of 30 users can follow your presentation
  • Learn more about this feature in our knowledge base article

Do you really want to delete this prezi?

Neither you, nor the coeditors you shared it with will be able to recover it again.

DeleteCancel

Make your likes visible on Facebook?

Connect your Facebook account to Prezi and let your likes appear on your timeline.
You can change this under Settings & Account at any time.

No, thanks

DynamoDB

No description
by

fly buri

on 22 March 2014

Comments (0)

Please log in to add your comment.

Report abuse

Transcript of DynamoDB

Background photo by t.shigesa
Amazon DynamoDB
Databases
Good to know...
Thank you!
버리야 날자.
www.flyburi.com

Relational Databases
NoSQL
데이터의 일관성 유지
데이터 무결성 유지
(Joins, transactions,
query optimisation)
서비스 하이라이트
Data Model
처리량 프로비저닝

테이블 크기가 커지거나 프로비저닝된 처리량이 증가되면 DynamoDB가 자동으로 데이터를 분할 또는 재분할하고 추가적인 서버 용량을 프로비저닝한다.

Scale at any time(No downtime)

Pay for throughput
액세스 모델 및 API 개요
DynamoDB example
접속로그정보를 기록
DynamoDB
테이블(Table)

항목(Item)

속성(Attribute)
테이블
항목
속성
"ImageID" = 1
"Title" = "flower"
"Tags" = "flower", "jasmine", "white"
"Ratings" = 3, 4, 2
"이름" : "값"
ProductCatalog ( ImageID, ... )
Primary key
Primary key + hash key
Amazon DynamoDB
NoSQL Database Service
Horizontal Scaling
Data in SSD
NoSQL은 데이터 간의 관계를 정의하지 않는다
고정되지 않은 테이블 스키마
수평적 확장성 보장(분산환경 지원)
데이터의 일관성

데이터 규모의 확대
저장할 데이터가 많아지면서 읽고/쓰기에 있어서 RDB가 제약 요소가 되었다.
RDB의 수평적 확장성 한계로 새로운 해결책이 필요했다.

웹 서비스의 구조 변화
저장할 데이터의 형태가 계속 변화한다.
사용자의 데이터 요구가 일관적이지 않고 다양하다.
디스크 기반의 수평 확장이 뛰어난 데이터 저장소
RDB의 대안
RDB Cluster

Memory cache

NoSQL

What is Amazon DynamoDB?
Data
API
CreateTable – 테이블을 만들고 데이터 액세스에 사용되는 기본 색인을 지정.

UpdateTable – 주어진 테이블의 프로비저닝된
처리량 값을 업데이트.

DeleteTable – 테이블을 삭제.

DescribeTable – 테이블 크기, 상태, 색인 정보를 반환.
API
PutItem – 새 항목을 만들거나 이전 항목을 새 항목으로 바꿈.

UpdateItem – 기존 항목의 속성을 편집.

DeleteItem – 기본 키로 테이블의 단일 항목을 삭제.

GetItem – 기본 키와 일치하는 항목에 대한 속성 세트를 반환.
기본적으로 Eventually Consistent Read를 제공.
One API call, multiple items
BatchGetItem – BatchGetItem 작업은 기본 키를 사용하여
여러 테이블에서 다수의 항목에 대한 속성을 반환.
단일 응답의 크기는 1MB로 제한되고 최대 100개 항목이 반환.


BatchWriteItem – 단일 요청으로 여러 테이블에서 여러 항목을
삽입, 교체 및 삭제하지만 단일 트랜잭션으로 처리되지는 않음.
Put 또는 Delete에 대해 최대 25개 항목의 배치를 지원
총 요청의 최대 크기는 1MB
Query & Scan API
Query : 기본키의 값만 찾음.
한 Query 수행당 최대 1MB까지 기본에 매칭하는 데이터만 리턴.
데이터를 가져오는 가장 효율적인 방법


Scan : 테이블에 대한 전체 검색을 수행.
하나 이상의 속성에 대해 필터를 지정함으로써 반환되는
항목을 제한가능. 따라서 이 API는 테이블의 기본 키가 아닌 속성을 테이블에서 임시 쿼리를 하는 데 사용할 수 있다.

Scan API 요청에 대해 검색된 항목의 총 크기가 1MB 한도를
초과하면 해당 요청이 종료되고
가져온 결과가 LastEvaluatedKey와 함께 반환됨.
낮고 예측가능한 응답시간
트랜잭션
무결성
복잡한 쿼리지원
CAP 이론
분산 컴퓨팅시스템이 보장해야 할 3가지 특징
가용성(Availability)
일관성
(Consistency)
분산가능
(Partition Tolerance)
Pick Two
모든 사용자는 항상 read/write 할 수 있다.
몇몇 노드 장애시에도 다른 노드들이 작동해야한다.
모든 사용자는 항상 동시에 같은 데이터를 조회해야 한다.
물리적 네트워크 분할에도 (메시지 손실) 시스템은 잘 작동해야 한다.
RDB
Dynamo
Cassandra
SimpleDB
CouchDB
Hbase MongoDB MemcacheDB Redis
MySQL, Oracle, MSSQL
Performance
Scale
Predictable
Clustering
여러 대의 컴퓨터 시스템을 서로 연결되어 여러대의 컴퓨터가 마치 하나의 컴퓨터처럼 수행된다.

여러대로 구성된 각각의 데이터베이스 서버에 똑같은 자료들을 계속해서 동기화를 시킴으로서 무결성을 보장해주고,
사용자의 요청이 골고루 분산되어 효율적인 작업이
이루어질 수있도록 한다.
Sharding
데이터를 파티셔닝

데이터베이스 자체를 분할

미국 고객은 샤드 A
유럽 고객은 샤드 B
아시아 고객은 샤드C
Relational Databases
Caching
복잡하다
시간과 비용이 소요
장애관리
Fault management
No table size limits. Unlimited storage.
Disk-only writes. Flexible.

수평적 확장 -수백대의 서버에 단일 테이블 확장 가능

일관성 - 버전관리. 항상 최신값을 확인

모니터링 - Amazon CloudWatch를 통하여 테이블에 대한 요청 처리량과 지연 시간 모니터링 가능

처리량 프로비저닝


you can perform using Amazon DynamoDB operations such as create, update, and delete tables, and create, read, update, and delete items.


1 unit of Write Capacity = 1 write per second for items of up to 1KB in size
1 unit of Read Capacity = 1 read per second of items of up to 1KB in size
읽기 일관성
높은 가용성 및 데이터 지속성을 위해
성공적인 쓰기 또는 데이터 항목의 업데이트가
동일 항목에 대한 다음 읽기 작업에 반영되는 방법과 시기
일관성 모델
Eventually Consistent Read(기본) :
최종 일관성 옵션은 읽기 처리량을 최대화한다.
최근 완료한 쓰기 결과를 반영하지 못할 수 있다.
데이터의 모든 사본에 대한 일관성 작업은 보통 1초 내에 이뤄집니다. 즉, 짧은 시간 간격으로 읽기를 반복함으로써 업데이트된 데이터를 반환한다.

Strongly Consistent Read :
해당 읽기 전에 성공적인 응답을 수신한 모든 쓰기를 반영한 결과를 반환한다.
제약조건에 맞지 않는 데이터는 아예 입력되지 않도록 방지 가능
데이터의 불일치성을 미리 방지하여
데이터를 정확하게 만듬
데이터 중복의 최소화
복잡한 쿼리 지원
Amazon에서 제공하는 인프라환경에서 NoSQL 사용가능

복합키 지원

지속적인 업데이트

Hadoop integration M/R, Hive

모니터링이 가능

Elastic MapReduce를 통합 백업&복구 가능
AWS에서만 서비스가 가능

하나의 속성(item)의 크기가 64KB로 제한

한번에 Query 및 Scan이 1MB까지만 가능

쿼리의 비교 연산자가 제한적.
Pros of using DynamoDB
Cons of using DynamoDB
Low-Level API
High-Level API
Object Persistence programming techniques

You cannot create tables using the high-level API,
but you can create, read, update, and delete table items.
@DynamoDBTable(tableName = "connect_log")
public class DynamoDBConnectLog {

private String id;

private String deviceId;

private String createdDtYMD;

@DynamoDBHashKey(attributeName = "created_dt_ymd")
public String getCreatedDtYMD() {
return createdDtYMD;
}

public void setCreatedDtYMD(String createdDtYMD) {
this.createdDtYMD = createdDtYMD;
}

@DynamoDBRangeKey(attributeName = "connect_id")
public String getConnectId() {
return id;
}

public void setConnectId(String id) {
this.id = id;
}

@DynamoDBAttribute(attributeName = "device_id")
public String getDeviceId() {
return deviceId;
}

public void setDeviceId(String deviceId) {
this.deviceId = deviceId;
}

Table

public class DynamoDBManagerImpl implements DynamoDBManager {

private AmazonDynamoDBClient client;
private DynamoDBMapper mapper;
private DynamoDBMapperConfig config;

@PostConstruct
public void init(){
client = new AmazonDynamoDBClient(new BasicAWSCredentials(getAccessKey(), getSecretKey()));
config = getConfigWithTableName();
mapper = new DynamoDBMapper(client, config);
}

//저장
private void save(DynamoDBConnectLog connectLog) {

mapper.save(connectLog);
}

// hashkey와 rangekey로 Item 가져오기
private DynamoDBConnectLog loadConnectLog(Connect connect) {
String createdDtYMD = new SimpleDateFormat(Constants.DATE_PATTERN_yyyyMMdd ).format(connect.getCreatedDt());

DynamoDBConnectLog connectLog = mapper.load(DynamoDBConnectLog.class, createdDtYMD, connect.getId());
//(Class<DynamoDBConnectLog> clazz, Object hashKey, Object rangeKey)
}

// Hashkey로 Item 가져오기
public void getItemByHashKey(){
String hashKeyValue = "297ebe593e43c47a013e43c63883005c" ;

DynamoDBConnectLog connectLog = mapper.load(DynamoDBConnectLog. class, hashKeyValue);
}

save & get
DynamoDB example
@Test
public void testGetDailyConnectCountByNetworkOperator() {
String fromTimestamp = "1000000000000";
String toTimestamp = "1466855588069";
String conditionAttribute = "network_operator";
getAllCountUsingScanFromTo (fromTimestamp, toTimestamp, conditionAttribute);
}

private void getAllCountUsingScanFromTo(String fromTimestamp, String toTimestamp, String conditionAttribute) {

Map<String, Condition> scanFilter = new HashMap<String, Condition>();


Condition condition = new Condition()
.withComparisonOperator(ComparisonOperator. BETWEEN.toString())
.withAttributeValueList( new AttributeValue().withN(fromTimestamp), new AttributeValue().withN(toTimestamp));
scanFilter.put(CREATED_DT, condition);

scanRequest = scanRequest.withScanFilter(scanFilter).withAttributesToGet(Arrays.asList (conditionAttribute));


ScanResult scanResult = client.scan(scanRequest );

Map<String, Integer> count = new HashMap<String, Integer>();

count = getCountOfResult(conditionAttribute, scanResult, count);
while (
hasMoreData(scanResult)
) {

scanRequest.setExclusiveStartKey(scanResult.getLastEvaluatedKey());
scanResult = client.scan(scanRequest );
count = getCountOfResult(conditionAttribute, scanResult, count);
}

log.debug( "count : " + count);
}
scan
Full transcript