7

分散ファイルシステムでのファイルの可用性の数学的モデルを構築しようとしています。この質問をMathOverflowに投稿しましたが、これはCS質問として分類される可能性もあるので、ここでも試してみます。

システムは次のように機能します。ノードは、r * bリモートノードにファイル(イレイジャーコードを使用してエンコード)を格納します。ここで、rはレプリケーション係数、bは整数定数です。イレイジャーコーディングされたファイルには、少なくともb個のリモートノードが使用可能であり、ファイルの一部を返す場合にファイルを復元できるという特性があります。

これに対する最も簡単なアプローチは、すべてのリモートノードが互いに独立しており、同じ可用性pを持っていると想定することです。これらの仮定では、ファイルの可用性は二項分布に従います。二項分布

残念ながら、このペーパーで示されているように、これら2つの仮定は、無視できないエラーを引き起こす可能性があります: http ://deim.urv.cat/~lluis.pamies/uploads/Main/icpp09-paper.pdf 。

すべてのノードが同じ可用性を持っているという仮定を克服する1つの方法は、利用可能な/利用できないノードの可能な各組み合わせの確率を計算し、これらすべての結果の合計を取得することです(これは、上記の論文で示唆されているようなものです。私が今説明したものよりも正式に)。このアプローチは、深さr * bの二分木として見ることができ、各リーブは、使用可能なノードと使用できないノードの1つの可能な組み合わせです。ファイルの可用性は、>=bの使用可能なノードで休暇に到達する確率と同じです。このアプローチはより正確ですが、計算コストはOrdo​​です。また、ノードの独立性の仮定は扱いません。

二項分布近似よりも誤差が少なく、計算コストが優れている、優れた近似のアイデアはありますか?

各ノードのavailability-dataは、で構成されるタプルのセットであると想定できます(measurement-date, node measuring, node being measured, succes/failure-bit)。このデータを使用して、たとえば、ノード間の可用性と可用性の分散の相関関係を計算できます。

4

2 に答える 2

5

大規模rで、bモンテカルロ積分と呼ばれる方法を使用できます。たとえば、ウィキペディア(および/またはSICPの3.1.2章)のモンテカルロ積分を参照して、合計を計算してください。小さくrb大幅に異なるノード障害確率p[i]の場合、正確な方法が優れています。の正確な定義は、いくつかの要因に依存し、実験的に試すのが最適です。

特定のサンプルコード:これは、このような手順がどのように機能するかを示すための非常に基本的なサンプルコード(Python)です。

def montecarlo(p, rb, N):
    """Corresponds to the binomial coefficient formula."""
    import random
    succ = 0

    # Run N samples
    for i in xrange(N):
        # Generate a single test case
        alivenum = 0
        for j in xrange(rb):
            if random.random()<p: alivenum += 1
        # If the test case succeeds, increase succ
        if alivenum >= b: succ += 1
    # The final result is the number of successful cases/number of total cases
    # (I.e., a probability between 0 and 1)
    return float(succ)/N

この関数は二項検定ケースに対応し、テストを実行して、ノード外のノードが失敗の確率で生きているNかどうかをチェックします。いくつかの実験では、妥当な結果を得る前に数千のサンプルの範囲の値が必要であることがわかりますが、原則として複雑さはです。結果の精度は次のようにスケーリングされます。つまり、精度を2倍に上げるには、4倍に増やす必要があります。十分に大きい場合、この方法は明らかに優れています。br*bpNO(N*r*b)sqrt(N)Nr*b

近似の拡張:システムのすべてのプロパティを尊重するように、テストケースを設計する必要があることは明らかです。いくつかの拡張機能を提案しましたが、そのうちのいくつかは簡単に実装できますが、他の拡張機能は実装できません。いくつかの提案をさせてください。

1)明確であるが無相関の場合p[i]、上記のコードの変更は最小限です。関数ヘッドで、単一のfloatの代わりに配列を渡し、p行を次のように置き換えますif random.random()<p: alivenum += 1

