DynamoDBとMongoDB NoSQL [終了]


172

私は将来のプロジェクトに何を使用できるかを理解しようとしています。最初の年は1か月あたり約50万件のレコードを保存する予定です。今後数年間はこれが縦型アプリケーションなので、使用する必要はありません。このためにデータベースを使用しているため、noSQLデータストレージを選択することにしました。

私が頭に浮かんだ最初のオプションは、コミュニティからの多くのサポートを受けた非常に成熟した製品であるため、mongo dbでしたが、一方で、最高のパフォーマンスでマネージドサービスを提供する真新しい製品を手に入れました。これを開発しますアプリケーションですが、(少なくとも今のところ)メンテナンスプランがないので、amazonは柔軟なスケーリング方法を提供するので、これは大きな利点になると思います。

私の主な関心事はクエリ構造に関するもので、私はまだdynamoDBクエリ機能を見ていませんが、k / vデータストレージであるため、mongo dbよりも制限されていると感じています。

プロジェクトをmongoDBからDynamoDBに移行した経験がある人がいれば、アドバイスをいただければ幸いです。


3
クエリ構造に関するアドバイスが必要な場合は、データにアクセスするための使用例とともにスキーマの例を提供することをお勧めします。これらがなければ、適合性を判断することは困難です。
James Wahlin 2013

実際、データのクエリ方法は、バックエンドデータベースの選択に劇的な影響を与える可能性があります。階層化は私の最大の質問でしょう。
zanlok 2014年

3
この質問がSOのランク付けによってまだ終了していないことに驚いています。通常、アドバイスを求める質問は、非常に具体的な問題について助けを求めていないため、クローズされます。
LS

回答:


67

私は最近、MongoDBをDynamoDBに移行し、パフォーマンスとコストに関するいくつかの経験とデータを共有するために3つのブログを書きました。

MongoDBからAWS DynamoDB + SimpleDBに移行する

DynamoDBよりMongoDBを使用する必要がある7つの理由

MongoDBよりDynamoDBを使用する必要がある3つの理由


ここにあなたの記事を投稿してくれてありがとう。私はより明確なビジョンを持つのを助けてくれました。そして、私が決心するときまでに間違いなく私を助けてくれるでしょう
jack.the.ripper

1
MongoでDynamoを使用する必要がある3つの理由を読むと、dynamoDBに比べて高額なマネージドサービスを提供する会社がありますが、これはnosqlのメンテナンス担当者がいない場合に考慮できます。 、会社名はmongoLabある
jack.the.ripper

2
@Pedroリマインダーをたくさんありがとう。多分私は非効率的な方法でMongoDBを使用しています。私は140万のレコードを持ち、8Gディスクを占有していますが、DynamoDBに転送した後、300Mのストレージしか占有しません。これらのデータをMongoLabに移行した場合、テストが必要であり、ストレージを確認する必要があります:)
Mason Zhang

1
リンクは壊れていますか?
fedorqui 'SO stop harming' 14

@MasonZhangこれらのデータをMongoLabに移行した場合、どのようなストレージが表示されるかは非常に興味深いでしょう。
fuiiii 14

164

これは古いことはわかっていますが、比較を検索するとまだ表示されます。私たちはモンゴを使用しており、ほぼ完全にダイナモに移行しました。これが現在私たちの最初の選択肢です。より多くの機能があるからではなく、そうではありません。Mongoにはより優れたクエリ言語があり、構造内でインデックスを作成できます。小さなことはたくさんあります。Dynamoの優位性は、OPが彼のコメントで述べたことにあります。それは簡単です。サーバーの世話をする必要はありません。Mongoシャードソリューションの設定を開始すると、複雑になります。ホスティング会社に行くこともできますが、それも安くはありません。Dynamoでは、より多くのスループットが必要な場合は、ボタンをクリックするだけです。自動的にスケーリングするスクリプトを作成できます。Dynamoをアップグレードするときは、あなたのために行われます。それはすべての貴重なストレスと費やされていない時間です。もしそうなら

したがって、デフォルトでDynamoを使用します。Mongoは、おそらくデータ構造が十分に複雑でそれを正当化できるのであれば、おそらくSQLデータベースに戻るでしょう。Dynamoは鈍感であり、それをどのように構築するかを考える必要があります。おそらく、ElasticcacheでRedisを使用して、複雑なもので機能させることができます。しかし、それを処理する必要がないのは確かに良いことです。あなたがコーディングします。それでおしまい。


35
データベースをデータベースと比較する必要がある場合は、データベースの機能のみを比較する必要があります。ホストされたソリューションはデータベース機能ではありません。ホストされているMongoDBを探している場合は、MongoHQにアクセスすると、コアな作業に集中しながら、回避したいすべての面倒な作業を実行できます。
Kabeer、2015年

12
私たちが行った最初のコスト比較では、ダイナモがかなり良い取引であることがわかりましたが、それは事実です。もう1つの問題は、ダイナモをアップサイズ/ダウンサイズする必要がある場合、ボタンをクリックするだけです。ディスクを追加したり、mongoサーバーのサイズを変更したりする必要がある場合、それを行う必要があるかどうかにかかわらず、ダウンタイムが発生します。
CargoMeister 2015年

