常見負載均衡演算法

2021-10-07 07:39:37 字數 4560 閱讀 7418

思路:獲取隨機數,隨機數不大於服務集合的容量,將該隨機數當作下標,獲取ip

// 服務ip集合

private

static list

serverips = arrays.

aslist

("a"

,"b"

,"c"

,"d"

,"e");

public

static string random()

思路:建立乙個新的list,將含有權重值得ip重新存入集合,權重是多少,就存多少個,然後使用隨機演算法從改集合中獲取乙個ip

public

static string random()

} random random =

newrandom()

;int i = random.

nextint

(ips.

size()

);return ips.

get(i)

;}

思路:演算法2中如果權重值過大,新建的list值就會很多,嚴重消耗記憶體,因此通過比較大小的方式確定隨機數落在那個服務上;將各個服務的權重值看做數軸上的點,通過判斷隨機數落在那個區間內,從而確定選哪個服務

public

static string random()

// 獲取隨機數

random random =

newrandom()

; integer pos = random.

nextint

(totalweigh)

;// 遍歷含權重的服務集合

for(string ip : map.

keyset()

) pos = pos - integer;

}return"";

}

思路1:設定全域性下標,每次請求都+1

// 服務ip集合

private

static list

serverips = arrays.

aslist

("a"

,"b"

,"c"

,"d"

,"e");

// 輪詢下標

private

static

int pos =0;

public

static string roundrobin()

string ip = serverips.

get(pos)

; pos++

;return ip;

}

思路2:通過取模,獲取下標

// 服務ip集合

private

static list

serverips = arrays.

aslist

("a"

,"b"

,"c"

,"d"

,"e");

// 原子計數器

private

static atomicinteger atomicnum =

newatomicinteger(0

);public

static string roundrobin()

思路:建立新list,根據權重值將ip新增到新list中,然後通過簡單輪詢獲取ip。

缺點:當權重值過大時,list過大,嚴重消耗記憶體

// 輪詢下標

private

static

int pos =0;

public

static string roundrobin()

}if(pos >= iplist.

size()

) string ip = iplist.

get(pos)

; pos++

;return ip;

}

思路:記錄請求次數,用請求次數模上總權重,然後判斷該值落在座標軸上的哪個範圍

/**

* 請求計數器

*/private

static atomicinteger atomicnum =

newatomicinteger(0

);public

static string roundrobin()

// 獲取請求計數器值

int pos = atomicnum.

getandadd(1

);// 取模

int inx = pos % totalweigh;

// 迴圈判斷,如果餘數小於ip的權重值,就返回ip

for(string ip : map.

keyset()

) inx = inx - weigh;

}return"";

}

思路:引入靜態權重、動態權重概念

假設現在有3臺服務:

伺服器 | 權重 | 動態權重

—|--- | —

a | 5 | 0

b | 1 | 0

c | 1 | 0

演算法介紹:

說明演算法公式

1. 計算總權重totalweigh

totalweigh = weigh + … + weigh

2.計算currentweigh值,初始為0

currentweigh = currentweigh + weigh

3.獲取currentweigh最大值

max(currentweigh )

4.返回ip

返回currentweigh最大值對應的服務ip

5.修改最大權重值 currentweigh - 總權重,其它不變

max(currentweigh ) - totalweigh

執行結果:

執行次數

計算currentweigh值

獲取currentweigh最大值

返回ip

修改最大currentweigh

15,1,15a

-2,1,1

23,2,23a

-4,2,2

31,3,33b

1,-4,3

46,-3,46a

-1,-3,4

54,-2,55c

4,-2,-2

69,-1,-19a

2,-1,-1

77,0,07a

0,0,0

/**

* 服務

*/public

class

serverip

}

/**

* 權重物件

*/public

class

weigh

public

void

setip

(string ip)

public integer getweigh()

public

void

setweigh

(integer weigh)

public integer getcurrentweigh()

public

void

setcurrentweigh

(integer currentweigh)

public

weigh

(string ip, integer weigh, integer currentweigh)

public

class

roundrobin);

}// 2、迴圈計算currentweigh值,公式:currentweigh = weigh + currentweigh

for(weigh weigh : weighlist)

// 3、獲取currentweigh最大值

weigh maxweigh = null;

for(weigh weigh : weighlist)

}// 修改最大權重值,公式:currentweigh - 總權重

maxweigh.

setcurrentweigh

(maxweigh.

getcurrentweigh()

- totalweigh)

;return maxweigh.

getip()

;}}

常見負載均衡演算法

隨著系統日益龐大 邏輯業務越來越複雜,系統架構由原來的單一系統到垂直系統,發展到現在的分布式系統。分布式系統中,可以做到公共業務模組的高可用,高容錯性,高擴充套件性,然而,當系統越來越複雜時,需要考慮的東西自然也越來越多,要求也越來越高,比如服務路由 負載均衡等。此文將針對負載均衡演算法進行講解,不...

常見負載均衡演算法

輪詢很容易實現,將請求按順序輪流分配到後台伺服器上,均衡的對待每一台伺服器,而不關心伺服器實際的連線數和當前的系統負載。這裡通過例項化乙個serviceweightmap的map變數來伺服器位址和權重的對映,以此來模擬輪詢演算法的實現,其中設定的權重值在以後的加權演算法中會使用到,這裡先不做過多介紹...

常見負載均衡演算法

輪詢法是負載均衡中最常用的演算法,它容易理解也容易實現。輪詢法是指負載均衡伺服器 load balancer 將客戶端請求按順序輪流分配到後端伺服器上,以達到負載均衡的目的。假設現在有6個客戶端請求,2台後端伺服器。當第乙個請求到達負載均衡伺服器時,負載均衡伺服器會將這個請求分派到後端伺服器1 當第...