【AWS】DynamoDBとRDSについて
AWSが提供するデータベースは下記の5つあります。この記事ではこれらのデータベースサービスの中で「Amazon DynamoDB」と「Amazon RDS」の違いについて調べた結果をまとめております。
Amazon RDS
Amazon DynamoDB
Amazon Neptune
Amazon Redshift
Amazon ElastiCache
■DynamoDBの特徴
・フルマネージド型のNoSQLデータベース
・原則API経由で操作する
・読み込み/書き込みが早い
・スループットに応じたスケーリング
・利用時、読み込み/書き込み性能(キャパシティユニット)の変更が可能
・ユーザー認証ではAWSのクレデンシャル情報でアクセスする
・インターネットを経由してアクセスする
NoSQLの「Amazon DynamoDB」ですが、データ構造もRDSのテーブルとは異なった所持の仕方になります。リージョンを選択して使うことができます。アベイラビリティゾーンは特に意識しなくても使用できます。データ容量は無制限で、使用している容量のみが課金対象となります。NoSQLやデータ管理の詳細については、AWS公式ページや解説サイトが多く存在しますので、ご確認ください。
■Amazon RDSの特徴
・マネージド型のリレーショナルデーターベース
・SQLにより操作
・テーブル結合など複雑なクエリが利用可能
・VPC内のEC2インスタンスなど、インターネットに繋がらない環境で利用可能
Amazon RDS(Amazon Relational Database Service)は、MySQLやPostgreSQLなどを利用することができます。また、Amazon RDSはRDBMSをAWS上のシステムで動かせるクラウドサービスの一つで、スケールアップやスケールアウトするための仕組みをブラックボックス化できることが特徴です。Linuxなどで骨の折れるような設定をサーバごとに設定しなければならないところ、AWSのコンソールで一つの画面内で設定することができるようになるのが魅力です。
■DynamoDBとRDSの違いについて
やはり、大きな違いとしては”RDSはSQLであり、DynamoDBはNoSQLである“っという点だと思います。DynamoDBはNoSQLなので、ある程度の速度が出るというメリットがあるものの、RDBMSほど複雑なクエリを投げることができないというデメリットもあります。ただ、難しいクエリを投げる必要がないのであれば、速度の出るDynamoDBでデータを運用したほうが長所を最大限に活かせるのではないでしょうか。
DynamoDBとRDBとを比較したとき、NoSQLの特徴として挙げられる「柔軟でスキーマレスなデータモデル」「水平スケーラビリティ」「分散アーキテクチャ」「高速な処理」が、RDSが抱えるパフォーマンスとデータモデルの問題に対処することを目的に作られたアーキテクチャとなっていることを如実に表しています。“アクセス量が小~中程度で、時に複雑なクエリを必要とする場合はRDS”を選択し、“アクセス量が大規模となるが、単純で自由度の高いデータモデルを扱う場合はDynamoDB”を選択するのが良いでしょう。
■補足~もう少し掘り下げてデータベースを見てみる~
少し「RDB(Relational Database)」の話をすると、「RDS」はAWSにおいて、「RDB」の代表的なサービスと言えるでしょう。RDBは、テーブルと呼ばれる「行とカラムで構成される二次元のデータ構造」に対して、SQLと呼ばれる強力なクエリ言語で操作を行い、データの一貫性(Consistency : どこから観測しても同じ値が得られること)や操作の原子性(Atomicity: 一連の操作を全て適用[commit]するか、全てキャンセル[rollback]するかの二択として実現できること)を実現するモデルとして広く親しまれてきました。また、RDBはSQLによって、さまざまなカラムをWHERE句の条件に指定でき、自由自在にデータを絞り込んで検索することができますので、検索条件の自由度が非常に高いのも大きな特徴と言えます。
一方で、高い可用性(Availability: データが常に読み書きできること)と拡張性(Scalability: 大量のデータ書き込み/読み出し要求に応えるための規模拡張が容易にできること)が求められるシステムには向かないのが現実です。例えるならば、「システムのダウンはせず、大量のデータアクセスにも耐えられるデータベース」っといった要求などです。一般的に可用性を持たせるために取られる手段としての「冗長化」や「シャーディング」を行うと、複数のノードでの管理となり一貫性の維持が難しくなります。結果として、一貫性と可用性の両立には大きな困難が伴います。
つまり、一貫性のあるシステムに向いたデータベース、AWSで言うところのAmazon RDSは、理解しやすく説明もしやすい(例えばクライアントなど)ため、高可用性・高拡張性を要件としないシステムにおいては有効な選択肢となります。
逆に高可用性・高拡張性を要件とするシステムにおいては、一貫性を一部犠牲にすることで大きな価値を得られるがあるケースがあり、そのようなケースにハマるデータベースとして登場するのがNoSQLです。一貫性が無いとは言え、即座に一貫性が保証されていないというだけで、結果的(Eventually)には一貫性を持つ状態に収束します。
ただし、基本的にNoSQLでは事前にキーとして指定した要素を使うことでしか目的のデータを探せません。キーとして指定した要素以外を使って値を探し出したい場合は、全体をスキャンして条件に一致するものを1つずつ選別していく必要があり、パフォーマンス面で非常に不利(非現実的)となります。なので、ある程度の条件を許容することができるのであれば、高い可用性または拡張性を要求するシステムにおいては、NoSQL、つまりAWSで言えば、Amazon DynamoDBが有効な選択肢のひとつとなるでしょう。