[db tech showcase tokyo 2015] a33:amazon dynamodb deep dive by アマゾン データ サービス...

82
Deep Dive: Amazon DynamoDB Yuko Mori Solutions Architect Amazon Data Services Japan K.K.

Upload: insight-technology-inc

Post on 31-Jul-2015

3.392 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Deep Dive: Amazon DynamoDB

Yuko Mori

Solutions Architect

Amazon Data Services Japan K.K.

Page 2: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

自己紹介

• 森 祐孝(もり ゆうこう)– アマゾンデータサービスジャパン株式会社

– ソリューションアーキテクト

• 経歴– Sierなどで、アプリケーション開発、PL、PMなどを担当

– ゲーム会社(テクニカルディレクタ)• ブラウザソーシャルゲーム、スマートフォン向けソーシャルゲーム

• 担当– ソーシャルゲーム、コンソールゲーム系のお客様のAWS構築支援

Page 3: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Agenda

• DyanamoDBとは

• Table, API, Data Type

• Indexes

• Scaring

• Data Modeling

• ユースケース& ベストプラクティス

• DynamoDB Stream

Page 4: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

DyanamoDBとは

Page 5: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Amazon DynamoDBの生い立ち• Amazon.comではかつて全てのアクセスパターンをRDBMSで

処理していた• RDBMSのスケールの限界を超えるため開発されたDynamoが

祖先

• 結果整合性モデル採用による可用性向上

• HWを追加する毎に性能が向上するスケーラビリティ

• シンプルなクエリモデルによる予測可能な性能

Page 6: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Amazon DynamoDBの特徴

• 完全マネージド型の NoSQL データベースサービス

• ハイスケーラブル、低レイテンシー

• 高可用性– 3x レプリケーション

• シンプル且つパワフルAPI

• ストレージの容量制限がない

• 運用管理必要なし

クライアント

Page 7: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Tables, API, Data Types

Page 8: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Tabletable

items

attributes

HashKey

RangeKey

必須キーバリュー型のアクセスパターンデータ分散に利用される オプション

1:Nモデルのリレーションシップ豊富なQueryをサポート

ハッシュキー検索用

==, <, >, >=, <=“begins with”“between”sorted resultscounts先頭/末尾 N件ページ単位出力

Page 9: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

• CreateTable

• UpdateTable

• DeleteTable

• DescribeTable

• ListTables

• GetItem

• PutItem

• UpdateItem

• DeleteItem

• Query

• Scan

• BatchGetItem

• BatchWriteItem

• Liststreams

• DescribeStream

• GetShardIterator

• GetRecords

Table API

Stream API

DynamoDB

In preview

Page 10: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

AWS SDKs and CLI

• 各種言語むけのオフィシャルSDKやCLIを利用

Java Python PHP .NET Ruby nodeJS

iOS AndroidJavascript

in the Browser AWS CLI

Page 11: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Data Types

• String (S)

• Number (N)

• Binary (B)

• String Set (SS)

• Number Set (NS)

• Binary Set (BS)

• Boolean (BOOL)

• Null (NULL)

• List (L)

• Map (M)

JSON用に定義

Page 12: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

00 55 A954 AA FF

Hash Table• Hash key は単体でプライマリキーとして利用

• 順序を指定しないハッシュインデックスを構築するためのキー

• テーブルは、性能を確保するために分割(パーティショニング)される場合あり

00 FF

Id = 1

Name = Jim

Hash (1) = 7B

Id = 2

Name = Andy

Dept = Engg

Hash (2) = 48

Id = 3

Name = Kim

Dept = Ops

Hash (3) = CD

Key Space

Page 13: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

データは3箇所にレプリケーション

Id = 2

Name = Andy

Dept = Engg

Id = 3

Name = Kim

Dept = Ops

Id = 1

Name = Jim

Id = 2

Name = Andy

Dept = Engg

Id = 3

Name = Kim

Dept = Ops

Id = 1

Name = Jim

Id = 2

Name = Andy

Dept = Engg

