Terracotta を使用して RAM を大量に使用するアプリケーションを拡張できますか?
-
02-07-2019 - |
質問
現在 RAM に制限されているアプリケーションをスケールアップするのに役立つ Terracotta を評価しています。これは協調的なフィルターであり、ユーザーごとに約 2 キロバイトのデータを保存します。Amazon の EC2 を使用したいのですが、RAM は 14GB に制限されており、サーバーあたりの実質的なユーザー数の上限は約 700 万人になります。これを超えてスケールできる必要があります。
これまでの私の読書に基づいて、Terracotta は各サーバーで利用可能な RAM よりも大きなクラスター化ヒープを持つことができると考えられます。各サーバーが 14 GB しかサポートしない場合、30 GB 以上の効果的なクラスター化ヒープを持つことは可能でしょうか?
ユーザーごとのデータ (大部分は浮動小数点数の配列) は非常に頻繁に変更され、場合によっては 1 分間に数十万回も変更されます。これらの変更が発生した瞬間に、すべての変更をクラスター内の他のノードに同期する必要はありません。一部のオブジェクトフィールドのみを定期的に同期することは可能ですか?
解決
これに関しては、答えは完全に「はい」だと思います。Terracotta を使用すると、単一の JVM のサイズより大きいクラスター化ヒープを操作できますが、これは最も一般的な使用例ではありません。
ただし、a) ワーキング セットのサイズと b) データ トラフィックの量に留意する必要があります。a) の場合、作業を実行するために常にメモリ内に存在しなければならないデータ セットがあり、その作業セット サイズ > ヒープ サイズの場合、明らかにパフォーマンスが低下します。b) の場合、クラスター化ヒープに追加/更新された各データをサーバーに送信する必要があります。Terracotta は、pojo グラフの細かいフィールドを変更する場合に最適です。大きな配列を操作すると、Terracotta の機能を最大限に活用できません (これは、人々が時々そのように使用しないということではありません)。
大量のガベージを作成している場合は、Terracotta メモリ マネージャーと分散ガベージ コレクターがそれに対応できる必要があります。データ量がそこで利用可能な帯域幅を超えているかどうかは、試してみないとわかりません。
複数のサーバーを実行し、データがサーバーごとにパーティション化されているか、ある程度の参照の局所性がある場合、アプリケーションは非常に大きなメリットを得ることができます。この場合、ヒープ内の 1 つのサーバーのパーティションのデータのみが必要で、残りのデータはメモリにフォールトされる必要はありません。もちろん、他のサーバーがダウンした場合、フェイルオーバー/可用性のために必要な場合は障害が発生します。これが意味するのは、パーティション化されたデータの場合、すべてのノードにブロードキャストするのではなく、トランザクションをサーバーに送信するだけであるということです。
数字の観点から見ると、30GB のデータにインデックスを付けることができるため、これはハードリミットに近いものではありません。