🦁

2. Amazon DynamoDB

2023/07/18に公開

概要

https://d1.awsstatic.com/webinars/jp/pdf/services/20170809_AWS-BlackBelt-DynamoDB.pdf

https://dev.classmethod.jp/articles/re-introduction-2020-amazon-dynamodb/

https://dev.classmethod.jp/articles/dynamodb-chottowakaru/

ポイント

プライマリキー

データを一意に識別するためのキーで、「パーティションキー」または「パーティションキーとソートキーの複合キー」のこと

  • Partation Key
  • Partation Key + Sort Key

Partation Key

データをどのパーティションに配置するか決定する。
各パーティションへのアクセスがなるべく均一になるようパーティションキーを設計すると良い

Sort Key

ソートキーによってデータはパーティション内で並べ替えられて物理的に近くなるように配置される
QueryAPIではソートキーを指定して取り出すデータの範囲をフィルタ可能
ソートキーの設定は任意

キャパシティユニット

読み込み・書き込み処理が発生した際に使用されるものの
GSI は独自のものを持ち、LSI はベースのテーブルとキャパシティユニットを共有している

オンデマンドモードとプロビジョニングモードがある
※モードは切り替え可能
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/HowItWorks.ReadWriteCapacityMode.html

Read Capacity Units (RCU)

Write Capacity Units (WCU)

オンデマンドモード

従量課金制(使用した分のみの課金)
新しくテーブルを作る際や、アプリケーションのトラフィックが予測できない場合に使用が勧められる

使用されるキャパシティユニットの詳細

読み込み

  • 4 KB 以下の項目の強力な整合性のある読み込みリクエストには、1 つの読み込みリクエストユニット
  • 4 KB 以下の項目の結果整合性のある読み込みリクエストには、2 分の 1 の読み込みリクエストユニット
  • 4 KB 以下の項目のトランザクション読み込みリクエストには、2 つの読み込みリクエストユニット

書き込み

最大サイズが 1 KB の項目について 1 回の書き込みを表す。
※1 KB より大きい項目を書き込む必要がある場合、追加の書き込みリクエストユニットを消費する
トランザクション書き込みリクエストでは、1 KB までの項目を 1 回書き込むのに書き込みリクエストユニットが 2 個必要

プロビジョニングモード

事前に 1 秒あたりの読み込みと書き込みの回数を指定する
使用され方が予測出来る場合に推奨
※Auto Scaling を使用することでトラフィックの変更に応じて自動調整可能

使用されるキャパシティユニットの詳細

読み込み

1 つの読み込み容量単位は、最大サイズ 4 KB の項目について、1 秒あたり 1 回の強力な整合性のある読み込み、あるいは 1 秒あたり 2 回の結果整合性のある読み込みを表す。
トランザクション読み込みリクエストでは、4 KB までの項目を 1 秒あたりに 1 回読み込むのに読み込み容量単位が 2 個必要。4 KB より大きい項目を読み込む必要がある場合、DynamoDB は追加の読み込み容量単位を消費する必要があります。

例:
項目のサイズが 8 KB の場合、1 秒あたり 1 回の強力な整合性のある読み込みを維持するには読み込みキャパシティーユニットが 2 個、結果整合性のある読み込みを選択した場合は読み込みキャパシティーユニットが 1 個、またはトランザクション読み込みリクエストには読み込みキャパシティーユニットが 4 個必要

書き込み

最大サイズが 1 KB の項目について 1 回の書き込みを表す。
※1 KB より大きい項目を書き込む必要がある場合、追加の書き込みリクエストユニットを消費する
トランザクション書き込みリクエストでは、1 KB までの項目を 1 回書き込むのに書き込みリクエストユニットが 2 個必要

セカンダリインデックス

Local Secondary Index (LSI)

ベースのテーブル上でパーテーションキーは同じもののままで異なるソートキーのテーブルを作成する仕組み
保持する情報も選択可能
テーブル作成時のみ作成可能

Global Secondary Index (GSI)

ベースのテーブル上で異なるパーティションキー・ソートキーのテーブルを作成する仕組み
保持する情報も選択可能
キャパシティユニットも GSI 用に確保