Id = 3

Name = Kim

Dept = Ops

Id = 1

Name = Jim

Replica 1

Replica 2

Replica 3

Partition 1 Partition 2 Partition N

Page 14: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Hash-Range Table

• Hash + Rangeでプライマリキーとすることもできる• Hash keyに該当する複数のデータの順序を保証するためにRange keyが使われる

• Hash Keyの数に上限はありません(Local Secondary Indexesを使用時は上限あり)

00:0 FF:∞

Hash (2) = 48

Customer# = 2

Order# = 10

Item = Pen

Customer# = 2

Order# = 11

Item = Shoes

Customer# = 1

Order# = 10

Item = Toy

Customer# = 1

Order# = 11

Item = Boots

Hash (1) = 7B

Customer# = 3

Order# = 10

Item = Book

Customer# = 3

Order# = 11

Item = Paper

Hash (3) = CD

55 A9:∞54:∞ AAPartition 1 Partition 2 Partition 3

Page 15: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

DynamoDBの整合性モデル

• Write

• 少なくとも2つのレプリカでの書き込み完了が確認とれた時点でAck

• Read

• デフォルト

• 結果整合性のある読み込み

• 最新の書き込み結果が反映されない可能性がある

• Consistent Readオプションを付けたリクエスト

• 強力な整合性のある読み込み

• Readリクエストを受け取る前までのWriteがすべて反映されたレスポンスを保証

Page 16: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Indexes

Page 17: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Local Secondary Index (LSI)• Range key以外に絞り込み検索を行うkeyを持つことができる• Hash keyが同一で、他のアイテムからの検索のために利用

• すべての要素(テーブルとインデックス)の合計サイズを、各ハッシュキーごとに 10 GB に制限

A1(hash)

A3(range)

A2(table key)

A1(hash)

A2(range)

A3 A4 A5

LSIs A1(hash)

A4(range)

A2(table key)

A3(projected)

Table

KEYS_ONLY

INCLUDE A3

A1(hash)

A5(range)

A2(table key)

A3(projected)

A4(projected)

ALL

Page 18: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Global Secondary Index (GSI)• Hash Key属性の代わりとなる

• Hash Keyをまたいで検索を行うためのインデックス

A1(hash)

A2 A3 A4 A5

GSIs A5(hash)

A4(range)

A1(table key)

A3(projected)

Table

INCLUDE A3

A4(hash)

A5(range)

A1(table key)

A2(projected)

A3(projected) ALL

A2(hash)

A1(table key) KEYS_ONLY

Page 19: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

GSIの更新フロー

Table

Primary

tablePrimary

tablePrimary

tablePrimary

table

Global

Secondary

Index

Client

2. 非同期Update

(in progress)

GSIにはテーブルとは独立したスループットをプロビジョンして利用するため十分なスループットが必要

Page 20: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Scaling

Page 21: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Scaling

• スループット– テーブル単位で、読み書きのスループットを指定(プロビジョニングされたスループット)

• サイズ– テーブルには任意の数のアイテムが追加可能

• 1 つのアイテムの合計サイズは 400 KB

• local secondary index について、異なるハッシュキーの値ごとに最大10 GB のデータを格納

• スケーリングはパーティショニングによって実現

Page 22: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

スループット

• テーブルレベルによってプロビジョニング– Write Capacity Units (WCU)

• 1 秒あたりの項目書き込み回数 x 項目のサイズ (1 KB ブロック)

– Read Capacity Units (RCU)

• 1 秒あたりの読み込み回数 x 項目のサイズ (4 KB ブロック)

• 結果整合性のある読み込みをする場合はスループットが 2 倍

• 読み込みと書き込みのスループットはそれぞれ独立

WCURCU

Page 23: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

パーティショニングの算出方法

# 𝑜𝑓 𝑃𝑎𝑟𝑡𝑖𝑡𝑖𝑜𝑛𝑠 =𝑇𝑎𝑏𝑙𝑒 𝑆𝑖𝑧𝑒 𝑖𝑛 𝐺𝐵

