2012-01-08 30 views
5

給定三個服務器,其中A可以處理50%的通信量,B可以處理30%的通信量,而C可以​​處理20%的通信量,具有公式有效分配負載。服務器的當前負載也是該函數的輸入。找到裝載量最小的服務器

我不能想出他所要求的「公式」。這個問題有沒有具體的答案?

+0

我似乎回想起幾個月前在SO上提出的這個問題。可能已被遷移到ServerFault。我總是好奇答案是什麼。 – selbie 2012-01-08 05:06:43

+0

這個問題的標題稱爲「找到最少加載的服務器」,但文本意味着提出一個負載平衡算法?無論如何,如果當前的負載是等式的輸入,那麼爲什麼不是答案,「選擇最少的負載服務器」。負載和流量是不是意味着同樣的事情? – selbie 2012-01-08 05:13:44

+0

我假設您使用網絡連接數/流量來計算每個服務器當前負載,然後將新連接路由到具有最小負載的服務器? – 2012-01-08 05:21:11

回答

5

有幾種不同的方式來分配可能適用的負載。

情況1成比例地偏壓到每個服務器負載隨機分配:

for each request 
    let x = uniformly distributed random number between 0 and 1 
    if x <= 0.5 
    goto A 
    else if x <= 0.8 
    goto B 
    else 
    goto C 

情況2輪轉比例偏壓到每個服務器負載:

let x = new list 
push A on x 5 times 
push B on x 3 times 
push C on x 2 times 

for each request 
    y = pop x 
    goto y 
    push y to back of x 

情況3忘掉應該容量和輪詢電流負載

let La = A, load of A 
let Lb = B, load of B 
let Lc = C, load of C 

goto argmin (La,Lb,Lc) 
2

基本上,計算相對成本ser在每個服務器上,並且在一個小的固定時間段內,將發送到所述服務器的請求的總成本相加。例如:

Cost_A = 20/50 
Cost_B = 20/30 
Cost_C = 20/20 

Running_Total_A = 0 
Running_Total_B = 0 
Running_Total_c = 0 

while true: 
    If One minute has passed: 
    Running_Total_A = 0 
    Running_Total_B = 0 
    Running_Total_c = 0 

    IF (Min(Running_Total_A,Running_Total_B,Running_Total_C) == Running_Total_A): 
    Running_Total_A += Cost_A 
    RouteTo(A) 
    ELSE IF (Min(Running_Total_A,Running_Total_B,Running_Total_C) == Running_Total_B): 
    Running_Total_B += Cost_B 
    RouteTo(B) 
    ELSE IF (Min(Running_Total_A,Running_Total_B,Running_Total_C) == Running_Total_C): 
    Running_Total_C += Cost_C 
    RouteTo(C)