【AWS】DynamoDBとは??基本を解説します!!
こんにちは!横浜事業所のSHOGOです!
AWSには便利なサービスが多いですよね!
でも、「サービスが多すぎて違いが分かりません…!」という方もいるのではないでしょうか?
データベースもそのうちの1つだと思います。
ということで、DynamoDBの基本について
・フルマネージドサービス
・NoSQLデータベース
・高いパフォーマンスとスケーラビリティ
・高い可用性と耐久性
の4つの観点から解説していこうと思います!
フルマネージドサービス
DynamoDBはフルマネージドサービスです!
フルマネージドサービスではサーバーの運用・保守などの煩雑な作業をAWSなどのプロバイダ※1に委託することができます!
※1:サービスを提供する事業者
「メリット」
・組織の生産性を高めることができる
今まで運用・保守などに充てていた時間をコア業務に回すことができるので、組織の生産性を高めることができます!
・人材を確保したり、教育したりする必要がない
運用・保守などの専門技術が必要な部分を委託することができるので、それらにアプローチできる人材を確保したり、自社の人材を教育したりする必要がなくなります!
「デメリット」
・自社が希望するサービスを完全には実現できない場合がある
プロバイダによって提供しているサービスの内容や種類が違います。
例えば、次のようなケースがあります!
ケース:
A社は高いパフォーマンスとスケーラビリティの両方に優れたサーバーを利用したいと考えています。
しかし、プロバイダのB社には高いスケーラビリティに優れたサーバーの提供はありません。
上記のようなケースの場合はスケーラビリティについては妥協したり、プロバイダを変えたりする必要があります。
このように、自社が希望するサービスを完全には実現できない場合があります!
・プロバイダへの依存度が高くなる
メリットで「人材を確保したり、教育したりする必要がない」というのを挙げましたが、これはデメリットにもつながることがあります。
例えば、運用・保守などのノウハウが蓄積しないので、技術面などに関してプロバイダへの依存度が高くなってしまいます。
依存度が高くなることによって他のサービスへの移行などが難しくなってしまう場合があります!
・コストが増加する場合がある
プロバイダに委託する幅が広くなるにつれてコストが増加する場合があります。
そのため、事前にコストの見積もりをすることが大切になります!
【補足】
DynamoDBには従量課金制やライセンス料金の支払いが不要という特徴があります!
このように、フルマネージドサービスでもコストの削減につながる場合があります!
フルマネージドサービスについて理解していただけましたでしょうか?
自社の状況や中長期的な視点を踏まえて利用していくようにしましょう!
NoSQLデータベース
データベースはリレーショナルデータベースと非リレーショナルデータベースの2つに分けることができます!
ちなみに、NoSQLデータベースと非リレーショナルデータベースは同じ意味を表すので、以下からはNoSQLデータベースとして進めていきます。
NoSQLデータベースには様々な種類がありますが、DynamoDBもそれらのうちの1つです。
リレーショナルデータベースと比較して違いを見ていきましょう!
リレーショナルデータベース
「メリット」
・SQLによる高度な操作
SQLとはリレーショナルデータベースを操作するための言語です。
SQLによってCRUD※2などの基本的な操作から、テーブル結合などの複雑な操作まで可能になります!
※2:作成(Create)と読み出し(Read)、更新(Update)、削除(Delete)をそれぞれ頭文字で表したもの
・トランザクションによるデータの一貫性
トランザクションとは複数の処理をひとまとまりにすることで完了を保証する仕組みのことを指します!
少し難しいので、次のようなケースで考えてみましょう。
ケース:
AさんはBさんに5万円を振り込むためにATMで手続きを行いました。
Aさんの預金残高から5万円を減らす処理は成功しましたが、Bさんの預金残高に5万円を増やす処理でエラーが発生してしまいました。
上記のケースでトランザクションがない場合はAさんの預金残高から5万円が減らされたままになってしまいます!
振り込みが成功していないのにお金だけ無くなってしまうのは困りますよね。
そのようなことが起きないようにするために、もし途中で処理が失敗した場合は処理を行う前の形にデータを戻してくれるのがトランザクションです!
これによってデータの一貫性が保証されます!
「デメリット」
・大規模なデータを扱う場合の処理速度の低下
データが大規模になると処理速度が低下する場合があります。
そのため、効率よく操作できるSQLを選択する必要があります!
例えば、データを全件削除する場合はDROP文とTRUNCATE文の2つが使えますが、効率の観点ではTRUNCATE文の方が優れています。
・拡張が難しい
リレーショナルデータベースは分散処理※3が苦手です。
そのため、複数のサーバーに拡張する場合は高度な専門知識や時間、コストがかかる場合があります!
※3:1つの処理を複数のサーバーで分散して行う方式
【補足】
分散リレーショナルデータベースという分散処理に対応しているサービスも存在します!
参考:
https://knowledge.sakura.ad.jp/29695/#_NewSQL
・半構造化データや非構造化データを扱うことができない
リレーショナルデータベースはExcelやCSVのような表形式の構造化データを扱います。
そのため、画像や動画、ドキュメントのような半構造化データや非構造化データを扱うことはできません!
NoSQLデータベース
「種類」
・キーバリューデータベース(DynamoDBでサポート)
データを識別する一意のキーとバリュー(値)で構成されます。
構造がシンプルなのでスケーラビリティと高速処理に優れています!
・インメモリデータベース
データをディスクではなくデータストレージ用のメモリに保存します。
ディスクにアクセスする必要が減るので高速処理に優れています!
・ワイドカラムストアデータベース
キーバリューデータベースにカラム(列)が追加されたもので、キーごとに任意のカラムを追加できます。
全てのカラムにバリューが入っている必要はありませんし、柔軟性と列の集計などの高速処理に優れています!
・グラフデータベース
ノード(データの実体)やエッジ(ノード同士の関係性)、プロパティ(ノードやエッジの属性情報)によって構成されます。
データ同士の関係性を容易に構築できるので高速処理に優れています!
・時系列データベース
気温データや株価データなどの時間情報(タイムスタンプ)を持ったバリューを扱います。
リアルタイム分析やグループ集計などの高速処理に優れています!
・ドキュメントデータベース(DynamoDBでサポート)
ドキュメント形式のデータをそのまま保存することができます。
柔軟性と高速処理に優れています!
・台帳データベース
不正操作の回避や改ざん防止機能を提供するので、データの正当性の保証に優れています!
【補足】
種類については以下のサイトに詳しく載っています!
参考:
https://www.softbank.jp/biz/blog/cloud-technology/articles/202207/cloud-nosql-comparison/
「メリット」
・柔軟性に優れている
NoSQLデータベースは半構造化データや非構造化データを扱います。
そのため、データを保存する際の抽出や変換作業を減らすことができ、開発スピードの向上に繋がります!
・スケーラビリティに優れている
分散処理が得意なのでスケールアウトすることが容易なため、大量のデータを効率良く扱うことが可能です!
・高速処理に優れている
柔軟性やスケーラビリティが優れているので大規模なデータでも高速に処理することが可能です!
【補足】
メリットは全てのNoSQLデータベースで共通ではありません!
利用をする前にどのメリットが当てはまるかを確認しましょう!
「デメリット」
・データの一貫性が保証されない場合がある
分散処理の実現と引き換えにデータの一貫性が保証されない場合があります。
そのため、データの更新などが頻繁に発生するケースでは注意が必要です!
・複雑な検索処理ができない場合が多い
基本的にNoSQLデータベースはSQLを使用しません。
そのため、テーブル結合のような複雑な検索処理ができない場合が多いです!
【補足】
デメリットも全てのNoSQLデータベースで共通ではありません。
例えば、データの一貫性の保証についてはDynamoDB、SQLを使用した複雑な検索処理についてはTimestreamなどがサポートしています。
参考:
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/transactions.html
https://dev.classmethod.jp/articles/timestream-support-cross-table-queries-and-so-on/
それぞれメリットなどに違いがあることが分かりますね。
自分が実現させたい機能によって使い分けるようにしましょう!
高いパフォーマンスとスケーラビリティ
DynamoDBは自動パーティショニング※4による分散処理によって、デフォルトでも安定した1桁ミリ秒のパフォーマンスが可能になっています!
さらに+αで下記の機能もあります。
※4:データの種類や利用目的に応じて、テーブルを分けてデータを保持する機能
DynamoDB Accelerator(DAX)
フルマネージドのインメモリキャッシュ※5を使用することによって、テーブルからの読み取りパフォーマンスに対してマイクロ秒のレイテンシー※6を実現することができます。
※5:キャッシュをメモリに保持すること
※6:通信の遅延時間
キャパシティモード
DynamoDBにはオンデマンドモードとプロビジョニングモードがあります。
また、プロビジョニングモードではAuto Scalingという機能が使用でき、トラフィック※7の変更に応じてキャパシティ※8を自動的に調整してくれます!
※7:一定時間内にネットワーク上で転送されるデータ量
※8:処理を行える限界値
「オンデマンドモード」
・読み込みと書き込みを処理するキャパシティを設定しない
自動的にキャパシティをスケーリングしてトラフィックを処理します。
そのため、トラフィックが予測できない場合に有効です!
「プロビジョニングモード」
・読み込みと書き込みを処理するキャパシティを設定する
設定したキャパシティを上限としてトラフィックを処理します。
そのため、トラフィックが予測できる場合に有効です!
また、特定のケースだけキャパシティをスケーリングしたい場合などはAuto Scalingが使用できます!
「オンデマンドモードとAuto Scalingの使い分け」
上記を見て、「オンデマンドモードとAuto Scalingの違いは?」と感じた方もいるのではないでしょうか?
一見同じような機能に思えますが、次のようなケースで考えてみると分かりやすいと思います!
ケース:
A社はAWS上にアプリケーションをデプロイしています。
このアプリケーションはDynamoDBを使用しますが、イベントによって月に2日間だけトラフィックが2倍になります!
それ以外の日のトラフィックは固定です。
上記のようなケースの場合は普段からオンデマンドモードを使用するメリットはありませんが、月に2日間あるイベントの日だけはキャパシティを増やしたいです。
そのようなときには、Auto scalingを使用することによって柔軟にカバーできます!
つまり、普段から必要とするキャパシティが不透明な場合はオンデマンドモード、特定の日だけキャパシティを増やしたい場合はプロビジョニングモードとAuto scalingを使用するというイメージを持っていただけると良いと思います!
1桁ミリ秒の時点でなかなか想像できませんが、デフォルトでもパフォーマンスが凄いということが分かりますね。
また、Auto Scalingも便利な機能なので重宝しそうです!
高い可用性と耐久性
DynamoDBの高い可用性と耐久性については下記の機能によって可能になっています。
マルチAZ
同じリージョン内の3つのAZ間でデータがレプリケート※9されます。
※9:リアルタイムでデータをコピーすること
【補足】
参考:
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Introduction.html
グローバルテーブル
複数リージョンにわたってレプリケートし、高速な読み取りと書き込みのパフォーマンスを実現できます。
また、マルチアクティブデータベースなので複数リージョンから書き込みを行うこともできます。
この機能によって99.999%の可用性につながります!
AWSは可用性と耐久性に強いイメージがありますが、DynamoDBでも発揮してくれています。
グローバルデータベースに関しては99.999%の可用性なので安心ですね!
まとめ
いかがだったでしょうか?
今回はDynamoDBの基本について解説をしてみました。
AWSはサービスごとの違いを覚えるのが大変ですが、使いこなすことができれば大きな助けになってくれると思います!
DynamoDBには他にも便利な機能などがありますので、気になった方は調べてみてください。