LSI vs GSI

GSI LSI
新しく設定するキー パーティションキー、ソートキー(任意) ソートキー
キーの重複
インデックス数の上限 5 5
項目コレクションのサイズ制限 なし 10GB以下
テーブル作成後の追加 不可
読み込み整合性 結果整合性 結果整合性、強い整合性
キャパシティユニットの消費 GSIから消費 ベーステーブルから消費

オペレーション

Read Consistency(強い一貫性を持った参照=強力な整合性のある読み込み)

読み込みで必ず最新のデータが表示される(読み込みできる)ことを保証する読み込み方法

デフォルトでは「結果整合性のある読み込み(Eventually Consistent Reads)」
 →最新のデータを取得しているわけではないがリロードを行った場合最新のデータが表示される状態=結果整合性

※GSIでは使えない
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/HowItWorks.ReadConsistency.html

TTL

https://dev.classmethod.jp/articles/try-dynamodb-ttl/

Number型のUnixtime(ミリ秒無し)をTTLとして指定することで現在時刻と比較し、過去のものになったものを期限切れとし、その後削除する機能

DynamoDB Streams

直近24時間の追加、変更、削除の変更履歴を保持する機能
Lambdaを実行することが可能
https://dev.classmethod.jp/articles/dynamodb-streams-cooperates-with-lambda/

リザーブドキャパシティ

前払いすることで標準テーブルクラスの場合割引を受けられるもの
※書き込み、読み込み両方が対象

注意点:

  • レプリケーションされた書き込みキャパシティユニットでは使用できない
  • 購入したリージョン限定
  • 標準-IAテーブルクラスやオンデマンドモードでは使用できない

Auto Scaling

ベーステーブルと GSI のスループット容量を自動管理する
※コンソール上から GSI を作成するとデフォルトで有効になる
読み込みおよび書き込みのキャパシティーユニットの範囲 (上限と下限) と、その範囲内での目標使用率を定義し、アプリケーションのワークロードが増減しても、ターゲットの使用率が維持されるようにする

グローバルテーブル

データベースをマルチリージョンにレプリケーションする機能
https://dev.classmethod.jp/articles/dynamodb-streams-cooperates-with-lambda/

バックアップ

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/BackupRestore.html
以下3種類の方法あり

  • AWS Backup
  • DynamoDB - オンデマンド
  • DynamoDB - ポイントインタイムリカバリ

AWS Backup

https://dev.classmethod.jp/articles/aws-backup-dynamodb/
従来からある「オンデマンドバックアップと復元」が実行される

※以下設定は復元対象外

  • Auto scaling policies
  • IAM policies
  • Cloudwatch metrics and alarms
  • Tags
  • Stream settings
  • Time to Live (TTL) settings

DynamoDB - オンデマンド

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/backuprestore_HowItWorks.html
テーブルの完全なバックアップを作成して、規制コンプライアンスの要件を満たすために長期間の保存とアーカイブを行うことができる

DynamoDB - ポイントインタイムリカバリ

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/PointInTimeRecovery.html

過去 35 日間の任意の時点にテーブルを復元することができる

DynamoDB Accelerator

DynamoDB で使用できるキャッシュサービス
以下が使用用途(マイクロ秒の応答時間が必要な場合)

  • インメモリキャッシュとしての DAX は、1 桁台のミリ秒単位からマイクロ秒単位まで、結果整合性のある読み込みワークロードの応答時間を短縮する
  • DAX は、DynamoDB と API の互換性のあるマネージドサービスを提供することにより、オペレーションとアプリケーションの複雑さを軽減します。したがって、既存のアプリケーションで使用するために必要なのは最小限の機能変更だけとなる
  • 読み込みの多いワークロードや急激に増大するワークロードにおいて、DAX はスループットを強化することや、読み込み容量ユニットを必要以上にプロビジョニングしないようにすることで運用コストの節約を可能にします。個々のキーで繰り返し読み込みが必要なアプリケーションにおいては特にメリットがある

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/HowItWorks.ReadWriteCapacityMode.html

Discussion