10 𝐺𝐵(𝑓𝑜𝑟 𝑠𝑖𝑧𝑒)

# 𝑜𝑓 𝑃𝑎𝑟𝑡𝑖𝑡𝑖𝑜𝑛𝑠(𝑓𝑜𝑟 𝑡ℎ𝑟𝑜𝑢𝑔ℎ𝑝𝑢𝑡)

=𝑅𝐶𝑈𝑓𝑜𝑟 𝑟𝑒𝑎𝑑𝑠

3000 𝑅𝐶𝑈+

𝑊𝐶𝑈𝑓𝑜𝑟 𝑤𝑟𝑖𝑡𝑒𝑠

1000𝑊𝐶𝑈

(𝑓𝑜𝑟 𝑡ℎ𝑟𝑜𝑢𝑔ℎ𝑝𝑢𝑡)(𝑓𝑜𝑟 𝑠𝑖𝑧𝑒)(𝑡𝑜𝑡𝑎𝑙)

• スループット

• ストレージサイズ

• 大きいほうを採用

Page 24: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

パーティショニング算出例

# 𝑜𝑓 𝑃𝑎𝑟𝑡𝑖𝑡𝑖𝑜𝑛𝑠 =8 𝐺𝐵

10 𝐺𝐵= 0.8 = 1

(𝑓𝑜𝑟 𝑠𝑖𝑧𝑒)

# 𝑜𝑓 𝑃𝑎𝑟𝑡𝑖𝑡𝑖𝑜𝑛𝑠(𝑓𝑜𝑟 𝑡ℎ𝑟𝑜𝑢𝑔ℎ𝑝𝑢𝑡)

=5000𝑅𝐶𝑈

3000 𝑅𝐶𝑈+

500𝑊𝐶𝑈

1000𝑊𝐶𝑈= 2.17 = 3

Table size = 8 GB, RCUs = 5000, WCUs = 500

(𝑡𝑜𝑡𝑎𝑙)

RCUs per partition = 5000/3 = 1666.67WCUs per partition = 500/3 = 166.67Data/partition = 8/3 = 2.66 GB

RCUとWCU の値は均一に各パーテションに割り当てられます

• スループット

• ストレージサイズ

• 大きいほうを採用

Page 25: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

DynamoDBの料金体系

• プロビジョニングされたスループットで決まる時間料金– Read/Writeそれぞれプロビジョンしたスループットによって時間あたりの料金がきまる

– 大規模に利用するのであればリザーブドキャパシティによる割引もあり

• ストレージ利用量– 保存したデータ容量によって決まる月額利用料金

– 計算はGBあたりの単価が適用される

http://aws.amazon.com/jp/dynamodb/pricing/詳細はこちらを参照

Page 26: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

DynamoDB のスループットを最大限に活用

“DynamoDB のスループットを最大限に活用するには、テーブルを作成するときに、ハッシュキー要素に個別の値が多数含まれ、できるだけランダムかつ均一に値がリクエストされるようにします。”

– DynamoDB Developer Guide

• Space: キーアクセスはなるべく均等になるように

• Time: リクエストはなるべく均等な間隔で

Page 27: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Example: Hot Keys

Part

itio

n

Time

Heat

Page 28: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Example: Periodic spike

Page 29: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

DynamoDBのバースト処理は?

• DynamoDBはパーティションごとのキャパシティのうち、利用されなかった分を過去300秒分までリザーブ

• プロビジョン分を超えたバーストラフィックを処理するために利用する– リザーブされたキャパシティは、各パーティションで利用可能

Page 30: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Burst capacity is built-in

0

400

800

1200

1600

Cap

ac

ity U

nit

s

Time

Provisioned Consumed

使われなかったキャパシティ分を保持

保持していたキャパシティを使用

バーストキャパシティ: 300秒(1200 × 300 = 3600 CU)

Page 31: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Burst capacity may not be sufficient

0

400

800

1200

1600

Cap

ac

ity U

nit

s

Time

Provisioned Consumed Attempted

