DynamoDBとは
Amazon Web Services(AWS)が提供するフルマネージドのNoSQLデータベースサービスです。自動スケーリングと高可用性を提供し、パフォーマンスを維持しながら大規模なアプリケーションに対応できるよう設計されています。DynamoDBのアーキテクチャは手動でのパーティショニングやスケーリングの必要がなく、開発者にとってシームレスなエクスペリエンスを提供します。
DynamoDBの動作
1. リクエストの流れ
リクエストルーター: アプリケーションからのリクエストはまずリクエストルーターに到達します。
認証: ルーターがリクエストを認証します。
Auto Admin: DynamoDBはパーティションとメンテナンスを自動的に管理し、スケーラビリティとパフォーマンスを保証します。
データ書き込み: データはストレージノードに書き込まれ、B-treeに保存されます。各書き込みはレプリケーションログに記録されます。
ログ伝播: レプリケーションログの内容がセカンダリインデックスに反映され、効率的なデータ検索を可能にします。
2. 自動スケーリングとパーティショニング
DynamoDBは大規模なデータセットを処理するためにデータを自動的に複数のノードにパーティショニングします。これにより、データ量に関係なく高可用性とパフォーマンスが維持されます。オートスケーリング機能により、データベースへのトラフィックに応じて読み書きのキャパシティが調整され、コストとパフォーマンスが最適化されます。
DynamoDBとRDBMSの比較:主な制約
DynamoDBには従来のリレーショナルデータベース(RDBMS)に対する多くの利点がありますが、いくつかの制約も存在します。
テーブル間の結合ができない
理由: データがパーティションに分散されているため、RDBMSのようにテーブル間の結合が困難です。
対処方法: データの集約はアプリケーション側で行う必要があります。
外部キーがない
理由: DynamoDBはフレキシブルなスキーマを持ち、キーはパーティションキーとソートキーに限定されます。外部キー制約は使用できません。
対処方法: 関係性はアプリケーションロジックで管理する必要があります。
条件指定は基本的にプライマリキー以外は使用できない
理由: データが分散されているため、プライマリキー以外での検索には制約があります。
対処方法: プライマリキー以外の項目で検索する場合、セカンダリインデックスを作成する必要があります。
副問い合わせができない
理由: データの分散性により、副問い合わせが実行できません。
対処方法: フィルタリングや集約はアプリケーション側で実行します。
GROUP BYなどの集約関数が存在しない
理由: DynamoDBはデータを分散して保存しているため、サーバーサイドでの集約処理がサポートされていません。
対処方法: アプリケーション内で集計処理を行います。
OR、NOTなどの論理演算子がなくANDのみ
理由: クエリは効率的なデータ検索を重視しており、複雑な条件指定(例: OR, NOT)はサポートされていません。
対処方法: クエリのフィルタなどで代替します。
DynamoDBの特徴
- データフィルタリング
フィルタを使用して、クエリやスキャンの結果を特定の条件に絞り込むことが可能です。
2. TTL(Time to Live)
データの保存期間を設定し、自動的に期限切れのデータを削除する機能です。これにより、ストレージコストを削減し、データのクリーンアップを容易にします。
3. DAX(DynamoDB Accelerator)
読み取り専用のインメモリキャッシュを提供し、読み取りパフォーマンスを大幅に向上させます。
4. DynamoDB Streams
テーブル内のデータ変更(追加、更新、削除)をリアルタイムでキャプチャする機能です。これにより、変更を追跡したり、Lambda関数をトリガーするなどの応用が可能です。
5. トリガー
DynamoDB Streamsを使用してLambda関数をトリガーし、テーブルのデータ変更に自動的に反応することができます。
6. グローバルテーブル
複数のAWSリージョンにまたがるマルチリージョン、マルチマスターのデータベースを作成できます。これにより、世界中のユーザーに対して低レイテンシーでデータにアクセスできます。
DynamoDB Streamsの詳細
DynamoDB Streamsは、テーブルのリアルタイム変更をキャプチャするための強力な機能です。
ユースケース:
リアルタイム変更の検出
非同期データ処理
データの複製
書き込みオプション:
- KEYS_ONLY: 変更された項目のキー属性のみを保存します。
- NEW_IMAGE: 変更後の項目データ全体を保存します。
- OLD_IMAGE: 変更前の項目データ全体を保存します。
- NEW_AND_OLD_IMAGE: 変更前後の項目データ全体を保存し、項目の変更前後の状態を完全に比較できます。
データ保持と暗号化:
ストリームデータは暗号化され、最大24時間保存されます。
ストリームの構成:
ストリームはシャードと呼ばれる単位で構成され、各シャードにストリームレコードが含まれます。各レコードにはDynamoDBテーブルでの変更内容が記録されます。
DynamoDBの主なAPI操作
- Scan: テーブル全体またはインデックスの項目を取得
- PutItem: 項目を新規または更新して追加
- UpdateItem: 項目の一部の属性を更新
- DeleteItem: 項目を削除
- BatchWriteItem: 一度に最大25個の項目を一括で追加または削除
- TransactGetItems: 最大10個の項目を一度にトランザクションで取得
- TransactWriteItems: 最大100個の書き込みアクションをトランザクションで一括実行
- GetItem: プライマリキーを使用して単一の項目を取得
-
BatchGetItem: 最大100個の項目を一括で取得
Query: プライマリキーとソートキーに基づいて項目を検索
まとめ
DynamoDBは、スケーラブルでフルマネージドなNoSQLデータベースで、リアルタイムデータ処理やグローバル展開などさまざまなユースケースに対応しています。従来のリレーショナルデータベースと比較していくつかの制約はありますが、スケーラビリティ、パフォーマンス、柔軟性の点で現代のアプリケーションにとって理想的な選択肢となり得ます。
DynamoDBのアーキテクチャ、機能、および制約を理解することで、その能力を最大限に活用し、アプリケーションのニーズに適応するデータモデルを設計・実装できます。
【参考】