3

基本的に私のジレンマはこれです。ファイルをホストする x サーバーのリストがあります。サイトの mysql db とアプリケーションをホストする別のサーバーがあります。ファイルが (フロントエンド サーバーに) アップロードされると、アプリケーションは、空き容量が最も多いサーバーを確認し、そこにファイルを移動します。同じ量の空き容量を持つ 2 つ以上の空のサーバーで開始した場合、これは正常に機能します。後で別のサーバーをミックスに導入する場合....現在のサーバーよりも多くの空き容量がある場合、この方法はあまり効果的ではありません.すべての新しいファイルが新しいサーバーにうまくアップロードされず、過負荷になります空き容量に関して残りのボックスに追いつくまで、新しいトラフィックのほとんどを処理するためです。

そこで、ファイルの分布を正規化するのに役立つ重み付けシステムも導入することを考えました。したがって、3 台のサーバーがそれぞれ 33% に設定されていて、1 台のサーバーにかなり多くの空き容量がある場合、他のサーバーよりも多くのアップロードが行われますが (重みが同じであっても)、負荷は全体に分散されます。サーバー。

誰かがこれの良いphpのみの実装を提案できますか?

4

4 に答える 4

1

それを実装する方法は次のとおりです。

  1. あなたの場合、すべての空のスペースの配列を分数として作成します{0.5、0.5、1.0}
  2. 重みの2番目の配列を作成します-最初の配列で表されるように、サーバーのスペースの量をスペースの合計量で割ったもの-{0.25、0.25、0.5}
  3. 1.0 * mt_rand()/ mt_getmaxrand()を呼び出して、(0.0,1.0)に正規化された乱数を取得します
  4. 次のループを実行します。

    $total_weight = 0.0;
    for ( $i = 10; $i <= sizeof($weights); $i++) {
      $total_weight += #weights[$i];
      if($rand <= $total_weight) {
    return $i;
      }
    }
    

戻り値はサーバーのインデックスです

于 2009-06-17T19:48:40.983 に答える
1

あなたは分散ファイルシステムの世界に足を踏み入れました。これは、おそらく予想していたよりも大きな問題領域です。

この分野では多くの作業/研究が行われてきました。MogileFSのような利用可能なソリューションの使用を検討するか、少なくとも、遭遇した問題 (およびまだ遭遇していない問題) をどのように解決したかを調査する必要があります。

「まだ遭遇したことのない問題」の例として、実際にはすべてのファイルの少なくとも 2 つのコピーを保存する必要があるのではないでしょうか。それ?もちろん、それをやり始めたら、パフォーマンスを向上させるために、複数のサーバーから 1 つのファイルの一部を同時に読み取れるようにすべきではありませんか? そしてもちろん、ファイルがどのように分散されるか、サーバーに障害が発生したとき、新しいサーバーがオンラインになったときにファイルが分散される方法などを理解する必要があります。

これを正しく行うのは複雑です。回避できる場合は、車輪の再発明をしないでください。また、車輪を再発明する必要がある場合は、少なくとも他の人がどのように車輪を構築したかを調べることに時間を費やしてください。

于 2009-06-17T22:40:40.730 に答える