amazed by aws 1st session
Post on 26-Jun-2015
1.189 Views
Preview:
DESCRIPTION
TRANSCRIPT
Amazed By AWS Series #1
Play with Databases
정윤진솔루션아키텍트younjin@amazon.com
소개
AWS 솔루션아키텍트Gaming/HPC
DevOps
System Admin
(십년전) Kernel driver dev.
오늘내용
a. INTRO – Ice breaking
b. Game Play Patterns
c. Relational DBMS
d. NoSQL
e. Search
시작하기전에.
AWS 명령줄도구
http://aws.amazon.com/ko/cli/
$ sudo pip install awscli
Downloading/unpacking awscli
Downloading awscli-1.5.4.tar.gz (253kB): 253kB downloaded
Running setup.py (path:/private/tmp/pip_build_root/awscli/setup.py) egg_info for package awscli
…
..
.
Successfully installed awscli botocore bcdoc colorama docutils rsa jmespath pyasn1
Cleaning up...
$
$ aws configure
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]: json
$
$ aws s3 ls s3://yz-ngs-outputs
PRE Redis-snapshots/
PRE hohoho/
PRE pig-apache/
PRE transfer-test/
PRE wordcount/
2013-06-07 17:56:52 6097048 Elastic Beanstalk for Startups.pptx
2013-05-31 13:33:49 0 HG00099.mapped.SOLID.bfast.GBR.exome.20111114.bam
2013-05-06 15:56:56 132644272 TrendMicro-TTi_6.0_HE_Full.exe
2013-11-10 03:16:23 5188 fabricrc.txt
$
AWS 명령줄도구
Ice breaking
Amazon Web Services
Amazon Corporate Services Korea LLC
Our office
29th Sep 2014, 3AM
AWS 관련문의사항은여기로hwanbin@amazon.com
jungin@amazon.com
woosang@amazon.com
개발자에게 AWS란?
http://www.toptiertactics.com/wp-content/uploads/2011/10/Workaholic-Cartoon.jpg
Java Python PHP .NET Ruby nodeJS
iOS Android
AWS SDK
https://github.com/awslabs
하나이상의배포도구의사용이중요
OpsWorks CloudFormation
Game type:
모바일전략
데이터모델에대해
각종상태정보 : 레벨, 엑슬러, 트로피, 골드건물배치정보 : 담벼락, 성의위치, 대포위치게임플레이상태정보 : 온라인, 오프라인, 공격받는중, 공격하는중전투기록정보 : 언제어느유닛을어느좌표에, 공격/방어기록
기타 :
트로피를통한순위비교실시간채팅사용자이용행태로깅
실시간대전조건이붙지않으면,
또는붙으면?
상태정보
위치정보
Game type:
모바일캐주얼
데이터모델에대해
각종상태정보 : 레벨, 스코어, 골드, 아이템현황기록정보 : 언제로그인, 로그아웃, 마지막플레이레벨
기타 :
스코어를통한순위비교사용자이용행태로깅
클라이언트에서게임데이터가완성Backend 는데이터기록, 순위, 로깅, 분석을위해존재
Game type:
FPS, TPS
데이터모델에대해
각종상태정보 : 레벨, 스코어, 골드, 아이템현황기록정보 : 언제로그인, 로그아웃, 마지막플레이레벨로비정보 : 전투방생성을위한채팅, 중계를위한세션정보의저장상태정보 : 현재속한세션 id 및플레이중인 room id 등
기타 :
스코어를통한순위비교사용자이용행태로깅
로그인및캐릭터관련정보를제외하면거의대부분세션의중계및결과업데이트에집중
Game type:
MMORPG
데이터모델에대해
각종상태정보 : 레벨, 스코어, 골드, 아이템현황이실시간으로변경기록정보 : 언제로그인, 로그아웃, 마지막플레이레벨, 데미지, 몬스터및 PvP
정보로비정보 : 게임내실시간사용자간채팅, 고객지원이포함상태정보 : 서버간캐릭터의위치정보, HP 및데미지, 방어력등다양한스텟정보필요
기타 :
NPC 와캐릭터간인터렉션사용자플레이형태로깅
사용자의모든행위에대해실시간에가까운서버간동기화등이필요
올바른데이터베이스타입의선택데이터엔티티간의관계가필요한가?
1명 – 수억명의사용자접근에대비, 확장이가능한가?
데이터가영속적으로저장되어야하는가?
데이터가특정시점에만유효한가?
한번생성된데이터가자주변경될가능성이있는가?
한번생성된데이터는영원히변하지않는가?
Insert / Update / Delete / Select 중어떠한 type 의데이터변경이많은가?
단말 (클라이언트플랫폼)에서지원하는로컬 DB와동일한데이터타입을사용할수있는가?
http://www.raywenderlich.com/913/sqlite-tutorial-for-ios-making-our-app
http://www.slideshare.net/MindfireSolutions/web-sql-database-in-html-5
게임데이터베이스와 AWS
1. RDBMS 만으로처리하는데는한계가있다.
2. NoSQL 만으로는 Rich Query 를수행할수없다.
3. 분산환경에적합한게임서버구조를만들어야한다.
1. RDBMS 의사용비율축소, 샤딩구조확립2. NoSQL + Search engine 의혼합사용3. RPC, Coroutine (yield)과같은기법의적극사용4. Tight coupled 의방법보다는 Loosely coupled 의구현5. Pub/Sub 을통한서버간메세지전달
Game dev on AWS
구조화된데이터베이스 –복잡한쿼리를지원-SQL : Amazon RDS
-Data Warehouse : Amazon Redshift
-Search : Amazon CloudSearch
구조화되지않은데이터베이스 –커스텀쿼리를지원-Hadoop : Elastic MapReduce
Database Overview
구조화된데이터베이스 –단순한쿼리를지원-NoSQL : DynamoDB
-Cache : ElastiCache
구조화되지않은데이터베이스 –쿼리를지원하지않음- 클라우드스토리지 : S3, Glacier
Database Overview
관계형데이터베이스
SELECT customer_info.firstname, customer_info.lastname, purchases.item
FROM customer_info INNER JOIN purchases
ON customer_info.customer_number = purchases.customer_number;
Relational Database ServiceDatabase-as-a-Service
No need to install or manage database instances
Scalable and fault tolerant configurations
Feature Details
Platform support Create MySQL, SQL Server and Oracle RDBMS
Preconfigured Get started instantly with sensible default
settings
Automated patching Keep your database platform up to date
automatically
Backups Automatic backups and point in time recovery
and full DB backups
Provisioned IOPS Specify IO throughput depending on
requirements
Failover Automated failover to slave hosts in event of a
failure
Replication Easily create read-replicas of your data and
seamlessly replicate data across availability
zones
Compute Storage
AWS Global Infrastructure
Database
App Services
Deployment & Administration
Networking
사용이권장되는경우
-트랜잭션-복잡한쿼리가요구되는경우-최대 30,000 IOPS (15K reads, 15K writes)
-100기가바이트에서수 TB 수준-워크로드가 1대수준에서처리가능한경우-높은내구성이요구되는경우
RDS
사용이권장되지않는경우
-대량의 read/write 가요구될때 (150,000 write request/sec)
-데이터의크기또는처리량으로샤딩을결정해야하는경우-NoSQL 로처리가가능한수준의쿼리또는 Get/Put 의요청이대부분인경우-복잡한분석이필요한경우
RDS
Windows 기반의게임회사에서많이사용EC2 / RDS 에서사용가능EC2 에서사용시 PIOPS 적용된다수의 EBS 를통해 확장
가능i2 / r3 / c3 계열의인스턴스사용가능종전의데이터센서에서사용하던모든구성그대로사용가능 (SAN 기반클러스터링제외)
RDS 에서는 3개의 region에서 Multi-AZ 지원10,000 PIOPS 적용가능SYSADMIN 계정확보불가DB 가동작중인 OS 에접근불가최소볼륨크기 200G, 최대볼륨크기 1T
MSSQL
RDS 에서는 Multi-AZ, Read replication 등 DB engine
중가장다양하고많은기능을지원DB engine 에서는 timezone 변경이아직불가능. UTC
기반클라이언트접속시설정변경또는코드에서적용해야함사용이매우편리, dump/restore 역시기존에사용하는mysqldump / mysql 클라이언트를사용하여가능OS root 는확보불가능
순후하게 MySQL 만사용하면서 EC2 에직접설치하여사용하는경우요구사항은많지않음.
Maria 와같은 DB 의사용MMM / Galera 와같은별도의 3rd party 도구를사용하고자하는경우에유용Scale-up 의방법은 EC2 의방법과동일
MySQL
Region
Availability
Zone A Availability
Zone B
S3
EC2
• 게임은언제나 “Write heavy”
• 캐싱이언제나통하는것은아님
• 키밸류 / 키밸류
• 잦은바이너리의사용
• 데이터베이스는언제나병목
ELB
EC2
CloudFront
CDN
CUID 는괴롭다ㅠㅠ(creat/update/delete/insert)
Availability
Zone A
C2
Shard (No Fun)
관계형데이터베이스성능의극대화방법
1. EBS PIOPS 볼륨의적극적인사용2. Instance Store 의적극적인사용3. 테이블을많은볼륨에분산저장, 테이블을서로다른
볼륨에저장
Availability Zone a Availability Zone b
MSSQL
Master
MSSQL
Standb
y
4 SSD
Stripped Instance Store
(Main DB data store)
4 SSD
Stripped Instance Store
(Mirrored DB data store)
30G
EBS
nG
EBS
root TX
LOG
30G
EBS
nG
EBS
Mirroring
root TX
LOG
Cre
ate
vo
lum
e
sn
ap
sh
ot
Volume create
From snapshot
Att
ac
h v
olu
me
Fo
r re
sto
rati
on
Availability Zone a Availability Zone b
MSSQL
Master
MSSQL
Standb
y
4 SSD
Stripped Instance Store
(Main DB data store)
4 SSD
Stripped Instance Store
(Mirrored DB data store)
30G
EBS
nG
EBS
root TX
LOG
30G
EBS
nG
EBS
Mirroring
root TX
LOG
Cre
ate
vo
lum
e
sn
ap
sh
ot
Volume create
From snapshot
Att
ac
h v
olu
me
Fo
r re
sto
rati
onInstance Store 는재부팅시데이터가사라짐
따라서복제/복구/백업에대해확실한대비가필요
확실한대비없이는사용에주의!!!!!
Availability Zone a Availability Zone b
MSSQL
Master
MSSQL
Standb
y
n X PIOPS EBS
Not raided, for Windows Server
(table partition, table space)
(Main DB data store)
n X PIOPS EBS
Not raided, for Windows Server
(table partition, table space)
(Mirrored DB data store)
30G
EBS
nG
EBS
root TX
LOG
30G
EBS
nG
EBS
Mirroring
root TX
LOG
Cre
ate
vo
lum
e
sn
ap
sh
ot
Volume create
From snapshot
Att
ac
h v
olu
me
Fo
r re
sto
rati
on
NoSQL
redis> MSET one 1 two 2 three 3 four 4
OK
redis> KEYS *o*
1) "four"
2) "two"
3) "one"
redis> KEYS t??
1) "two"
redis> KEYS *
1) "four"
2) "two"
3) "one"
4) "three"
redis>
사용이권장되는경우
-예측가능한, 빠른속도가요구되는경우-순식간에대규모확장요구사항이있는경우-샤딩을자동으로해야하는경우-데이터의정합성과낮은지연시간이동시에필요한경우-데이터저장의크기및처리량의한계를설정할수없는경우-아주높은내구성이요구되는경우-간단한쿼리또는 KV 저장소가요구되는경우
DynamoDB
사용이권장되지않는경우
-다수의아이템또는 row 및서로다른테이블참조트랜잭션이필요한경우-복잡한쿼리및조인이필요한경우-로그성데이터에대한실시간분석이필요한경우-자주참조되지않는데이터를저장하고자하는경우
DynamoDB
클러스터자동생성 – Master : Multi replication nodes
Auto Backup
Auto Failover
Restore from rdb file
ElastiCache - Redis
최근의게임에서는 pub/sub 을통한데이터공유에사용종전의 UDP/TCP broadcast 를대처가능In-memory 처리로매우고속
Redis – pubsub
게임서버간이벤트공유
사용이권장되는경우
-확장된데이터모델과함께 KV 저장소가필요한경우 : string, lists, sets,
sorted sets, hashes
-캐싱-Leader board (리더보드)
-고속의정렬-원자단위의카운팅-큐시스템이필요한경우
ElastiCache – Redis
사용이권장되지않는경우
-Native 한샤딩또는 Scale-out 이필요한경우-아주높은수준의데이터보존성이요구되는경우-메모리에적합하지않은데이터를보유하고있는경우-예외상황에서도특정트랜젝션에대한롤백이필요한경우
ElastiCache – Redis
http://techblog.netflix.com/2013/02/announcing-evcache-distributed-in.html
In-memory caching solution based on memcached & spymemcached
- Ephemeral
- Volatile
- Cache (KV Store)
https://github.com/Netflix
http://media.amazonwebservices.com/AWS_NoSQL_Couchbase.pdf
Minimum production45GiB (20 x m1.large)
5Gbps access EBS
Up to 80,000 IOPS
Medium production410GiB
10Gbps access EBS
Up to 640,000 IOPS
Large production360GiB (30 instances)
10Gbps access EBS
Up to 500,000 IOPS
Extra large production1.5TiB (30 instances)
20Gbps access EBS
Up to 640,000 IOPS
https://media.amazonwebservices.com/AWS_NoSQL_MongoDB.pdf
http://www.youtube.com/watch?v=hYtRw3Zb6AY
Cassandra + OpsWorks
DynamoDBProvisioned throughput NoSQL database
Fast, predictable performance
Fully distributed, fault tolerant architecture
Feature Details
Provisioned
throughput
Dial up or down provisioned read/write capacity
Predictable
performance
Average single digit millisecond latencies from
SSD backed infrastructure
Strong consistency Be sure you are reading the most up to date
values
Fault tolerant Data replicated across availability zones
Monitoring Integrated to Cloud Watch
Secure Integrates with AWS Identity and Access
Management (IAM)
Elastic MapReduce Integrates with Elastic MapReduce for complex
analytics on large datasets
Compute Storage
AWS Global Infrastructure
Database
App Services
Deployment & Administration
Networking
DynamoDB, 조금더깊게
NoSQL 의종류
MongoDB
Riak
Hbase
Cassandra
Neo4j
CouchDB
DynamoDB
이외에도더많은 NoSQL 이존재
NoSQL vs. RDB
BASE 의특성
대용량데이터
확장가능
빠른쓰기속도
유연한스키마설정
ACID 특성- Atomicity
- Consistency
- Isolation
- Durability
트랜젝션기반
Rich한쿼리
조인
NoSQL RDB
BASE 특성이란
Basically Available, Soft state, Eventually consistent
즉,
데이터의즉시반영을통한높은일관성을일부포기하는대신,
확장성을특징으로.
모든 NoSQL 이완전히 BASE의특성을가지지는않지만기존 RDB
의 ACID 특성을 포기해야하는것이요구사항이된다.
API
SDK
Database
Clie
nt S
ide
Serv
ice S
ide
Client application
DynamoDB 의사용
특징1:관리가필요없는높은신뢰성
SPOF가존재하지않는구성데이터는 3개소의 AZ에분산저장되어높은신뢰성스토리지는필요에따라자동으로분산처리
Client
특징2:처리량을프로비저닝가능
Read 및 Write, 각각필요한만큼의처리용량을할당예를들어일반적인 Read Heavy DB 라면
Read : 1,000
Write : 100약간 Heavy 한 DB의경우
Read : 500
Write : 500이설정값은 DB 운영중에온라인으로변경가능
Scale-down에 관해서는하루 4회만가능
특징3:저장용량에제한이없는
사용한만큼지불하는종량제스토리지데이터용량증가에따른노드추가와같은작업이불필요
DynamoDB를시작하려면
1. 테이블의 Key 와 Index 를결정
2. Read/Write 처리량을결정
That’s it, write your code!
DynamoDB Demo - Tic Tac Toe Game
https://github.com/awslabs/dynamodb-tictactoe-example-app
DynamoDB 사용
제공되는 API
PutItem
UpdateItem
GetItem
DeleteItem
Query
Scan
BatchWriteItem
BatchGetItem
CreateTable
DescribeTable
UpdateTable
DeleteTable
주로사용되는기능
• Get/Put/Update/Delete/BatchGet
• Scan
전체테이블을싹쓸이로긁어옴
• Query
Hash + 범위키만
공식 SDK 이외에도
Perl
Net::Amazon::DynamoDB
Erlang
wagerlabs/ddb
https://github.com/wagerlabs/ddb
Go
go-dynamodb
https://github.com/fabiokung/go-dynamodb
테이블디자인을위한요소(1)
Table
Primary Key 로 ”Hash key” 혹은 ”Hash key & Range key”를선택기본키:Hash key
Hash key 단체로데이터를고유하게식별할수있는경우사용기본키:Hash key & Range key
Hash key에해당하는여러데이터에서 Range key 로검색가능Local Secondary Indexes
Range key 이외에필터검색을위한키를가질수있음Global Secondary Indexes
기존 Hash key & Range key 외다른 attribute 를 key 로지정가능
테이블디자인을위한요소(2)
Attributes
데이터의내용. Hash key 에해당하는 Attributes 이외에는미리정의할필요는없다. 또한레코드에서 Attributes 가불규칙하더라도문제없다.
Attributes 형식
String
Number
Binary
Array of String
Array of Number
Array of Binary
DynamoDB의데이터모델
테이블
아이템
기본 키 속성
Hash key 또는 Hash key & Range key
DynamoDB의기본키
• Hash key
간단한키값
Hash 이므로정렬이필요없음
• Hash key + Range key
복합기본키
Range key 는 sort 가있음
샘플(1)상품카탈로그
스키마테이블명 Products
상품 ID(ProductId) 를테이블의 Hash key 로사용
ProductId
(Hash key)
ProductName Price ・・・ ・・・
1 Pen 100 ・・・ ・・・
2 Pencil 50 ・・・ ・・・
3 Eraser 100 ・・・ ・・・
node.js SDK 사용예
데이터를테이블에입력
샘플(2)로그테이블
var data = new Array({ AudienceId: { N:"1" }, Timestamp: { S:"2013-10-01 00:01:01" }, Action: { S:"Login" } },{ AudienceId: { N:"2" }, Timestamp: { S:"2013-10-01 00:02:02" }, Action: { S:"Login" } },{ AudienceId: { N:"1" }, Timestamp: { S:"2013-10-01 00:21:00" }, Action: { S:"Login" } },{ AudienceId: { N:"1" }, Timestamp: { S:"2013-10-01 00:42:00" }, Action: { S:"ViewHoge" } },{ AudienceId: { N:"1" }, Timestamp: { S:"2013-10-01 00:56:22" }, Action: { S:"PostHoge" } }
);
for (var i =0; i < data.length; i++){dynamoDb.putItem(
{TableName:"Audience",Item: data[i]
},function(err,data){
if(err){console.log(err);
}else{console.log(data);
}}
);}
node.js SDK 사용예
사용자의 10월 1일 0시 10분이후의로그를가져오기
샘플(2)로그테이블
dynamoDb.query({
TableName:"Audience",KeyConditions: {
"AudienceId": {ComparisonOperator:"EQ",AttributeValueList:[ {N:"1"} ]
},"Timestamp": {
ComparisonOperator:"GT",AttributeValueList:[ {S:"2013-10-01 00:10:00"} ]
}}
},function(err,data){
if(err){console.log(err);
}else{console.log(data);
}}
);
샘플(3) LSI를적용한로그테이블
사용자로그에 Local Secondary Indexes(LSI)를보면
AudienceId
(Hash key)
Timestamp
(Range key)
Action
(Action-Index)
Url ・・・
1 2013-10-01
00:01:01
Login ・・・ ・・・
2 2013-10-01
00:02:02
Login ・・・ ・・・
1 2013-10-01
00:21:00
Login ・・・ ・・・
1 2013-10-01
00:42:00
ViewHoge
1 2013-10-01
00:56:22
PostHoge
Local Secondary Indexes(LSI)
• Get/Put/Update/Delete/BatchGet
• Scan
테이블의전체내용을가져옴
• Query
Hash + Range 키만가져옴
Local Secondary Index 를사용하여이제한을없앨수있다!
Local Secondary Indexes (LSI)
테이블에서어떠한 Index 를 Query 로사용할지에대한예
5개의 LSI 지정이가능
LSI없는테이블에서는 Range
Key를사용한 Query 만가능
LastPostIndex
RepliesIndex
LSI를정의하면 Key가아닌속성에대해서도 Query 가능예:
- Replies 가 10개이상- 마지막게시물이 XX 이후
LSI
Forum 게시물을보관하는테이블의구조
어째서 ”Local” Secondary Indexes 인가?
Hash key 가일치하는범위내에서의 Secondary Index 이므로
Hash Key 가다른항목에대해 Query 결과로가져올수없다
RepliesIndex 를사용하여1개의Query로 가져올수있는데이터는?
•ForumName 이 S3 이며, Replies
가 9개이상
•모든 ForumName 에서Replies가 9이상 3개의 Hash key가있으므로3 회의 Query 필요
RepliesIndex
LSI 를설정한경우의실제동작
Thread 테이블의 LastPostDateTime에 LSI 를설정하면,
LastPostIndex
별도의 Index 테이블이뒤에서생성, 관리됨
• 지정된속성이 Range-key
• 원래테이블의 Range-key 가속성으로
속성의프로젝션Index 용테이블에지정된속성을복제저장하는기능
예:Thread 테이블에 Replies를 LastPostIndex에프로젝션
LastPostIndex
Query 수행시 Replies를취득하는경우 Load 비용을절감성능향상 ReadThroughput 을절약가능
User
(Hash)
Timestamp
(Range)
Opponent Result
Alice 2014-02-21 12:21:20 Bob Lost
Alice 2014-02-21 12:42:01 Bob Won
Alice 2014-02-24 09:48:00 Dan Won
Alice 2014-02-25 16:21:11 Charlie Won
Battle History
사용자가 자신의 전투 기록을 확인하는 경우
– User (Alice)가 timestamp range-key 를 이용하여 지난 7일간의 전투기록을 확인
Charlie
02-25 16:21
Won!
Your Battle History
Dan
02-24 09:48
Won!
Alice
02-21 12:42
Won!
게이머의플레이데이터이력
사진공유 SNS 앱
Home My Posts My Profile
Bob
Steak!10:18
Carol
BBQ! w/Alice10:12
Dan
Riajuee…10:11
Alice
Beer!10:21
Alice
BBQ! w/Carol10:12
Alice
Starting BBQ!10:09
Name:
Alice
Mail: foo
Profile: some texts
Users TableFriends Table
테이블 2개를정의• 사용자정보테이블
• 친구목록테이블
테이블설계
User
(Hash)
Nicknames
Bob [ Rob, Bobby ]
Alice [ Allie ]
Carol [ Caroline ]
Dan [ Daniel, Danny ]
Users Table
Item
Attribute
(string, number, binary, set)
Primary Key
(Hash)
친구목록검색
User
(Hash)
Nicknames
Bob [ Rob, Bobby ]
Alice [ Allie ]
Carol [ Caroline ]
Dan [ Daniel, Danny ]
Friends Table
User
(Hash)
Friend
(Range)
Bob Alice
Alice Bob
Alice Carol
Alice Dan
Users Table
Hash + Range
Primary Key
친구목록검색
Friends Table Users Table
User
(Hash)
Nicknames
Bob [ Rob, Bobby ]
Alice [ Allie ]
Carol [ Caroline ]
Dan [ Daniel, Danny ]
User
(Hash)
Friend
(Range)
Bob Alice
Alice Bob
Alice Carol
Alice Dan
Alice의친구목록검색1. Query (Table = Friends,
Hash = Alice, Range = *)
2. BatchGetItem(Bob, Carol, Dan)
친구목록검색
Friends Table Users Table
User
(Hash)
Nicknames
Bob [ Rob, Bobby ]
Alice [ Allie ]
Carol [ Caroline ]
Dan [ Daniel, Danny ]
User
(Hash)
Friend
(Range)
Bob Alice
Alice Bob
Alice Carol
Alice Dan
Alice의게시물및이미지검색1. Query (Table = Friends,
Hash = Alice, Range = *)
2. BatchGetItem(Bob, Carol, Dan)
게시물검색
Images Table
User
(Hash)
Image
(Range)
Date Link
Bob aed4c 2013-10-01 s3://…
Bob cf2e2 2013-09-05 s3://…
Bob f93bae 2013-10-08 s3://…
Alice ca61a 2013-09-12 s3://…
Bob
Bob의게시물목록을검색Query (Table=Images,
Hash= Bob,
Range=*)
만약특정시간이후의사진목록을가져오고싶다면?
이미지검색
Images Table
User Image Date Link
Bob aed4c 2013-10-01 s3://…
Bob cf2e2 2013-09-05 s3://…
Bob f93bae 2013-10-08 s3://…
Alice ca61a 2013-09-12 s3://…
User Date Image
Bob 2013-09-05 cf2e2
Bob 2013-10-01 aed4c
Bob 2013-10-08 f93bae
Alice 2013-09-12 ca61a
Table ByDate Local Secondary Index
Local Secondary Index 를 Date 속성에적용
날짜및시간이미지수집
ImageTags Table
Image User
aed4c Alice
aed4c Bob
f93bae Alice
f93bae Bob
Image f93bae에 Alice를태그PutItem(Table = ImageTags,
Hash = f93bae, Range = Alice)Bob
만약사용자가태그된이미지목록으로검색하고자한다면?
Image f93bae에태그된사용자목록Query(Table = ImageTags,
Hash = f93bae, Range = *)
이미지에사용자를태그
ImageTags Table
User Image의 Range 를Global Secondary Index 로적용
User
(Hash)
Image
(Range)
Bob aed4c
Bob f93bae
Alice aed4c
Alice f93bae
ByUser Global Secondary Index
Image
(Hash)
User
(Range)
aed4c Alice
aed4c Bob
f93bae Alice
f93bae Bob
Table
Bob
Alice 가태그된사진목록
사용자의태그이미지목록
테이블디자인: 기본키의사용Hash key와 Range key의개념
A,D B,E C,F
1
23
45
67
89
Parition1 Partition2 Parition3
Range keyPartition내에서 데이터의 순서를 보장
Hash keyPartition간의 데이터 분산에 이용되는key
DynamoDB의 처리량은 각Partition에 부하가 적절히 분산되었을때를 기준으로 설계되어 있다. 하나의 Partition 으로 프로비저닝된 처리량이나오는 것이 아님에 주의
A,D B,E C,F
1
23
45
67
89
Parition1 Partition2 PartitionN
Partition
DynamoDB 는프로비저닝된처리량을보장하기위해데이터를여러파티션에분산저장한다.
Partition은저장된데이터량과프로비저닝한처리량에의해자동으로다시파티셔닝한다.
지금현재의파티션수를확인하는것은불가능
테이블디자인: 기본키의사용
A,D B,E C,F
1
23
45
67
89
Parition1 Partition2 ParitionN
처리량은파티션에균등하게분할된다.
프로비저닝된처리량은각파티션에균등하게분할되며, 각합은지정한처리량이나오도록설계되어있다.
따라서엑세스키에편향이발생할가능성이많은구조로테이블이설계되어있다면원하는만큼성능이나오지않을가능성이있으므로주의해야한다.
프로비저닝된처리량 : x
x/N x/N x/N
테이블디자인: 기본키의사용
테이블디자인: 기본키의사용
Hot Key문제 :특정 Hash key에데이터가집중되면성능이저하(예상대로의성능이아님)됨에주의
위의 Audience 테이블에서 AudienceId처럼데이터가특정키에집중하기어려운것을선택한다
예를들어,「년월」과같이데이터의집중이발생하기쉬운데이터를 Hash key로선택하는것은안티패턴
테이블디자인: LSI
Local Secondary Indexes는저장소와 IO 비용증가를발생시킬수있음
LSI는소위 “Projection”에서구현된다
따라서 Projection 되는속성이많을수록스토리지비용이증가
Write시쓰기비용역시증가
반드시필요한조건에만 LSI 를사용Projection이필요한 Attributes만선택하도록한다
DynamoDB Local
개발및테스트용도구
이전까지는개발및테스트를위해서는반드시 DynamoDB테이블을생성해야했다. 이는 ”비용발생의우려”、”내부테스트환경구성불가”、”오프라인으로개발불가능”과같은문제가있었음
이도구를사용하여개발및테스트를보다편리하게수행할수있음JAR파일로제공되어로컬에설치및실행가능 (Java7)단순히 API의기능재현을위한테스트용도구이기때문에서비스환경에는사용이불가능프로비전된처리량은반영되지않으므로주의자세한내용은 AWS document 를참조
Amazon EMR의 Hive 에서사용
CREATE EXTERNAL TABLE Audience
( AudienceId Int, ActionTimestamp string, Action string )
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
TBLPROPERTIES (
"dynamodb.table.name" = ”Audience2",
"dynamodb.column.mapping" =
”AudienceId:AudienceId,
ActionTimestamp:Timestamp,
Aciton:Action“ );
hive의 External Table로이용가능DynamoDB의데이터집계등이필요한경우등에이용
자세한내용은http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/EMR_Interactive_Hive.html
hive를사용하여 S3에데이터백업
EMR에서 hive는 DynamoDB뿐만아니라 S3 역시 External Table 사용할수있는장점을살려 DynamoDB 를 External Table 로 Select한데이터를다시 S3 의External Table로 Insert 가능
INSERT OVERWRITE TABLE
s3_as_external_table
SELECT *
FROM dynamodb_as_external_table;
Redshift 의 COPY 를사용해데이터를로드
자세한내용은http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/R
edshiftforDynamoDB.html
Amazon Redshift 에데이터로딩
COPY audience
FROM ‘dynamodb://Audience2’
CREDENTIALS
'aws_access_key_id=<Your-Access-Key-ID>;aws_secret_access_key=<Your-Secret-Access-Key>'
READRATIO 50;
http://www.youtube.com/watch?v=Dh8kp1AcRg0
https://github.com/Aconex/scrutineer
-오픈소스 : elasticsearch.com 통해서포트가가능-분산검색엔진-클러스터링형태로구성이가능-고가용성-다중사용자환경
https://github.com/kzwang/elasticsearch-river-dynamodb
River
http://docs.couchbase.com/couchbase-elastic-search/
http://www.elasticsearch.org/guide/en/elasticsearch/reference/0.9
0/modules-gateway-local.html
http://www.elasticsearch.org/guide/en/elasticsearch/reference/0.9
0/modules-gateway-s3.html
사용이권장되는경우
-검색에대해내가전문성이없다고판단되는경우-Full-text 검색이필요한경우-랭킹-검색-구조화된데이터와구조화되지않은데이터가혼재하는경우
CloudSearch
사용이권장되지않는경우
-다수의아이템또는 row 및서로다른테이블참조트랜잭션이필요한경우-복잡한쿼리및조인이필요한경우-로그성데이터에대한실시간분석이필요한경우-자주참조되지않는데이터를저장하고자하는경우
CloudSearch
http://www.youtube.com/watch?v=mdj8RQhqOEg
Write once
Read many then,
s3://mys3database/HASHasFILENAME.JSON
S3 - Durable storage, any object99.999999999% durability of objects
Unlimited storage of objects of any type
Up to 5TB size per object
Feature Details
Flexible object store Buckets act like drives, folder structures within
Access control Granular control over object permissions
Server-side
encryption
256bit AES encryption of objects
Multi-part uploads Improved throughput & control
Object versioning Archive old objects and version new ones
Object expiry Automatically remove old objects
Access logging Full audit log of bucket/object actions
Web content
hosting
Serve content as web site with built in page
handling
Notifications Receive notifications on key events
Import/Export Physical device import/export service
Compute Storage
AWS Global Infrastructure
Database
App Services
Deployment & Administration
Networking
1. RDBMS 만으로처리하는데는한계가있다.
2. NoSQL 만으로는 Rich Query 를수행할수없다.
3. 분산환경에적합한게임서버구조를만들어야한다.
1. RDBMS 의사용비율축소, 샤딩구조확립2. NoSQL + Search engine 의혼합사용3. RPC, Coroutine (yield)과같은기법의적극사용4. Tight coupled 의방법보다는 Loosely coupled 의구현5. Pub/Sub 을통한서버간메세지전달
Summary
aws.amazon.com/ko/game-hosting
top related