LVS算法
LVS使用的另外一種算法,它的算法的介紹可以參考它的網(wǎng)站的wiki。
算法用偽代碼表示如下:
1234567891011121314151617181920Supposing that there is a server set S = {S0, S1, …, Sn-1};W(Si) indicates the weight of Si;i indicates the server selected last time, and i is initialized with -1;cw is the current weight in scheduling, and cw is initialized with zero; max(S) is the maximum weight of all the servers in S;gcd(S) is the greatest common divisor of all server weights in S;while (true) { i = (i + 1) mod n; if (i == 0) { cw = cw - gcd(S); if (cw <= 0) { cw = max(S); if (cw == 0) return NULL; } } if (W(Si) >= cw) return Si;}可以看到它的代碼邏輯比較簡(jiǎn)單,所以性能也很快,但是如果服務(wù)器的權(quán)重差別較多,就不會(huì)像Nginx那樣比較平滑,可以在短時(shí)間內(nèi)對(duì)權(quán)重很大的那臺(tái)服務(wù)器壓力過(guò)大。
使用weighted庫(kù)和上面一樣簡(jiǎn)單,只是把類型W
換成W2
即可:
性能比較
可以看到,上面兩種方法的使用都非常的簡(jiǎn)單,只需生成一個(gè)相應(yīng)的W
對(duì)象,然后加入服務(wù)器和對(duì)應(yīng)的權(quán)重即可,通過(guò)Next
方法就可以獲得下一個(gè)服務(wù)器。
如果服務(wù)器的權(quán)重差別很大,出于平滑的考慮,避免短時(shí)間內(nèi)會(huì)對(duì)服務(wù)器造成沖擊,你可以選擇Nginx的算法,如果服務(wù)器的差別不是很大,可以考慮使用LVS的算法,因?yàn)闇y(cè)試可以看到它的性能要好于Nginx的算法:
12BenchmarkW1_Next-4 20000000 50.1 ns/op 0 B/op 0 allocs/opBenchmarkW2_Next-4 50000000 29.1 ns/op 0 B/op 0 allocs/op實(shí)際上兩者的性能都非常的快,十個(gè)服務(wù)器的每次調(diào)度也就是幾十納秒的級(jí)別,而且沒(méi)有額外的對(duì)象分配,所以無(wú)論使用哪種算法,這個(gè)調(diào)度不應(yīng)成為你整個(gè)系統(tǒng)的瓶頸。