DynamoDBとは
DynamoDBは高速かつフレキシブルな、完全マネージド型のNoSQLデータベース。データはKey, Value型で保存される。高速なレスポンス 、スケーラビリティ 、ドキュメントデータモデル (JSON)をサポートしていることなどが特徴的。同一リージョン内の3つの設備で同期レプリケーションされるため障害にも強い。
管理不要で信頼性が高い
単一障害点が存在しない構造
同一リージョン内の3つの設備にデータが保存 される
設定と構成、レプリケーション 、ソフトウェアのパッチ適用などが不要
ストレージの自動パーティショニング
プロビジョンドスループット
1キャパシティユニットは、最大4KBの読み込み項目 に対して、1秒あたり1回の強力な整合性のある読み込み 、もしくは1秒あたり2回の結果整合性のある読み込み 、最大1KBの書き込み項目 に対して、1秒あたり1回の書き込み を表す単位。読み込みや書き込みのリクエストがプロビジョニングしたスループットを超えた場合は、HTTP 400 コード (Bad Request ) : ProvisionedThroughputExceededException のエラーレスポンスが返る。DynamoDB Auto Scaling を用いることで、キャパシティを自動的に変更することが可能であるが、バーストトラフィックには対応できない ので注意が必要である。
2018年からプロビジョニングモードに加えて、前に到達したトラフィックレベルまで拡張または縮小(前のピークトラフィックの最大 2 倍まで瞬時に対応 )して、ワークロードを即座に受け入れることができるオンデマンドモード を指定することが可能となった。プロビジョニングモードとオンデマンドモードは、24時間に1回 切り替えることができる。プロビジョニングモードからオンデマンドモードに切り替えた場合、プロビジョニングされたキャパシティーが維持される ため、大量のトラフィックが予想される場合は、プロビジョニングモードで想定されるキャパシティを設定しておき、その後オンデマンドモードに切り替える と良い。
その他の特徴
容量制限が存在しない
結果整合性
書き込みに関しては、2箇所への書き込みが完了した時点でACK
読み込みに関しては、最新の結果が反映されていない可能性がある
複数のクライアントが同時にアクセスし値を更新するようなシナリオの場合は、「現在この値であれば値を更新する」といったような条件付き書き込み を行うことで、想定外のデータ上書きを防止することが可能である。
料金
指定したスループットによる時間課金
保存データ量による課金
DynamoDBへのアクセスにはHTTPおよびHTTPSが用いられる。HTTP/HTTPSによる通信はオーバヘッドが大きい ため、ゲームアプリ等の早い応答速度が求められるサービスでは、DyamoDBではなくRDSなど他のデータベースを選択することが多い。シリアライズフォーマットとしては、JSON形式が使用される。
データモデル
DynamoDBのテーブルは複数のItemから構成され、Item内には、KeyValue型のデータ(Attributes) が格納されている。各Itemに格納されているAttributesの数は不ぞろいでも良く(スキーマレス )、あるアイテムにはuser-id, name, e-mail, ageの4つのAttributesが、別のItemにはuser-idのみが格納されているとことも可能である。格納するAttributesのうち1つにPartitionKey を指定する。PartitionKeyはプライマリーキーとして利用でき、ハッシュインデックスを構築されるときのキーとなる。この場合同じ項目を持つPartitionKeyは持つことができない 。また、SortKey を指定することもでき、この場合はPartitionKey + SortKeyでプライマリーキー となる。
DynamoDBは、数値や文字列、バイナリ(圧縮ファイルや画像)などのスカラー型 、これらのスカラー型をセットにしたセット型 、リストやマップ(JSON )などのドキュメント型 の3つの形式をサポートしている。格納することのできる値の範囲や制限事項などは、DynamoDB での制限 – Amazon DynamoDB を参照のこと。文字列や多値データセット型は空白や空白セットはサポートされていない 。スカラー型の場合、NULL値を格納することは可能 である。ドキュメント型を用いることで入れ子構造のデータを保存することも可能 である。
DynamoDBには予約語が存在 し、予約語を属性名として定義する式を実行することはできない。予約語と競合する属性名を式の中で使用したい場合には、代替の属性名を定義する などし使用する。
パーティショニング
DynamoDBは、スループット性能を維持するためテーブルをパーティショニングする。PartitionKeyが同じでSortKeyが異なる項目は、SortKeyによって並べ替えられて物理的に近いところに配置 される。パーティション間のデータ分散にはPartitionKeyを用いられ、またスループットは各パーティションに均等に配分されるために、特定のPartitionKeyにアクセスが偏ると性能が出ない場合がある 。
セカンダリインデックス(Secondary Index)
セカンダリインデックスは、SortKey以外に使用することのできる絞込み検索用のAttributes である。ローカルセカンダリインデックス (local Secondary Index)はSortKeyの代替となる検索用インデックスで、同一PartitionKeyのItem検索に利用できる。グローバルセカンダリインデックス (Glocal Secondary Index)は、PartitionKeyの代替となる検索用インデックスで、異なるPartitionKeyのItem検索にも利用できる。セカンダリインデックスは便利ではあるが、追加のスループットやストレージを必要とするためRDSで代替できないか検討すべきである。
テーブルあたり20個 のグローバルセカンダリインデックスと5つ のローカルセカンダリインデックスを定義することができる。
項目の操作
DynamoDB は、作成、読み込み、更新、削除 (CRUD) の 4 つの基本的なオペレーション機能を提供する。また、以下に加えて、複数のGet/Put処理を1回の呼び出しで行うBatchGetItem /BatchWriteItem という関数も用意されている。
PutItem – 項目の作成
UpdateItem – 項目の更新
GetItem – 項目の読み取り
Query – 特定のPartitionKeyがある全ての項目の読み取り
Scan – 指定されたテーブルまたはインデックスの全ての項目の読み取り
DeleteItem – 項目の削除
また、Time to Live(TTL)を用いてテーブルの項目の有効期限を設定することが可能 で、データベースから項目を自動的に削除することができる。指定する時刻はUnixtimeで、DynamoDBはこの期限から48時間以内に項目を削除 する。有効期限すぐに削除されるとは限らないために、これを考慮したアプリケーション実装とすることが必要。
DynamoDB ストリーム
DynamoDBストリームは、DynamoDBテーブルのデータ変更イベントをキャプチャする。ストリームには24時間の有効期限 があり、Lambdaや等を用いてこれらのストリームデータの処理を行うことができる。
DynamoDBストリームは、変更前のイメージと変更後のイメージの両方を含むことができる ため、これらを比較することで変更の差分を取得することができる。