バーストキャパシティ: 300秒(1200 × 300 = 3600 CU)

超過したリクエスト

バーストキャパシティの機能に依存しないように。

Page 32: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Data Modeling

Page 33: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

1:1 リレーション or キー・バリュー型

• Hash keyを使ったテーブルまたはGSI

• GetItem かBatchGetItem APIを使用

例: UserIDやEmailから要素を抽出する場合Users TableHash key AttributesUserId = bob Email = [email protected], JoinDate = 2011-11-15UserId = fred Email = [email protected], JoinDate = 2011-12-01

Users-email-GSIHash key AttributesEmail = [email protected] UserId = bob, JoinDate = 2011-11-15Email = [email protected] UserId = fred, JoinDate = 2011-12-01

Page 34: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

1:N リレーション or 親子関係

• Hash key とRange key を使ったテーブル、GSI

• Query APIを使ってアクセス

例:1ユーザでN個のゲームをプレイしている場合User-Games

Hash Key Range key AttributesUserId = bob GameId = Game1 HighScore = 10500, ScoreDate = 2011-10-20UserId = fred GameId = Game2 HIghScore = 12000, ScoreDate = 2012-01-10UserId = bob GameId = Game3 HighScore = 20000, ScoreDate = 2012-02-12

Page 35: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

N:M リレーション

• table と GSI を使用してhash key とrange key の要素をスイッチして設計

• Query API を用いてアクセス

例: 1ユーザが複数のゲームをプレイし,

1ゲームで複数のプレイヤーがゲームをしている場合User-Games-Table

Hash Key Range keyUserId = bob GameId = Game1

UserId = fred GameId = Game2

UserId = bob GameId = Game3

Game-Users-GSI

Hash Key Range key

GameId = Game1 UserId = bob

GameId = Game2 UserId = fred

GameId = Game3 UserId = bob

Page 36: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Document (JSON)

• 新データタイプ (M, L, BOOL,

NULL) としてJSONをサポート

• Document SDKs

– 単純なプログラミングモデル

– JSONから、JSONへの変換

– Java, JavaScript, Ruby, .NET

Javascript DynamoDB

string S

number N

boolean BOOL

null NULL

array L

object M

Page 37: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

ユースケース及び、ベストプラクティス

Page 38: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

イベントログ

Storing time series data

Page 39: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Time Series Tables

Events_table_2015_June

Event_id

(Hash key)

Timestamp

(range key)

Attribute1 …. Attribute N

Events_table_2015_May

Event_id

(Hash key)

Timestamp

(range key)

Attribute1 …. Attribute N

Events_table_2015_April

Event_id

(Hash key)

Timestamp

(range key)

Attribute1 …. Attribute N

Events_table_2015_March

Event_id

(Hash key)

Timestamp

(range key)

Attribute1 …. Attribute N

RCU = 1000

WCU = 100

RCU = 10000

WCU = 10000

RCU = 100

WCU = 10

RCU = 10

WCU = 1

Current table

Older tables

Hot

data

Cold

data

ホットデータとコールドデータは混在させないアーカイブしたコールドデータはS3へ

Page 40: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

メッセージアプリ

Large Items

Filters vs Indexes

M:N modeling – Inbox & Sent Items

Page 41: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Messages

Table

Messages App

David

SELECT *

FROM Messages

WHERE Recipient='David'

LIMIT 50

ORDER BY Date DESC

Inbox

SELECT *

FROM Messages

WHERE Sender ='David'

LIMIT 50

ORDER BY Date DESC

Outbox

Page 42: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Recipient Date Sender Message

David 2014-10-02 Bob …

… 48 more messages for David …

David 2014-10-03 Alice …

Alice 2014-09-28 Bob …

Alice 2014-10-01 Carol …

大小のデータが混在

(Many more messages)

David

Messages Table

50 items × 平均 256 KB

大きなメッセージボディーを格納

SELECT *

FROM Messages

WHERE Recipient='David'

LIMIT 50

ORDER BY Date DESC

