2014-05-12 31 views
1

我正在處理託管用戶的服務器羣集,這些用戶每個都會產生重要但負載不同的負載。對於每個用戶,我有一個負載指標。每臺服務器都可以託管多個用戶,直至達到最大負載限制。例如:部分加載的服務器之間的遷移負載分配

User | Server | Load 
-------------------- 
A |  10 | 107 
B |  10 | 59 
C |  11 | 341 
D |  11 | 95 
E |  12 | 88 
F |  12 | 215 

服務器負載10 = 166,服務器負載11 = 436,和服務器負載12 = 303,我在一個PHP腳本,將從一個羣集遷移客戶到另一個,並且需要分發工作目標服務器中的用戶。

優選地,用戶將被添加到服務器10(最少加載),直到它大致等於服務器12(第二最少加載)。然後,用戶將被添加到10和12,直到他們等於11.一旦所有服務器的負載均衡,遷移的用戶將被均勻分配。

如上所述,我使用PHP。用戶和服務器數據在下面的表格來自於一個數據庫:

$users = Array ([0] => Array ([user] => 'A', [server] => '10', [load] => 107), [1] => ... etc 
$servers = Array ([0] => Array ([server] => '10', [load] => 166), [1] => ... etc 

我可以利用一些幫助設計一個功能(甚至只是概念上)從一個羣集遷移到另一個時,服務器之間分配用戶。雖然我的例子很簡單,但我正在數十個羣集中數以百計的服務器上與數以萬計的用戶合作。

回答

0

我找到了一個很好的解決方案。這個複雜的因素實際上是由於數據的結構。爲了平均分配用戶,我首先將服務器數據轉換爲單個數組(密鑰)(服務器)=>值(加載)對。

//Input like: Array ([0]=>Array([server]=>'10',[load]=>166),[1]=>Array([server]=>'11',[load]=>'436'), ...) 
function rekey ($multiArray, $key, $value) { 
    $newArray = Array(); 
    foreach ($multiArray as $array) { 
     $newArray[$array[$key]] = $array[$value]; 
    } 
    return $newArray; 
    //Output like: Array([10]=>'166', [11]=>'436', [12]=>'303') 
} 

一旦轉換完畢,我就可以使用PHP min內建的。

function loadDistribute ($users, $servers) { 
    $len = sizeof($users); //Find the length of the users array 
    for ($i = 0; $i < $len; $i++) { //Using traditional for loop to make index available 
     $server = array_keys($servers, min($servers)); //Get the key (server-id) for the least loaded server 
     $users[$i]['server'] = $server[0]; //Change the assigned server for the user 
     $servers[$server[0]] += $users[$i]['load']; //Add the users load to the server 
    } 
    return $users; 
} 

一旦與我的其他代碼實現,輸出是這樣的:

User Z (load 652) assigned to server 10 
User Y (load 0) assigned to server 12 
User X (load 35) assigned to server 12 
User W (load 311) assigned to server 12 
User V (load 98) assigned to server 11 

你可以看到,這是工作,因爲連續3個用戶被分配到服務器12 - 直到服務器12人的負荷超過11人,不斷接受用戶。