if random.random()<p[j]: alivenum += 1

2)相関の場合p[i]、システムに関する追加情報が必要です。コメントで言及していた状況は、次のようなネットワークである可能性があります。

A--B--C
   |  |
   D  E
   |
   F--G--H
      |
      J

この場合A、「ルートノード」である可能性があり、ノードの障害は、ノード、、、および;Dの確率が100%の自動障害を意味する可能性があります。一方、ノードの障害は自動的にダウンするなどです。少なくとも、これは私のコメントで言及したケースでした(元の質問で確率のツリー構造について話しているので、これはもっともらしい解釈です)。このような状況では、ツリー構造を参照してツリーをトラバースするコードを変更する必要があります。テストが失敗するとすぐに、現在のノードから下位のブランチをスキップします。もちろん、結果のテストは以前と同じかどうかです。FGHJFGHJpfor j in ...alivenum >= b

3)ネットワークがツリー構造で表すことができない閉路グラフである場合、このアプローチは失敗します。このような場合、最初にデッドまたはアライブのグラフノードを作成してから、グラフ上でルーティングアルゴリズムを実行して、一意で到達可能なノードの数をカウントする必要があります。これにより、アルゴリズムの時間計算量は増加しませんが、明らかにコードの複雑度は増加しません。

4)時間依存性は自明ではありませんが、mtbf / r(平均故障間隔/修理)がわかっている場合はp、ツリー構造または無相関線形の確率をp[i]次のように与えることができるため、変更が可能です。指数の合計。次に、MCプロシージャをさまざまな時間に実行し、に対応する結果を得る必要がありpます。

5)ログファイルだけを持っている場合(最後の段落で示唆されているように)、このボードでできることを超えたアプローチの大幅な変更が必要になります。pログファイルは、ネットワークグラフ(したがってのグラフ)のモデルと、のすべてのノードの個々の値を再構築できるように、十分に徹底している必要がありますp。そうしないと、精度が信頼できなくなります。これらのログファイルは、障害や修復のタイムスケールよりも大幅に長くする必要があります。これは、実際のネットワークでは現実的ではない可能性がある仮定です。

于 2010-06-28T17:20:15.290 に答える
2

各ノードが一定の既知の独立した可用性率を持っていると仮定すると、分割統治アプローチが思い浮かびます。

Nノードがあるとします。

  1. N/2それらを2セットのノードに分割します。
  2. それぞれの側について、任意の数のノード([0,N/2])がダウンしている確率を計算します。
  3. 必要に応じてこれらを乗算およ​​び合計して[0,N]、フルセットの任意の数()がダウンする確率を見つけます。

ステップ2は再帰的に実行でき、トップレベルでは、必要に応じて合計して、特定の数より多くの数がダウンしている頻度を見つけることができます。

これの複雑さはわかりませんが、推測する必要がある場合は、以下のように言いますO(n^2 log n)


このメカニズムは、ターミナルケースで説明できます。アップタイムのあるノードが5つあるとしますp1 ... p5Aこれをp1 ... p2Bのセグメントに分割できp3 ... p5ます。次に、これらを処理して、各セグメントの「Nノードアップ」時間を見つけます。

のために:

a_2

a_1

a_0

Bの場合:

b_3

b_2

この段階の最終結果は、a各「」に各「」を乗算し、b適切に合計することによって見つけることができます。

v[0] = a[0]*b[0]
v[1] = a[1]*b[0] + a[0]*b[1]
v[2] = a[2]*b[0] + a[1]*b[1] + a[0]*b[2]
v[3] =             a[2]*b[1] + a[1]*b[2] + a[0]*b[3]
v[4] =                         a[2]*b[2] + a[1]*b[3]
v[5] =                                     a[2]*b[3]
于 2010-06-30T04:42:47.797 に答える