通過系統隨機函式,根據後端伺服器列表的大小值來隨機選取其中一台進行訪問。由概率統計理論可以得知,隨著呼叫量的增大,其實際效果越來越接近於平均分配流量到每一台後端伺服器,也就是輪詢的效果
public
class randomtest
}private
static synchronized string get()
}
基於概率統計的理論,吞吐量越大,隨機演算法的效果越接近於輪詢演算法的效果。因此基本可以替代輪詢演算法
與加權輪詢法類似,加權隨機法也根據後端伺服器不同的配置和負載情況,配置不同的權重。不同的是,它是按照權重來隨機選取伺服器的,而非順序
/**
* 實現方法一
*/public
static string testweightrandom()
}random random = new random();
int randompos = random.nextint(serverlist.size());
string server = serverlist.get(randompos);
return server;
}/**
* 實現方法二
*/public
static string testweightrandom()
// 產生隨機數
long random = math.round(math.random() * weightsum);
long weight = 0;
for (string server : servermap.keyset())
}return servermap.keyset().iterator().next();
}
輪詢演算法(round-robin)
輪詢演算法是最簡單的一種負載均衡演算法。它的原理是把來自使用者的請求輪流分配給內部的伺服器:從伺服器1開始,直到伺服器n,然後重新開始迴圈。
演算法的優點是其簡潔性,它無需記錄當前所有連線的狀態,所以它是一種無狀態排程;
輪詢演算法假設所有伺服器的處理效能都相同,不關心每台伺服器的當前連線數和響應速度。當請求服務間隔時間變化比較大時,輪詢演算法容易導致伺服器間的負載不平衡。所以此種均衡演算法適合於伺服器組中的所有伺服器都有相同的軟硬體配置並且平均服務請求相對均衡的情況
偽**:
public
class loadbalancetest
}private
static synchronized string loadbalanceofround()
return list.get(roundpos++);
}static
}
加權輪詢演算法(weightedround-robin)
輪詢演算法並沒有考慮每台伺服器的處理能力,實際中可能並不是這種情況。由於每台伺服器的配置、安裝的業務應用等不同,其處理能力會不一樣。所以加權輪詢演算法的原理就是:根據伺服器的不同處理能力,給每個伺服器分配不同的權值,使其能夠接受相應權值數的服務請求;
加權輪詢演算法要生成乙個伺服器序列,該序列中包含n個伺服器。n是所有伺服器的權重之和。在該序列中,每個伺服器的出現的次數,等於其權重值。並且,生成的序列中,伺服器的分布應該盡可能的均勻。比如序列中,前五個請求都會分配給伺服器a,這就是一種不均勻的分配方法,更好的序列應該是:。
加權輪詢演算法又可分為:
源位址雜湊的思想是獲取客戶端訪問的 ip 位址值,通過雜湊函式計算得到乙個數值,用該數值對伺服器列表的大小進行取模運算,得到的結果邊是要訪問的伺服器的序號。採用雜湊法進行負載均衡,同一 ip 位址的客戶端,當後端伺服器列表不變時,它每次都會對映到同一台後端伺服器進行訪問
public
class randomtest
}private
static synchronized string get(string ip)
}
通過引數傳入的客戶端 remoteip 引數,取得它的雜湊值,對伺服器列表的大小取模,結果便是選用的伺服器在伺服器列表中的索引值。該演算法保證了相同的客戶端 ip 位址將會被「雜湊」到同一台後端伺服器,直到後端伺服器列表變更。根據此特性可以在服務消費者與服務提供者之間建立有狀態的 session 會話
hash演算法中,存在以下的幾個問題
1.當一台伺服器宕機了或者新新增一台機器之後,這個時候hashcode % servers.size()需要重新計算hash值, 如果在快取的環境中,所有的請求都會湧向資料庫伺服器,給資料庫伺服器帶來巨大的壓力,可能導致整個系統不可用,形成雪崩效應;
2 .當新增了一台效能強的機器後,利用上述的hash演算法無法讓,新增的效能強的伺服器多承擔壓力;
基於上面的幾個問題,提出了hash演算法的改進:一致性hash演算法
最小連線數演算法比較靈活和智慧型,由於後端伺服器的配置不盡相同,對於請求的處理有快有慢,它正是根據後端伺服器當前的連線情況,動態地選取其中當前積壓連線數最小的一台伺服器來處理當前請求,盡可能地提高後端伺服器的利用效率,將負載合理地分流到每一台機器。由於最小連線數涉及伺服器連線數的彙總和感知,設計與實現比較繁瑣。
負載均衡演算法總結
思路 1 用集合list或者set儲存全部的資源。2 產生乙個隨機數。3 隨機數在0 list.size 1 返回之中 4 返回list.get 隨機數 思路 1 用集合list或者set儲存全部的資源。2 初始化乙個計數器num 0。3 得到本次的資源list.get num 1 list.siz...
負載均衡演算法
輪循演算法 roundrobin 說明 每一次來自網路的請求輪流分配給內部中的每台伺服器,從1至n然後重新開始 舉例 適合於伺服器組中的所有伺服器都有相同的軟硬體配置並且平均服務請求相對均衡的情況 最少連線演算法 leastconnection 說明 客戶端的每一次請求服務在伺服器停留的時間都可能會...
負載均衡演算法
網際網路分布式系統中,很多服務是資料儲存相關的,海量訪問量下,直接訪問儲存介質是抗不住的,需要使用cache,cache集群的負載均衡演算法就成為乙個重要的話題,這裡對現有的負載均衡演算法進行一些總結。btw 雖然是cache負載均衡演算法小結,其實可以說是負載均衡演算法小結,只是針對cache應用...