Brewers CAP定理は、利用可能なオプションが何であるかを理解するための最良の情報源です. それはすべて依存していると言えますが、Mongo について話すと、すぐに使用できる水平方向のスケーラビリティが提供され、状況によっては常に優れています。
次に一貫性について。実際には、データを最新の状態に保つための 3 つのオプションがあります。
1)最初に考慮すべきことは、アンドレアスが示す「セーフ」モードまたは「getLastError()」です。「安全な」書き込みを発行すると、データベースが挿入を受け取り、書き込みを適用したことがわかります。ただし、MongoDB は 60 秒ごとにディスクにフラッシュするだけなので、サーバーはディスクにデータがないと失敗する可能性があります。
2) 次に考慮すべきことは、「ジャーナリング」(v1.8+) です。ジャーナリングをオンにすると、データは 100 ミリ秒ごとにジャーナルにフラッシュされます。したがって、失敗するまでの時間枠が短くなります。ドライバーには、「安全」よりも一歩進んだ「fsync」オプション (名前を確認してください) があり、データがディスク (つまり、ジャーナル ファイル) にフラッシュされたという確認を待ちます。ただし、これは 1 つのサーバーのみを対象としています。サーバーのハード ドライブが故障した場合はどうなりますか? さて、あなたは2番目のコピーが必要です。
3) 考慮すべき 3 番目のことは、レプリケーションです。ドライバーは、戻る前に「このデータを N ノードに複製する」という「W」パラメーターをサポートします。特定のタイムアウトまでに書き込みが「N」ノードに到達しない場合、書き込みは失敗します (例外がスローされます)。ただし、レプリカ セット内のノード数に基づいて "W" を正しく構成する必要があります。繰り返しになりますが、ジャーナリングを使用してもハード ドライブに障害が発生する可能性があるため、レプリケーションを検討する必要があります。次に、ここに入るには長すぎるデータ センター間のレプリケーションがあります。考慮すべき最後のことは、「ロールバック」する必要があることです。私の理解では、MongoDB にはこの「ロールバック」機能がありません。バッチ挿入を行っている場合、どの要素が失敗したかを示すのが最善です。
とにかく、データの一貫性が開発者の責任になるシナリオはたくさんあります。Mongo には、私たちのような「これが正しい方法です」というものがないため、注意してすべてのシナリオを含め、DB スキーマを調整するのはあなた次第です。 RDB-s で使用されます。
メモリについて - これは完全にパフォーマンスの問題です。MongoDB はインデックスと「ワーキング セット」を RAM に保持します。RAM を制限することで、ワーキング セットを制限します。実際には、大量の RAM と HDD ではなく、SSD と少量の RAM を使用できます。少なくとも、これらは公式の推奨事項です。とにかく、この質問は個人的なものです。特定のユース ケースのパフォーマンス テストを行う必要があります。