Inbox

Page 43: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

クエリーコストの計算

1回の問い合わせによって取得されるアイテム数

平均アイテムサイズ

4KB毎に1RCU

消費

結果整合性のある読み込み

Page 44: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Recipient Date Sender Subject MsgId

David 2014-10-02 Bob Hi!… afed

David 2014-10-03 Alice RE: The… 3kf8

Alice 2014-09-28 Bob FW: Ok… 9d2b

Alice 2014-10-01 Carol Hi!... ct7r

大きいデータを分けて配置

Inbox-GSI Messages Table

MsgId Body

9d2b …

3kf8 …

ct7r …

afed …

David1. Query Inbox-GSI: 1 RCU

2. BatchGetItem Messages: 1600 RCU

(50 separate items at 256 KB)

(50 sequential items at 128 bytes)

均等に大きいアイテムを読むように配置

(Recipientをindex,

Message メタデータを格納)

Page 45: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Inbox GSI

Page 46: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

書き込み処理を単純化

David

PutItem

{

MsgId: 123,

Body: ...,

Recipient: Steve,

Sender: David,

Date: 2014-10-23,

...

}

Inbox

Global secondary

index

Messages

Table

Page 47: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Outbox Sender

Outbox GSI

SELECT *

FROM Messages

WHERE Sender ='David'

LIMIT 50

ORDER BY Date DESC

Page 48: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Messaging app

Messages

Table

David

Inbox

Global secondary

index

Inbox

Outbox

Global secondary

index

Outbox

update

Page 49: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

マルチプレイヤーオンラインゲーム

Query filters vs

Composite key indexes

Page 50: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

GameId Date Host Opponent Status

d9bl3 2014-10-02 David Alice DONE

72f49 2014-09-30 Alice Bob PENDING

o2pnb 2014-10-08 Bob Carol IN_PROGRESS

b932s 2014-10-03 Carol Bob PENDING

ef9ca 2014-10-03 David Bob IN_PROGRESS

Games Table

マルチプレイヤーオンラインゲームデータ

Page 51: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

ゲーム内でのクエリー要件

• DynamoDBのインデックスはhash keyと range

keyのみ対応

• 2つの一致条件と範囲検索を行いたい場合は?

SELECT * FROM Game

WHERE Opponent='Bob‘

AND Status=‘PENDING'

ORDER BY Date DESC

(hash)

(range)

(?)

Page 52: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Secondary Index

Opponent Date GameId Status Host

Alice 2014-10-02 d9bl3 DONE David

Carol 2014-10-08 o2pnb IN_PROGRESS Bob

Bob 2014-09-30 72f49 PENDING Alice

Bob 2014-10-03 b932s PENDING Carol

Bob 2014-10-03 ef9ca IN_PROGRESS David

Approach 1: Query filter

Bob

Page 53: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Secondary Index

Approach 1: Query filter

Bob

Opponent Date GameId Status Host

Alice 2014-10-02 d9bl3 DONE David

Carol 2014-10-08 o2pnb IN_PROGRESS Bob

Bob 2014-09-30 72f49 PENDING Alice

Bob 2014-10-03 b932s PENDING Carol

Bob 2014-10-03 ef9ca IN_PROGRESS David

SELECT * FROM Game

WHERE Opponent='Bob'

ORDER BY Date DESC

FILTER ON Status='PENDING'

(filtered out)

Page 54: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Needle in a haystack

Bob

消費されるキャパシティーユニット数は、フィルタされた分は取り除かれない

Page 55: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Approach 2: 複合キー

StatusDate

DONE_2014-10-02

IN_PROGRESS_2014-10-08

IN_PROGRESS_2014-10-03

PENDING_2014-09-30

PENDING_2014-10-03

Status

DONE

IN_PROGRESS

IN_PROGRESS

PENDING

PENDING

Date

2014-10-02

2014-10-08

2014-10-03

2014-10-03

2014-09-30

Page 56: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Secondary Index

Approach 2: 複合キー

Opponent StatusDate GameId Host

