AWS DynamoDBの用語要点まとめ（自分用メモ

Amazon DynamoDB
AWSが提供するデータベースサービスの一つ。Key-Value型のNoSQLデータベース。容量が無制限のためデータ収集や大容量の蓄積に使用。

「NoSQL」は多くの場合、SQLを使用する「リレーショナルデータベース（RDB）」に属さないデータベース、といった意味で使われます。

●データ構造
DynamoDBでは、Key-Value型という「保存するデータ（Value）」とそれを特定するための「キー（Key）」がペアになっている形式のデータを扱います。

新たにアイテムが追加された場合や追加されたアイテムを初めて保有する際にも、既存のデータ構造に変更を加えることなく新しい項目を追加することができます。

Key-Value型で構成された項目の塊をテーブルと呼びます。ある表AとBのデータを結合して結果を得たり分析するような利用方法よりも、単一のデータを格納・取得するというシンプルな利用に向いています。シンプルな構造であるためパフォーマンスは非常に高く、ピーク時には秒間2000万件のリクエストに対応します。更にストレージの容量制限もありませんので拡張性にも優れています。
さらに、DynamoDBは「スキーマレス」のデータベースなので、スキーマの更新に柔軟に対応できます。
スキーマとはデータベースの構造のことです。新たなデータ項目を追加する場合、通常はスキーマの変更と既存の格納済みデータへのスキーマ変更に対応する修正を行う必要がありますが、スキーマレスのデータベースではスキーマが存在しないので変更作業自体が不要になります。
また、DynamoDBでは、テーブル内のデータに高速にアクセスできるように様々なインデックスを作成することができます。インデックスを効果的に作成することでスループットを向上させることができ、コストダウンの効果も期待できます

●高可用性
・3つのAZにデータを分散して保存
DynamoDBでは、単一障害点（SPOF: Single Point Of Failure：ある箇所が故障すると、システム全体が機能不全になる箇所）を持たず、高い信頼性を誇ります。
また、データは3つのAZに自動的に保存されますので、耐障害性にも優れています。
各AZのデータはパーティションという単位で分散して保存されます。パーティション分割によって一か所にデータを集中させないようにすることで、プロビジョニング（予約）されたスループットを保てるようにしています。なお、パーティション分割はAWSによって自動的に行われるので、ユーザーが通常意識することはありません。

・バックアップ
DynamoDBには2つのバックアップ方法があります。
「オンデマンドバックアップ」は、ユーザーが任意のタイミングで作成するバックアップのことです。マネジメントコンソールまたはAPIを利用して、テーブルの完全なバックアップを作成します。
自動的にバックアップを行いたい場合は「ポイントインタイムリカバリ（PITR）」を有効にします。オンデマンドバックアップとは違い、差分バックアップが定期的に自動で取得されます。リカバリ時は、35日前まで遡ることができます。

●キャパシティ
DynamoDBでは、テーブルに対する書き込み・読み込みの量と利用料金が関係しています。
・オンデマンドモード ... 書き込み・読み込みのリクエスト単位で利用料金がかかる
・プロビジョニングモード ... 1秒間に行う書き込み・読み込みの量で利用料金が異なる

プロビジョニングモードの書き込み・読み込みは、「キャパシティユニット」という単位で管理されています。これは1秒間にどれだけ読み込み・書き込みを行うかを予約する設定で、容量が大きいほど料金がかかります。
キャパシティユニットは、テーブル作成時にはWCU、RCUともに 5 に設定されています。キャパシティユニットの変更はいつでも行うことができます。
また、データアクセスの負荷に応じてキャパシティユニットを自動的にスケール（増減）することもできます。常に高いパフォーマンスを維持しておく必要がないため、コストを抑えたい場合に有用です。

大規模に利用する場合は「リザーブドキャパシティ」を用いることもできます。
リザーブドキャパシティはWCU、RCUともに100ユニット単位で1年または3年の期間で予約購入するサービスです。通常のプロビジョニングモードよりも割安に利用できます。


・キャパシティユニットとパーティション
パーティションの数やサイズは、キャパシティユニットの値をもとにAWSが算出します。パーティション分割はプロビジョニングされたスループットを保つための仕組みですから、キャパシティユニットの値を大きくする（＝1秒間の処理件数を増やす）とパーティションの分割数を少なくすることができます。
パーティション数を少なくすることは、スループットの面で大いに利点があります。1パーティションあたりのスループットはWCUまたはRCUをパーティション数で割った値が設定されますので、例えば以下のような値になります：
　例）パーティション数:2、WCU:10 の場合、1パーティションあたりのWCUは 5
パーティション数が多いと1パーティションあたりのスループットが小さくなってしまいます。これは例えば、特定のパーティションに処理が集中してしまった場合にWCU:5を満たせずエラーになる、という結果になります。このような事象を防ぐため、キャパシティユニットは適切な値に設定しておく必要があります。

●データ参照時の一貫性
アプリケーションが書き込みを行った場合、3つのAZのテーブルのうち2つのテーブルに書き込みができた時点で完了とみなされます。残りの1つには後からレプリケートされます。このレプリケートされるまでの間は、書き込みが行われた後の結果と書き込みが行われる前の結果が混在することになります。このとき、レプリケートが完了していないテーブルに対して読み込みが発生すると、古いデータを読み出してしまう可能性があります。
DynamoDBでは以下の2つの読み込みモードをサポートしています。
○結果整合性のある読み込み（デフォルト）
　一時的には読み込んだデータが最新ではないタイミングが発生する可能性はあるが、最終的には読み出すデータは最新のものとなる（書き込みから少し時間をおくことで回避できる）。
○強力な整合性のある読み込み
　必ず最新のデータを取り出すことができる。ただし読み込み時のコストが2倍になる、レイテンシが高くなる可能性がある、などの条件がつく。

●自動スケール
データ容量が増えた場合でも、DynamoDBは自動的にスケールアウト（拡張）されます。データベース用ノードの追加やディスクを増やすといった作業がないため、ダウンタイム（サービスを停止する時間）がなくサービスを提供し続けることができます。

●更新ログ保存機能（DynamoDB Streams）
DynamoDB Streams（ストリーム）とは、テーブルに対して行われた直近の24時間の変更（追加や更新、削除）をログに保存する機能です。ストリームを参照することによって、いつ誰がどのようにテーブルを更新したかがわかります。
ログには、アプリケーションがリアルタイムにアクセスできるため、変更内容に応じて処理を組み込むことができます。例えば、ログを監視し問題のある処理があった場合はアラートを上げさせたり、プロフィール画像を更新（追加）したらフレンドに通知させるというような運用が可能です。

【DynamoDB Accelerator（DAX）】
DynamoDB Accelerator（DAX）は、DynamoDBのインメモリのキャッシュクラスタです。
DAXを利用することにより、ミリ秒（千分の一秒）だったレスポンスをマイクロ秒（百万分の一秒）レベルのパフォーマンスにまで向上させることができます。
またキャッシュであるDAXからデータを取得することができればDynamoDBへアクセスする回数も削減されるため、RCUを抑えることもできます。