2

私は Web アプリケーション (単純な Web アプリケーション アーカイブ ファイル) を持っています。これには、さまざまなストレージ タイプ用の複数のストレージ アダプターがあります。MongoDB と CouchDB。このアプリケーションを使用することで、作成した Web サービスを使用してこれらのデータベースにデータを保存/クエリできます。現在、アプリケーションごとに 1 つのデータベース インスタンスしか持つことができず、並列処理を妨げる複数のインスタンスを持つことはできません。


私が望むのは、アプリケーションを複数のマシンで実行することです。その上で、クライアントがデータベースの種類/アドレスを知らなくてもデータを保存/クエリできるようにする UI を作成したいと考えています。

2 つの異なるシナリオがあり、どちらがより良い方法で、その理由をお聞きしたいと思います。


1) 3 つの単一データベース (couchdb) を実行している 3 つのサーバーがあるとします。アプリケーションをこれらのサーバーにアップロードし、UI またはアプリケーションの上のレイヤーを使用してサーバーのマップを定義し、データの保存とクエリを実行できます。

ここに画像の説明を入力

上記のように、データベースとアプリケーションは同じサーバーにあるため、リモートです。


2) 3 つのサーバーがまだリモートで実行されているとしますが、この場合、私のアプリケーションはローカルです。そして、複数のデータベース インスタンスを受け入れるようにしました。

ここに画像の説明を入力


その場合、アプリケーションを拡張する必要はないので、実際には最初のものを好みますが、それについてどう思うか聞きたかった. その種の分散シナリオのソースを提供していただければ幸いです-私はその種のものについてまったく経験がありませんでした。

4

1 に答える 1

2

Instagramのアーキテクチャについて説明している記事をご覧ください。3 人のエンジニアが、1 日あたり 1 億 5000 万枚の写真で 1500 万から 2500 万のユーザーをどのように処理したかを知ることは非常に興味深いことです。

また、人気のある Web リソースのさまざまなスケーラビリティ ソリューションについて説明している興味深いブログもお勧めします。

たくさんの情報があります。

しかし、最も一般的なものは次のとおりです。

これらのそれぞれについての説明が見つかるかもしれませんが、私はあなたの要求に応じて最後のものに焦点を当てたいと思います.

アプリケーションを水平方向にスケーラブルにしたい場合は、クラスターに含まれる実際のサーバー数に関係なく、各クラスターを個別の論理モジュールと見なす必要があります。Web アプリケーションの場合、そのアプリケーションの複数のインスタンスをセットアップし、それらの前にロード バランサーを設定できます。したがって、ユーザーは単一のエントリ ポイント (例: http://mysite.com ) にアクセスできますが、実際のインスタンスは任意です。

インスタンスを相互にコラボレーションする必要がある場合は、メモリ内ストレージを避ける必要がありますが、Redisなどの「キー値」ストレージを、 ActiveMQRabbitMQ、クラウド バージョンの Iron.IOなどのメッセージ ブローカーと共に使用する必要があります。 .

データストレージも単一のエントリ ポイントとして考慮する必要があります。たとえば、シャード クラスターです (fe MongoDB はすぐに使える自動シャーディングをサポートしており、ほとんどの NoSQL ソリューションにもそれがあります - CouchDBHBase )。したがって、基本的には、特定のシャードキーに従って、対応するインスタンスにリダイレクトするシャードコントローラーを呼び出します。ただし、通常、シャーディングは非常に重要なことであることに注意してください。したがって、ほとんどの場合、RDBMS を扱う場合、垂直スケーラビリティを使用する必要があります。

上記のすべてを考慮すると、次のような構造をお勧めします。

単純なスキーマ

確かに理想的には、すべてのサーバーが物理的に互いに近くにある必要があります (fe は同じデータセンターにあります)。ただし、アプリケーションをワールドワイドとして使用する場合は、レイテンシーが少なくなるようにインスタンスを分割する必要があります。これはサーバーの構成に関する非常に興味深い講義です(MongoDbに関するものですが、あなたの場合にもいくつかのアプローチが役立つと思います):https://www.youtube.com/watch?v=TZOH92mZIN8

しかし、分散「マップ/リデュース」コンピューティングにすべてのサーバーを使用する必要がなく、結果を取得するために特定のサーバーのインスタンスが 1 つだけ必要な場合は、シナリオ #1がかなり適切であり、ニーズに適していると思います (インスタンスの前にロードバランサーをセットアップする場合)。

于 2013-03-18T11:02:32.883 に答える