クラウド内のノード(アプリサーバー)間でデータを共有する

architecture cloud python scaling
クラウド内のノード(アプリサーバー)間でデータを共有する

私はこれまで単一のサーバーで提供されていたPython / Pylons webappを構築していますが、今では、ある種のロードバランサーを前面に置いて複数のサーバー間でどのように拡張するかを調査したいと思います。

もちろん、主な関心事はサーバー側の状態です。 これには、ユーザーセッションデータ、ユーザーがアップロードしたデータ(写真など)、およびキャッシュが含まれます。 アプリサーバーがキャッシュを共有するようにしたいので、あるサーバーが他のサーバーで既に行われている場合、余分な作業を行う必要はありません。 スケーリングはすぐに問題になることはおそらくないでしょうが、これは大きなアーキテクチャ上の決定のように思えるので、最初はそれを半ば正しいものにしてください。

セッションには、Cookieベースのセッションを使用できます。http://beaker.groovie.org/sessions.html#cookie-based

ユーザーがアップロードしたデータとキャッシュ(両方とも現在ローカルファイルシステムに保存されている)については、別のアプローチが必要であり、どちらが最適かはわかりません。 私が検討したオプションのいくつか:

  • 分散ファイルシステム

  • 特にAmazon S3、クラウドとしてAmazonをターゲットにしているため
    プロバイダー。 ただし、コードがベンダー固有になりすぎないようにしたいので、後でクラウドプロバイダーを変更することは可能です。

  • [分散]キーと値のストア、書き換え/抽象化が必要
    すべてのデータがファイルシステム上にあると想定する私のコードの部分

  • どういうわけか、データの共有をまったく避けてください。ロードバランサーは非常に賢い可能性があります。
    必要なユーザーデータ/キャッシュがローカルにあるノードにリクエストを送信します。 待って、これはシャーディングと呼ばれますよね?

  • ネットワークアクセス可能なファイルシステム、特にNFS:NFSディレクトリ
    1つの(おそらく専用の)ノードでエクスポートされ、他のすべてのノードはそれをマウントします。 考えられる問題私が考えることができる:

  • NFSホストへの帯域幅がボトルネックになる可能性があります

  • 複数のクライアントが同じファイルにアクセスしようとする場合の競合状態
    同時

現在、NFSを使用することを検討しています。これはおそらく動作する最も簡単なソリューションのようです。 しかし、再び、多分私は気づいていないより多くの警告があり、これを近視眼的な決定にしていますか? クラウドでホストされ、水平方向に拡張されることが予想されるアプリに使用した経験、データストレージと共有の形式は何ですか?

  1  0


ベストアンサー

キャッシングは、標準のmemecachedを使用して簡単に実現できます。これは、複数のサーバーに分散できます。 NFSは、競合状態を回避するために独自のロックメカニズムを実装する必要があるため、悪いアイデアのように思えます。 cassandraのような分散no-sqlソリューションの1つに行きます。

1


NFSではなく、分散キー/値ストアを確認することを強くお勧めします。

現在1つのシステムにいて、2つのシステムにスケールアップしたいので、おそらくcassandraではなくredisを使用します。 Cassandraはクールですが、読み取りより書き込みの方が多いシステム向けに設計されており、3つ以上のノードがある場合に最適に動作します。 一方、Redisは基本的にmemcachedのような単一ノードデーモンで非常にうまく機能しますが、永続性があります。

Redisはpythonで簡単に使用でき、非常にパフォーマンスが高いため、数百万のリクエストを行うまで、Redis自体のシャーディングやスケーリングを心配する必要はありませんが、フェイルオーバーが最大の問題になる可能性があります。 私はそれを個人的に展開していないので、すべてのデータが失敗して別のデータにフェールオーバーした場合にすべてのデータを回復することがいかに効果的/簡単かはわかりません。 もしそうだと思うなら、私はそれを調査します。

より複雑なデータ構造を保存する場合は、MongoDBまたはそれに相当するものを調べます。

1


タイトルとURLをコピーしました