AWS DynamoDB(1)DynamoDBの概要

DynamoDBとは

DynamoDBは高速かつフレキシブルな、完全マネージド型のNoSQLデータベース。データはKey, Value型で保存される。高速なレスポンススケーラビリティドキュメントデータモデル(JSON)をサポートしていることなどが特徴的。同一リージョン内の3つの設備で同期レプリケーションされるため障害にも強い。

管理不要で信頼性が高い

  • 単一障害点が存在しない構造
  • 同一リージョン内の3つの設備にデータが保存される
    • 設定と構成、レプリケーション、ソフトウェアのパッチ適用などが不要
  • ストレージの自動パーティショニング

プロビジョンドスループット

  • Read/Writeの速度を指定できる
    • ダウンタイムやパフォーマンスの低下が生じない

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ストリームは、変更前のイメージと変更後のイメージの両方を含むことができるため、これらを比較することで変更の差分を取得することができる。