@Kabeer私は100%技術的にあなたに同意しますが、現実の世界では、パッケージ全体がビジネス上の意思決定を行う上で重要です。最終的に、これはビジネス上の決定です。
poitroae

59

50万件のドキュメントがあれば、スケールする理由はありません。SSDと8 GBのRAMを備えた一般的なラップトップは、数千万件のレコードを簡単に作成できるため、スケーリングのために選択しようとしても、選択は重要ではありません。私はあなたがあなたが最も好きなもの、そしておそらくあなたが最もオンラインでのサポートを見つけることができる場所を選ぶことをお勧めします。


ええ、私の市長の懸念は、スケールアップと個人的な正直な時間をかけてのメンテナンスについてです。mongoDBは、私が中長期のメンテナンスに関して考えている仕事を実行できると思います
jack.the.ripper

10
Derick、スケールのもう1つの主要な要素は、ドキュメント数やデータベースサイズだけでなく、使用率です。@jackは「感じる」ことはありませんが、最終的な展開のプラットフォームとハードウェアを含むテストに依存しています。1週間を費やしていくつかのdbバリアントにデータを詰め込み、ベンチマークを行うと、情報に基づいた決定につながり、多くの苦痛を軽減できます。
zanlok 2014年

3
プロフェッショナルな製品/サービスを提供することは、単純な「これで実現できる」ソリューションをはるかに超えています。安価なマシンがLinux、MongoDB、数百万のレコードをほとんど無料で実行できるからといって、現実の世界では優れたパフォーマンスとは言えません。50万件のレコード(SIMPLEスキーマを含む)は、おそらくOPのメンテナンスコスト(少なくともハードウェア)がなく、月額料金がおそらくサーバーのコストよりはるかに少ないため、DynamoDBの候補として適切でしょう。 1年か2年。
cbmeeks


16

短い答え:SQLから始めて、必要な場合にのみNoSQLを追加します。(非常に単純なクエリ以外に何も必要がない場合を除く)

私の個人的な経験:クエリにMongoDBを使用したことはありませんが、2015年4月の時点で、DynamoDBは、最も基本的なキー/値クエリ以外のものに関しては、まだ非常に機能が低下しています。基本的なものとしては大好きですが、クエリ言語が必要な場合は、実際のSQLデータベースソリューションを検討してください。

DynamoDBでは、ハッシュまたはハッシュと範囲キーに対してクエリを実行でき、複数のセカンダリグローバルインデックスを持つことができます。4つの可能なフィルターパラメーターを使用して単一のテーブルでクエリを実行し、結果を並べ替えています。これは、フィルター式でグローバルセカンダリインデックスを使用することで(かろうじて)サポートされています。フィルターに一致する結果の合計を取得しようとすると、問題が発生します。フィルターに一致する最初の10アイテムを検索するだけでなく、10アイテムをチェックして、有効な結果が0になるため、再検索を続ける必要があります。続行キーからのスキャン-首が痛く、単純なシナリオではテーブルの読み取り割り当てが多すぎます。

