AWS

【AWS】DynamoDBとRDSのメリットデメリットの比較について

どうも、とがみんです。

この記事では、AWSのサービスであるAmazon DymamoDBとRDSのメリット、デメリットの比較についてまとめていきます。

Amazon RDSとは?

Amazon RDSは、「Amazon Relational Database Servise」の略で、AWSが提供するRelational Database Management Systemのマネージドサービスです。

Amazon Aurora、PostgreSQL、MySQL、MariaDB、Oracle Database、および Microsoft SQL Server等のデータベースが提供されています。

Amazon DynamoDBとは?

Amazon DynamoDBは、NoSQLデータベースのプロダクトで、key-valueおよびドキュメント型データベースです。

Amazon RDSとAmazon DynamoDBの比較

Amazon RDSとAmazon DynamoDBについてメリット・デメリットを整理していきます。

システム可用性とデータの一貫性

「システム可用性」とは、システムが停止することなく稼働し続ける能力のことを意味し、「データの一貫性」とは、トランザクション開始と終了時にあらかじめ与えられた整合性を満たすことを保証する性質を指します。

Amazon RDS

「Amazon RDS」は、別々の場所に同期されたRDBを配置(Multi-AZ配置)することで、片方で障害が発生しても、もう片方が正常動作していれば、自動的に正常動作しているRDBに切り替える仕組み(フェイルオーバー)があるため、高い可用性があります。

高い可用性を保つものの、可用性が失われてしまうタイミングがあります。

障害発生時に、正常動作しているRDBに切り替えるために時間がかかり、その間はデータベースが利用できなくなり、可用性が失われてしまいます。

通常その時間は、60秒~120秒かかり、大規模なトランザクション等ではその時間が増加してしまう場合もあります。

>Amazon RDS での高可用性 (マルチ AZ)|AWS

また、セキュリティパッチ等、セキュリティ上の問題により、修正ブログラムを適用しなければならない場合があり、その再起動の際にも上記のようなRDBが利用できない時間が生まれてしまいます。

このようにAmazonRDSは高い可用性がありつつも、可用性が失われてしまうタイミングが発生してしまいます。

Amazon DynamoDB

一方で「Amzon DynamoDB」は、RDSのような可用性低下はなく、基本的にいつでも利用可能であることを想定してサービスが設計されています。

データの一貫性を一部犠牲することで、RDS以上の高い可用性を実現します。

データは3箇所に複製され配置され、そのどれか一つで障害が発生しても、別の場所にアクセスできるため、可用性が失われません。

一方でDynamoDBは、データの取得処理があった場合、複数あるノードのうちランダムに一つのノードを選択し結果を返却するため、更新前のデータを返却してしまう可能性があります。

これは、データの更新があった場合、別のデータベースへのデータの伝搬に時間がかかるため、伝搬前のデータベースのデータを取得してしまった場合、更新前のデータが返却されてしまうためです。

このように、Amazon DynamoDBは、一貫性を多少妥協することによってサービスの可用性が失われないことを前提としたサービスとなっています。

>Amazon DynamoDB とは|AWS

データ管理の自由度とデータの検索性

Amazon RDS

「Amazon RDS」は、データが構造化され、表形式で管理されています。

そのため、SQLのWHERE句にあらゆるカラムの条件を指定でき、自由自在にデータを絞り込んで検索することが可能なため、検索の自由度が高いです。

一方で構造化されていないデータを管理することができず、データ管理の自由度が低いです。

Amazon DynamoDB

「Amazon DynamoDB」は、NoSQLデータベースのため、構造化されていない自由度の高いデータの管理ができます。

一方で、事前にキーとして指定した要素をつかうことでしか目的のデータを探せません。

キーとして指定した要素以外を使って値を探し出したい場合は、全体をスキャンして条件に一致するものを1つずつ選別していく必要があり、パフォーマンス面で非常に不利で非現実的です。

データの一貫性と処理速度

Amazon RDS

「Amazon RDS」が提供しているRDBは、テーブル間の整合性を保つために、トランザクション管理を行なっているため、データの一貫性を保つことができます。

一連の操作を全て実行して適用する(commit)か、全てキャンセルし適用させない(rollback)するかを保証する性質を持ち、トランザクションの開始と終了時にあらかじめ与えられた整合性を満たす事を保証します。

整合性条件を満たさない状態を起こすようなトランザクションは実行が中断されます。

Amazon DynamoDB

「Amazon DynamoDB」は、トランザクション自体がないため、他のプロセスと同期を取らずに読み書きをし、

また、シンプルなデータベース構造のため、複数台のサーバーで処理分担が行いやすく、高速な処理の実現が可能になっています。

一方で、データの一貫性が失われてしまうケースが生じる可能性があります。

拡張性

Amazon RDS

リレーショナルデータベースでは通常、ハードウェアの演算機能を増強してスケールアップするか、読み取り専用のレプリカを追加してスケールアウトします。

データの書き込みに対する処理能力の拡張は、演算機能を増強する必要があり、規模の拡大にともなってスケールアップを繰り返すと、限界に達してしまう可能性があります。

Amazon DynamoDB

Amazon DynamoDBのようなNoSQLデータベースでは、シャーディングによる、スケールアウトが可能なため、高い拡張性があります。

スケールアップ:個々のサーバーそのものの能力の増強。
スケールアウト:サーバーの台数を増やすことによる能力アップ。
シャーディング:データベースの負荷分散方法の一つ。同じテーブルを複数のデータベースに用意し、1つのテーブルに保存していたレコードを分散する事で各データベース内に保持されるレコードの量を減らす負荷分散の方法。1つのテーブルないのレコード数が大きくなる事で、低下していく処理速度を複数のデータベースに分けることで、1テーブル内のデータ量を減らし、1データべーす内のデータ量も減らすことができる。データベースのサーバーを分けることで、CPUやメモリにかかる負荷も分散される。ディスクを分けることで、保存することの出来るデータの最大量を増やすことができる。

>NoSQL とは|AWS

まとめ

Amazon RDSとAmazon DynamoDBについて整理してきました。

Amazon DynamoDBはデータの一貫性を妥協することで、高可用性、高拡張性を実現しています。
一貫性を妥協するといっても、即座に一貫性が保証されないというだけで、結果的には一貫性は保たれます。

Amazon RDSは、高可用性、高拡張性を要件としないシステムにおいては有効な選択肢となるものの、逆に高可用性・高拡張性を要件とするシステムにおいては、一貫性を一部犠牲にできるのであれば、Amazon DynamoDBが有効な選択肢となるかと思います。

参考資料

>AWS Black Belt Online Seminar 2017 Amazon DynamoDB|slideshare
>NoSQL とは|AWS
>【AWS公式ドキュメントを噛み砕く】DynamoDB入門者に説明する資料
>AWSのデータベースAmazon RDSとは?