Alice DONE_2014-10-02 d9bl3 David

Carol IN_PROGRESS_2014-10-08 o2pnb Bob

Bob IN_PROGRESS_2014-10-03 ef9ca David

Bob PENDING_2014-09-30 72f49 Alice

Bob PENDING_2014-10-03 b932s Carol

Page 57: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Opponent StatusDate GameId Host

Alice DONE_2014-10-02 d9bl3 David

Carol IN_PROGRESS_2014-10-08 o2pnb Bob

Bob IN_PROGRESS_2014-10-03 ef9ca David

Bob PENDING_2014-09-30 72f49 Alice

Bob PENDING_2014-10-03 b932s Carol

Secondary Index

Approach 2: 複合キー

Bob

SELECT * FROM Game

WHERE Opponent='Bob'

AND StatusDate STARTS_WITH 'PENDING'

Page 58: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Needle in a sorted haystack

Bob

消費されるキャパシティーユニット数を節約

Page 59: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

スパースなインデックスの利用

Id (hash)

User Game Score Date Award

1 Bob G1 1300 2012-12-23

2 Bob G1 1450 2012-12-233 Jay G1 1600 2012-12-24

4 Mary G1 2000 2012-10-24 Champ5 Ryan G2 123 2012-03-10

6 Jones G2 345 2012-03-20

Game-scores-table

Award (hash)

Id User Score

Champ 4 Mary 2000

Award-GSI

項目内にインデックスキー値がある場合のみ書き込み

書き込み、読み込みキャパシティユニットも少なくなる

Page 60: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

リアルタイム投票システム

Write-heavy items

Page 61: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

投票システムの要件

• 投票は一回のみ

• 一度投票したものは変えられない

• リアルタイムに集計

• 投票者の統計、分析を行いたい

Page 62: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

リアルタイム投票システムのアーキテクチャ

票集計Table

Voters

投票Table

Voting App

Page 63: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Partition 1

1000 WCUs

Partition K

1000 WCUs

Partition M

1000 WCUs

Partition N

1000 WCUs

投票Table

Candidate A Candidate B

スケールすることによるボトルネック

Voters

Provision 200,000 WCUs

Page 64: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

シャーディングでの書き込み

Candidate A_2

Candidate B_1

Candidate B_2

Candidate B_3

Candidate B_5

Candidate B_4

Candidate B_7

Candidate B_6

Candidate A_1

Candidate A_3

Candidate A_4Candidate A_7 Candidate B_8

Candidate A_6 Candidate A_8

Candidate A_5

Voter

投票 Table

Page 65: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

シャーディングでの書き込み

Candidate A_2

Candidate B_1

Candidate B_2

Candidate B_3

Candidate B_5

Candidate B_4

Candidate B_7

Candidate B_6

Candidate A_1

Candidate A_3

Candidate A_4Candidate A_7 Candidate B_8

UpdateItem: “CandidateA_” + rand(0, 200)

ADD 1 to Votes

Candidate A_6 Candidate A_8

Candidate A_5

Voter

投票Table

Page 66: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

正確な投票

UserId Candidate Date

1 A 2013-10-02

2 B 2013-10-02

3 B 2013-10-02

4 A 2013-10-02

投票Table

Segment Votes

A_1 23

B_2 12

B_1 14

A_2 25

投票集計Table

Voter

1. 投票データの登録、重複排除 2. 投票データの集計

Page 67: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

正確な集計は?

UserId Candidate Date

1 A 2013-10-02

2 B 2013-10-02

3 B 2013-10-02

4 A 2013-10-02

投票Table

Segment Votes

A_1 23

B_2 12

B_1 14

A_2 25

投票集計Table

Voter

Page 68: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

DynamoDB Stream

In preview

Page 69: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

What is DynamoDB Stream?It is a stream of updates

Scales with your table

DynamoDB StreamDynamoDB

In preview

Page 70: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

• テーブルの更新の情報を保持

• 非同期に更新

• シリアライズされたデータ

• アイテム毎の厳密な管理