クエリ内のフィルターの制限問題について具体的には、これはドキュメント(http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#ScanQueryLimit)からの抜粋です。

DynamoDBは応答で、一致するすべての結果を
Limit値のスコープ。たとえば、クエリを発行した場合
または、制限値が6でフィルターなしのスキャン要求
式では、操作は最初の6つのアイテムを返します 
リクエストパラメータと一致するテーブル。あなたも提供する場合
FilterExpression、操作は内の項目を返します 
フィルター要件に一致する表の最初の6項目。

私の結論は、FilterExpressionsを含むクエリはごくまれにしか使用できず、スケーラブルではないということです。各クエリは、DynamoDB読み取りユニットを大量に消費するテーブルのほとんどまたはすべてを簡単に読み取ることができるためです。使用する読み取りユニットが多すぎると、スロットルが発生し、パフォーマンスが低下します。

専門家の意見:2015年4月9日のAWSサミットでソリューションアーキテクチャマネージャーのBrett Hollman氏は、最初の1,000万人のユーザーに呼びかけることに関するAWSの講演で、SQLデータベースから始めて、それが理にかなっている場合にのみNoSQLを使用することを提唱しています。遅かれ早かれ、スタックのどこかにSQLサーバーが必要になるからです。彼のスライドはこちらです:http : //www.slideshare.net/AmazonWebServices/deep-dive-scaling-up-to-your-first-10-million-users スライド28を参照してください。


全文検索または場所ベースのクエリに到達するために、cloudsearchをdynamodbストリームおよびラムダと簡単に統合することを実際に確認する必要があります。
MrTJ 2015年

4
必要に応じてデータベースを選択してください。これは、SQLとnoSQLの間の選択ではなく、ドキュメント指向DB、グラフ指向DB、キー値DB、RDMBSの間の選択です。
vcarel

14

私たちはヘルスケア製品にモンゴ/ダイナモの組み合わせを選びました。基本的にmongoはより良い検索を可能にしますが、ホストされたDynamoは素晴らしいです。追加作業なしでHIPAAに準拠しているからです。そのため、標準設定ではmongo部分を個人データなしでホストし、amazonがインフラストラクチャの観点からHIPAA部分を処理できるようにします。関連するDynamoドキュメントのポインタ(ID)を含むドキュメントを表示するmongoから特定のアイテムをクエリできます。

アプリケーション全体をDynamoでホストする代わりに、mongoを使用してこれを選択した主な理由は、2つの理由でした。まず、位置ベースの検索を実行する必要がありましたが、mongoが得意だった当時、Dynamoはそうではありませんでしたが、現在はオプションがあります。

2つ目は、一部のドキュメントが構造化されておらず、事前にデータがわからないためです。たとえば、ユーザーが「フォーム」コレクションに次のようなドキュメントを入力したとします。{"username": "user1"、 " email ":" me@me.com "}。そして、別のユーザーがこれを同じコレクション{"phone": "813-555-3333"、 "location":[28.1234、-83.2342]}に入れます。mongoでは、これらの動的フィールドや不明なフィールドをいつでも検索できます。Dynamoではこれを実行できますが、検索可能にする新しいフィールドが追加されるたびにインデックスを作成する必要があります。したがって、Dynamoドキュメントに電話フィールドが存在したことがなく、突然突然、誰かが電話フィールドを追加した場合、完全に検索できなくなります。

これは、あなたが言及した別のポイントをもたらします。仕事に適したソリューションを選択することが、必ずしも仕事に最適な製品を選択することを意味するわけではありません。たとえば、作成したシステムを必要とし、10年以上使用するクライアントがいるとします。長期にわたってシステムを維持および維持するためにAmazonに依存できるので、仕事を成し遂げるのに十分良いSaaS / IaaSソリューションを採用することは、より良い選択肢かもしれません。


9

私は両方と両方のファンの仕事をしました。

しかし、いつ、何のために何を使用するかを理解する必要があります。

すべてのデータベースをDynamoDBに移動するのは良い考えではないと思います。プライマリキーとセカンダリキーを除いてクエリが難しいため、インデックス作成が制限されており、DynamoDBでのスキャンは苦痛です。

私はハイブリッドな種類のDBを選びます。拡張可能なクエリや変更可能なデータがMongoDBにあり、拡張や変更を提供するために制約を受けると感じることのないすべての機能があります。

DynamoDBは非常に高速(MongoDBより高速)であるため、DynamoDBは、スケーラブルなアプリケーションでのセッションの代替としてよく使用されます。DynamoDBのベストプラクティスでは、使用率の低いデータが大量にある場合は、他のテーブルに移動することを推奨しています。

記事やフィードがあるとします。人々は先週のものや今月のものを探す可能性が高くなります。2年前のデータを訪問する機会は本当にまれです。これらの目的のために、DynamoDBは、月または年ごとに異なるテーブルにデータを格納することを好みます。

DynamoDBはスケーラブルなようで、MongoDBで手動で行う必要があります。ただし、スループットパーティションと、背後でスケーリングがどのように機能するかについて理解していない場合、DynamoDBのパフォーマンスが低下します。

DynamoDBは、速度が重要な場合に使用する必要があります。一方、MongoDBには手や機能が多すぎるため、DynamoDBにはありません。

たとえば、MongoDBのレプリカセットを作成して、レプリカの1つが8時間前のデータインスタンスを保持するようにすることができます。DBで大きな時間をめちゃくちゃにして、以前のようにデータを取得したい場合は、本当に便利です。

それは私の意見ですが。


1
そして、RedisとMongoDBの組み合わせは?それは素晴らしいと思います。
ismaestro 2016年

私はそう思います、Redisの実地経験はありませんが、メモリDBはほとんどの場合ディスクベースのDBよりもパフォーマンスが優れているため、そのパフォーマンスのために確かに広く使用されています。したがって、膨大な需要と高い頻度でアクセスする必要があるデータはRedisに移動する必要があると思います。一方、大きな無気力データにはMongoDBを使用する必要があります。
Rahul Kumar

7

覚えておいてください、私はMongoDBで実験しただけです...

私が読んだことから、DynamoDBは機能の点で長い道のりを歩んできました。以前は、非常に限られたストレージとクエリ機能を備えた超基本的なKey-Valueストアでした。それから成長し、より大きなドキュメントサイズ+ JSONサポートおよびグローバルセカンダリインデックスをサポートするようになりました。DynamoDBとMongoDBの機能の違いは、月ごとに小さくなります。DynamoDBの新機能はここで拡張されます

最近のDynamoDB機能の追加により、MongoDBとDynamoDBの比較の大部分は古くなっています。ただし、この投稿は、DynamoDBを選択するためのいくつかの他の説得力のあるポイントを提供します。データベースの選択に関するここでの別の議論は、少し古いですが、読むのは面白かったです。

私の要点:深刻なデータベースクエリを実行している場合、またはDynamoDBでサポートされていない言語で作業している場合は、MongoDBを使用してください。それ以外の場合は、DynamoDBを使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.