dCache
に関する記事の続きでは、内部実装の詳細について説明します。
分散システムの重要なタスクの1つは、既存のノード間で負荷を分散する方法です。 分散ストレージの場合、書き込み段階での決定がデータの読み取り方法に影響するため、このタスクは特に重要です。
通常、一緒に記録されたデータは一緒に読み取られます。 前回の休暇の写真でも、科学実験の最新の結果でも。 この事実により、サーバーの1つにクライアントが蓄積するのを避けるために、着信データをできるだけ多くのノードに分散させる必要があります。 すべてのノードが同じサイズと同じ空きディスク容量を持っている場合、簡単に解決できる問題。 しかし、これは実際の状況ではまれです。 新規および大容量の場合、空き領域がすでに限界にあるときにサーバーが接続されます。
dCacheでは、これは2つのメカニズムを使用して解決
されます。記録時の
空き領域を考慮した重み付きランダム分布(重み付きランダム分布)と新しいノードの追加時のデータ再割り当て(リバランス)です。
そして、空きスペースを考慮に入れた重み付き任意分布の仕組み:
- 各ノードはweightを計算します 。これは、ノードの空きスペースの量をシステムの合計空きスペースで割った値に等しくなります。
重量= FreeN / FreeTotal - ノードの1つが任意に選択され、ノードを選択する確率はその重みに直接比例します
コードでは、次のようになります。
public Pool selectWritePool(Pool[] pools) { double[] weights = new double[pools.length]; long totalFree = 0; for (Pool pool:pools) { totalFree += pool.getFree(); } int i = 0; for (Pool pool:pools) { weights[i] = (double) pool.getFree() / totalFree; i++; } return pools[i]; } private final Random rand = new Random(); public static int weightetRandom(double[]weights, Random r) { double selection = r.nextDouble(); double total = 0; int i = 0; for (i = 0; (i < weights.length) && (total <= selection); i++) { total += weights[i]; } return i - 1; }
このメカニズムを使用すると、すべてのノードを使用できますが、より多くの空き領域があるノードを使用できます。 確率的サンプリングにより、特定のサーバーに書き込むという決定が異なるクライアントに対して同時に行われないことが保証されます。
前述のように、内部再バランスコマンドは同じアルゴリズムを使用してサーバー負荷を均等化します。 ダウンロードは、合計に対する空き領域の比率によって計算されます。
負荷= FreeN / TotalNこのアルゴリズムは、戦闘状態で実証されています。