• 高耐久性

• テーブルよるスケール

• 有効期限は24時間

• 1秒未満の遅延書き込み

DynamoDB stream

Page 71: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

View Type Destination

Old Image – 更新前の情報 Name = John, Destination = Mars

New Image – 更新後の情報 Name = John, Destination = Pluto

Old and New Images Name = John, Destination = Mars

Name = John, Destination = Pluto

Keys Only Name = John

View types更新情報(Name = John, Destination = Mars)

⇒(Name = John, Destination = Pluto)

Page 72: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Stream

Table

Partition 1

Partition 2

Partition 3

Partition 4

Partition 5

テーブル

Shard 1

Shard 2

Shard 3

Shard 4

KCL

Worker

KCL

Worker

KCL

Worker

KCL

Worker

Amazon Kinesis Client

Library Application

DynamoDB

クライアントアプリケーション 更新

DynamoDB Stream and

Amazon Kinesis Client Library

Page 73: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

DynamoDB Stream

Open Source Cross-

Region Replication Library

Asia Pacific (Sydney) EU (Ireland) Replica

US East (N. Virginia)

クロスリージョンレプリケーション

Page 74: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

DynamoDB Stream and AWS Lambda

Page 75: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

AWS Lambda

• 特徴 (http://aws.amazon.com/jp/lambda/)

– OS、キャパシティ等インフラの管理不要

– S3、Kinesis、SNS等でのイベント発生を元にユーザが用意したコード(Node.js)を実行

– ユーザアプリからの同期/非同期呼び出し

• 価格体系 (http://aws.amazon.com/jp/lambda/pricing/)

– コード実行時間(100ms単位)

– Lambdaファンクションへのリクエスト回数

– 1月あたり100万リクエスト、400,000GB/秒が無料で利用可能

イベントをトリガーにコードを実行するコンピュートサービス

AWS LambdaAmazon S3 Bucket イベント

元画像 サムネイル画像1

2

3

AWS LambdaAmazon DynamoDB

Table and Stream

プッシュ通知

別テーブルを更新

■イメージのリサイズやサムネイルの作成

■値チェックや別テーブルへのコピー

Page 76: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Real-time voting architecture

投票集計Table

Amazon

Redshift Amazon EMR

Your Amazon Kinesis–

Enabled App

Voters 投票TableVoting app 投票DynamoDB

Stream

Page 77: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Real-time voting architecture

投票集計Table

Amazon

Redshift Amazon EMR

Your Kinesis-enabled

app

Voters 投票TableVoting app 投票DynamoDB

Stream

Page 78: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Real-time voting architecture

投票集計Table

Amazon

Redshift Amazon EMR

Your Kinesis-enabled

app

Voters 投票TableVoting app 投票DynamoDB

Stream

Page 79: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

Real-time voting architecture

投票集計Table

Amazon

Redshift Amazon EMR

Your Kinesis-enabled

app

Voters 投票TableVoting app 投票DynamoDB

Stream

投票者の統計、分析

Page 80: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

DynamoDBが使われているユースケース

• KVSとして– Webアプリケーションのセッションデータベース

– ユーザー情報の格納するデータベース

• 広告やゲームなどのユーザー行動履歴DBとして– ユーザーIDごとに複数の行動履歴を管理するためのデータベース

• ソーシャルアプリのバックエンドとして– モバイルアプリから直接参照できるデータベースとして

• 他にも– バッチ処理のロック管理

– フラッシュマーケティング

– ストレージのインデックス

Page 81: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

ユースケースに合わせてDB製品を選択

Elastic

Load

Balancing

ClientsEC2

Amazon

DynamoDB

Managed NoSQL

Amazon RDS

Managed SQL

Amazon ElastiCache

Managed in-memory caching

Amazon Redshift

Managed data

warehouse

BI tools

Page 82: [db tech showcase Tokyo 2015] A33:Amazon DynamoDB Deep Dive by アマゾン データ サービス ジャパン株式会社 森祐孝

ありがとうございました!