2016-10-16 7 views
1

MERN Stackを使用して、非常にI/O集中型アプリケーション(座席の可用性に基づいて選択)を行っています。 このアプリは、2000人の同時ユーザーを獲得する予定です。 私はMongoDBの2つのインスタンスを使用することが賢明かどうかを知りたいと思います.1つはRAM(メモリ内)ともう1つはハードドライブです。MongoDBの2つのインスタンスを実行

利用可能な座席を格納するために使用されるRAM。 ハードディスクドライブは一定間隔でデータをバックアップします。 しかし同時に私は、サーバがクラッシュした場合、RAM上のMongoDBデータが失われることを知っています。

誰も私を案内できますか?

私は、私はあなたがこれを必要とは思わない...

+0

Mongoの複数のインスタンスを実行する場合は、それらを破棄する必要があります。ウェザーかどうかは、テストをしたり、実際に何人ものユーザーに問題のあるものを起動したりした後に、自分が答えられるようにすることができます。 – adeneo

答えて

2

をソケットIOの代わりに、AJAXを使用しています。あなたは良い量のRAMを備えた良いサーバーを手に入れることができます。インデックスを正しく作成すれば、すべて正常に動作します。

また、Mongo 3はMongo 2のように各アップデートでデータベース全体をロックしません。

私は最良のアプローチは、読み取りを改善するためにMemcachedのようなものを使用すると考えています。また、データベースのパフォーマンスを向上させ、フェールオーバーを自動化するためにシャーディングとレプリカセットを使用します。

はMongoDBのは、すでに正確に、すぐに使えるように振る舞うので、これは、不要と思われる

2

...あなたのサーバーを再起動したときに頭痛を持っているでしょうし、あなたのデータを失うことも考えてみましょう。

旧式のエンジン(MMAPv1)はメモリマップファイルを使用していました。つまり、データがあるだけのRAMを搭載していれば、実際にはハードドライブの自動バックアップを備えたメモリ内データベースのように動作します。

新しいエンジン(Wired Tiger)は少し違っていますが、一般的に同じです。キャッシュサイズを設定できます(config key storage.wiredTiger.engineConfig.cacheSizeGB)。キャッシュのサイズが十分に大きければ、自動ハードドライブミラーリングを使用したインメモリデータベースが再度作成されます。

詳細はthe storage FAQです。

+0

MMAPとWiredTigerのメモリ内エンジンとの比較が正しくありません。すべてのデータがメモリに収まる場合でも、完全に異なる動作。メモリ内エンジンは、ディスクへの書き込みやディスクからの読み取りが不要なため、すべてのパフォーマンステストで遅延、パフォーマンス、予測可能性という点で独特の特性を持っていました。したがって、MMAP/WiredTigerはメモリ内のエンジンと同じように動作すると言っても間違いがあります。 –

+1

@AminJ不正の異議。 MMAPv1とWTは両方とも、RAMのインデックスに加えて多くのデータを保持しようとします。そのデータセットはワーキングセットと呼ばれます。設定に応じて、このデータセットは、選択した書込み問題によって定義された動作に加えて、ディスクに「同期」される場合とされない場合があります。これまでは、高レベルの観点から、(実装ではなく)_behavior_は同じです。そして、フィリップスのポイントは、私が見る限り、メモリ内の専用DBとして実行されるのではなく、MongoDBがRAM内のデータを大量に保持しているため、手動管理によって首が噛み込まれる可能性があります。 –

+0

ワーキングセットについての正確な観察がありますが、ここでの説明は重要ではありません。書き込みの問題は、クライアントが確認応答を受け取る方法に影響しますが、最終的にはmongoがデータをディスクに書き出します(無効にできるジャーナル、またはワイヤータイガーのチェックポイントなど)。そして、これはあなたのモンゴの予測可能性と待ち時間に大きな影響を与えます。私はまだMMAPやWiredTigerを使ってメモリ内のエンジンを模倣できると言っても過言ではないと思います。 –

0

あなたが話しているのは、スケーリングの問題です。スケーリングには2つの選択肢があります。ボトルネックの原因となっているリソースを既存のセットアップ(より多くのRAMと高速なディスク)に追加するか、セットアップを拡張します。最初にリソースを追加する必要があります。ほとんどの場合、リソースを追加しても、それほど大きな損失はありません。

ある時点では、この「スケールアップ」は実行できなくなり、より多くのノードに負荷を分散する必要があります。

MongoDBには、(論理)ノード間に負荷を分散する機能が付属しています。sharding

基本的には、以下のように動作します。複数のレプリカセットがそれぞれシャードと呼ばれる論理ノードを形成します。各シャードは、データのサブセットのみを保持します。シャードに直接接続するのではなく、mongos query routerを介してデータを取得します。これは、どのシャードがクエリに応答するデータを保持し、新しいデータを書き込むかを認識します。

carefully selecting your shard keyによって、読み書きはシャード間で均等に分散する必要があります。

サイドノート:レプリカセットではなくスタンドアロンインスタンスに本番データを置くと、私の本の過失の境界が横断します。今日の(賃貸された)ハードウェアの価格を考えると、MongoDBレプリカセットを使用するよりも単一障害点を排除することが決して簡単ではありません。

関連する問題