DynamoDB の基礎知識とまとめ


DynamoDBを大雑把にさくっと日本語で理解したい方向けの説明。
(まだ書き途中)

API Version 2012-08-10 を元に書いています。

## 印象と感想

* 管理が楽! 
 * 容量の増加を気にしなくていい!
 * スループットやパフォーマンスの監視、管理が楽!
* ソーシャルゲームでは、一部のデータではすごく良さそう
* 検索や集計は弱いから、MySQLと併用
* レイテンシが低いと書いてあるが、memcache の方が当然早い

* テーブル設計の理解と指定方法がちょっと面倒
* 料金体系の理解がちょっと面倒

## DynamoDBとは何か?

大雑把に

* NoSQL, スキーマレスなAWS上のデータベースサービス
* スケールに関して何も気にしなくていい

まずは、公式サイトを読むと概要はわかります。

[Amazon DynamoDB （フルマネージドNo SQLデータベースサービス） | アマゾン ウェブ サービス（AWS 日本語）](http://aws.amazon.com/jp/dynamodb/)

### どんなもの?

以下の初心者向けのスライドは、技術的なことも一番わかりやすかったです!

[Amazon DynamoDB（初心者向け 超速マスター編）JAWSUG大阪](http://www.slideshare.net/shimy_net/amazon-dynamodb-23315068)

## 理解に必要な基礎単語

* KVS, NoSQL, スキーマレス
* プライマリキー (PK, Primary Key)
* インデックス (index)
 * ハッシュ(HASH) と レンジ(RANGE)
* 型 (type), 属性の型 (Attribute Type)
 * スカラーデータ型 (Scalar data types)
    N,S,B  (Number, String, Binary)
 * マルチバリュー型 (Multi-valued types)
   Number Set, String Set, Binary Set
* ローカルセカンダリーインデックス (Local Secondary Indexes) 
 * 投影された (projected)  
   データ内容がインデックスに反映された的な意味で使われていると思う  
   設定では、次の3つから選ぶ KEYS_ONLY, INCLUDE, ALL
* プロビジョニングされた (Provisioned)
 * 「リソースが事前に用意されている」という意味
 * プロビジョニングは、「必要なリソースをすぐに使える体制」という意味
* プロビジョンドスループット (Provisioned Throughtput)
* Read Capacity Units, Write Capacity Units
* DynamoDB Local 
  DynamoDBのローカル環境

## 大まかな流れ

* 何にどのように使うのか?の方針決めや設計 (お試しの場合不要)
* テーブルの設計をする
 * プライマリキーの決定 (HASH か HASH + RANGE)
 * インデックスの決定 
* DynamoDB環境の構築
 * ローカル環境 (DynamoDB Local)をインストールするか
 * AWS Managemment Console で DynamoDBをセットアップするか
* テーブルを作る

## プライマリキー (PK)

ハッシュかハッシュ&レンジの2つの方法から選ぶべし

### ハッシュ型プライマリキー

HASH を一つのカラムで。
このキーだけで一意に決定して検索できるようにする

### ハッシュとレンジ型プライマリキー

HASH のキー & RANGE のキーの2つを使う
HASHとRANGEの2つのキーで一意にレコードを決定できるようにする
RANGE で範囲指定して検索できる 

## ローカル・セカンダリ・インデックス

クエリーのためのインデックスをオプションで追加できるようになった。

特徴は、下記サイトからの引用です。 

[おちラボ：教育システム研究開発BLOG: DynamoDB: ローカルセカンダリインデックスを使ってみた（DynamoDBMapper利用編）](http://ochi-lab.blogspot.jp/2013/04/dynamodb-dynamodbmapper.html)

>テーブル毎に最大5つのローカルセカンダリインデックスを作成可能
>あくまでも従来のレンジキーに対する代替 
>複数のローカルセカンダリインデックスを組み合わせた検索は不可
>従来のレンジキーとの組み合わせも不可
>紐付けるAttributeによってコストが増える？

どうやら、3つ以上の条件(Key Conditions)では検索できないようです。
HASHだけか、HASH & RANGE の2つの条件しかできないようです。

### LSIのメリット・デメリット

* メリット:
 * クエリーが早くなる
 * 多く取ってきてフィルターしなくて良い
* デメリット
  * インデックス用の容量が増える
  * 書き込み時のインデックスの更新コストがかかる

## テーブルの設計

### DBの大まかな構造

テーブルがあって、アイテムがある。
アイテムを探すのにプライマリキーがある。

### テーブルの作成

現状では、後からインデックスの追加ができません。

以下を指定してテーブルを作成する
(API経由でcreateTableする時)

* テーブル名 (TableName)
* 属性の設定 (AttributeDefinitions)
 * 属性名(AttributeName)と属性の型(AttributeType)

* キースキーマ (KeySchema)
* 属性名とキーの型 (KeyType: HASH か RANGE)
* ローカルセカンダリーインデックス (LocalSecondaryIndexes)
 * インデックス名


## ちなみに

* SSD で色々なリージョン、サーバに分散して保存
* phpLiteAdmin で DynamoDB のデータ操作ができる
* ハッシュキーで別々のサーバに保存するっぽいので、一つのハッシュキーに処理が集中すると遅くなる。ので、分散するように設計しよう
* 既存のLSI でない DynamoDB テーブルを LSI のテーブルにしたい時は、 Elastic Map Reduce を使って既存のデータをエクスポートしてから、新しいLSIなテーブルへインポートするといい (by Amazon CTO, Werner Vogels)
* SQL系DBのトランザクションのようなものはない
→ キューに突っ込む? AWSのSQSなど


* query の応答一つあたりのサイズ上限は1MB
* Item 64KBまで


## 参考URL

### 公式

公式の日本語FAQ
[Amazon DynamoDB FAQs | アマゾン ウェブ サービス（AWS 日本語）](http://aws.amazon.com/jp/dynamodb/faqs/#What_are_local_secondary_indexes?)

[Redshift の話を聞きに「AWSのビッグデータサービスを使いこなせ！」セミナーに行ってきた - #garagekidztweetz](http://d.hatena.ne.jp/garage-kid/20130716/awsbigdataseminaratmeguro)

公式なローカルセカンダリーインデックスの説明
[Amazon Web Services ブログ: 【AWS発表】 Amazon DynamoDB でローカルセカンダリインデックスを作成可能に](http://aws.typepad.com/aws_japan/2013/04/local-secondary-indexes-for-amazon-dynamodb.html)

### 利用事例

ソシャゲでの利用事例。SQSのキューで一貫性を担保する話
[DynamoDBによるソーシャルゲーム実装 How To](http://www.slideshare.net/itoyusaku/jawsug-201303)

### 感想

使った感想
[DynamoDBのメモ書き＋使ってみた雑感 - アルパカDiary](http://d.hatena.ne.jp/toritori0318/20120623/1340466684)

[DynamoDB と Redshift について - ようへいの日々精進](http://inokara.hateblo.jp/entry/2013/08/31/184953)

### すぐに理解

[Amazon DynamoDB（初心者向け 超速マスター編）JAWSUG大阪](http://www.slideshare.net/shimy_net/amazon-dynamodb-23315068)

## 検索用

AWS, DynamoDB, PK, primary key, local secondary index, provisioned throughtput,