AWS DynamoDB(1)DynamoDBの概要

DynamoDBとは

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

管理不要で信頼性が高い

  • 単一障害点が存在しない構造
  • 同一リージョン内の3つの設備にデータが保存される
  • ストレージの自動パーティショニング

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

  • Read/Writeの速度を指定できる
  • ただし、スケールダウンに関しては1日9回までの制限あり

1キャパシティユニットは、最大4KBの読み込み項目に対して、1秒あたり1回の強力な整合性のある読み込み、もしくは1秒あたり2回の結果整合性のある読み込み最大1KBの書き込み項目に対して、1秒あたり1回の書き込みを表す単位。読み込みや書き込みのリクエストがプロビジョニングしたスループットを超えた場合は、** HTTP 400 コード (Bad Request) : ProvisionedThroughputExceededExceptionのエラーレスポンスが返る。DynamoDB Auto Scaling**を用いることで、キャパシティを自動的に変更することが可能であるが、バーストトラフィックには対応できないので注意が必要である。

その他の特徴

  • 容量制限が存在しない
  • 結果整合性
    • 書き込みに関しては、2箇所への書き込みが完了した時点でACK
    • 読み込みに関しては、最新の結果が反映されていない可能性がある

複数のクライアントが同時にアクセスし値を更新するようなシナリオの場合は、「現在この値であれば値を更新する」といったような条件付き書き込みを行うことで、想定外のデータ上書きを防止することが可能である。

!(条件付き書き込み)[https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/images/update-yes-condition.png]

料金

  • 指定したスループットによる時間課金
  • 保存データ量による課金

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はプライマリーキーとして利用でき、ハッシュインデックスを構築されるときのキーとなる。また、SortKeyを指定することもでき、この場合はPartitionKey + SortKeyでプライマリーキーとなる。

DynamoDBは、スカラー型、文字セット、バイナリ(圧縮ファイルや画像)などの多値型、リストやマップ(JSON)などのドキュメント型の3つの形式をサポートしている。格納することのできる値の範囲や制限事項などは、DynamoDB での制限 – Amazon DynamoDBを参照のこと。文字列や多値データセット型は空白や空白セットはサポートされていない。スカラー型の場合、NULL値を格納することは可能である。

パーティショニング

DynamoDBは、スループット性能を維持するためテーブルをパーティショニングする。パーティション間のデータ分散にはPartitionKeyを用いられ、またスループットは各パーティションに均等に配分されるために、特定のPartitionKeyにアクセスが偏ると性能が出ない場合がある

セカンダリインデックス(Secondary Index)

セカンダリインデックスは、SortKey以外に使用することのできる絞込み検索用のAttributesである。ローカルセカンダリインデックス(local Secondary Index)はSortKeyの代替となる検索用インデックスで、同一PartitionKeyのItem検索に利用できる。グローバルセカンダリインデックス(Glocal Secondary Index)は、PartitionKeyの代替となる検索用インデックスで、異なるPartitionKeyのItem検索にも利用できる。セカンダリインデックスは便利ではあるが、追加のスループットやストレージを必要とするためRDSで代替できないか検討すべきである。

テーブルあたり4つのグローバルセカンダリインデックスと5つのローカルセカンダリインデックスを定義することができる。

項目の操作

DynamoDB は、作成、読み込み、更新、削除 (CRUD) の 4 つの基本的なオペレーション機能を提供する。

  • PutItem – 項目の作成
  • GetItem – 項目の読み取り
  • UpdateItem – 項目の更新
  • DeleteItem – 項目の削除

また、Time to Live(TTL)を用いてテーブルの項目の有効期限を設定することが可能で、データベースから項目を自動的に削除することができる。指定する時刻はUnixtimeで、DynamoDBはこの期限から48時間以内に項目を削除する。有効期限すぐに削除されるとは限らないために、これを考慮したアプリケーション実装とすることが必要。

DynamoDB ストリーム

DynamoDBストリームは、DynamoDBテーブルのデータ変更イベントをキャプチャする。ストリームには24時間の有効期限があり、Lambdaや等を用いてこれらのストリームデータの処理を行うことができる。