您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)負(fù)載均衡的算法有哪些的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
1. 源地址哈希算法
唯一不丟失策略的算法,但是負(fù)載均衡和源數(shù)據(jù)信息和哈希算法有很大關(guān)系。
源地址哈希法的思想是根據(jù)服務(wù)消費者請求客戶端的 IP 地址,通過哈希函數(shù)計算得到一個哈希值,將此哈希值和服務(wù)器列表的大小進行取模運算,得到的結(jié)果便是要訪問的服務(wù)器地址的序號。采用源地址哈希法進行負(fù)載均衡,相同的 IP 客戶端,如果服務(wù)器列表不變,將映射到同一個后臺服務(wù)器進行訪問。
還是之前的操作,偽代碼:
private static Map<String, Integer> serviceWeightMap = new HashMap<String, Integer>(); static { serviceWeightMap.put("192.168.1.100", 1); serviceWeightMap.put("192.168.1.101", 1); serviceWeightMap.put("192.168.1.102", 4); serviceWeightMap.put("192.168.1.103", 1); } public static String testConsumerHash(String remoteIp) { Map<String, Integer> serverMap = new HashMap<String, Integer>(); serverMap.putAll(serviceWeightMap); //取得IP地址list Set<String> keySet = serverMap.keySet(); ArrayList<String> keyList = new ArrayList<String>(); keyList.addAll(keySet); int hashCode = remoteIp.hashCode(); int pos = hashCode % keyList.size(); return keyList.get(pos); }
這段代碼來自 Will.Shun 所寫,我當(dāng)時看到的時候也不是很明白什么意思,后來看了一下,其實和它的解釋很類似,通過哈希函數(shù)計算得到一個哈希值,將此哈希值和服務(wù)器列表的大小進行取模運算,得到的結(jié)果便是要訪問的服務(wù)器地址的序號。
2. 加權(quán)輪詢算法
再來看一下加權(quán)輪訓(xùn)算法,我們先看一下在 Nginx 里面進行的權(quán)重配置:
http { upstream cluster { server a weight=1; server b weight=2; server c weight=3; }
假如 Nginx 每收到 6 個客戶端的請求,會把其中的 1 個轉(zhuǎn)發(fā)給后端 a,把其中的 2 個轉(zhuǎn)發(fā)給后端 b,把其中的 3 個轉(zhuǎn)發(fā)給后端 c。
加權(quán)輪詢算法的結(jié)果,就是要生成一個服務(wù)器序列。每當(dāng)有請求到來時,就依次從該序列中取出下一個服務(wù)器用于處理該請求。
加權(quán)輪訓(xùn)算法偽代碼:
private static Map<String, Integer> serviceWeightMap = new HashMap<String, Integer>(); static { serviceWeightMap.put("192.168.1.100", 1); serviceWeightMap.put("192.168.1.101", 1); serviceWeightMap.put("192.168.1.102", 4); serviceWeightMap.put("192.168.1.103", 1); } public static String testWeightRoundRobin() { // 重新創(chuàng)建一個map,避免出現(xiàn)由于服務(wù)器上線和下線導(dǎo)致的并發(fā)問題 Map<String, Integer> serverMap = new HashMap<String, Integer>(); serverMap.putAll(serviceWeightMap); //取得IP地址list Set<String> keySet = serverMap.keySet(); Iterator<String> it = keySet.iterator(); List<String> serverList = new ArrayList<String>(); while (it.hasNext()) { String server = it.next(); Integer weight = serverMap.get(server); for (int i=0; i<weight; i++) { serverList.add(server); } } String server = null; synchronized (pos) { if (pos > serverList.size()) { pos = 0; } server = serverList.get(pos); pos++; } return server; }
其實在 加權(quán)輪訓(xùn)算法中,是有缺陷的,在某些特殊的權(quán)重下,加權(quán)輪詢調(diào)度會生成不均勻的實例序列,這種不平滑的負(fù)載可能會使某些實例出現(xiàn)瞬時高負(fù)載的現(xiàn)象,導(dǎo)致系統(tǒng)存在宕機的風(fēng)險。而為了解決這個調(diào)度的缺陷,后邊就有平滑加權(quán)輪訓(xùn)調(diào)度,有興趣的同學(xué)一定要去看一下這個平滑加權(quán)輪訓(xùn)。
3. 加權(quán)隨機算法
加權(quán)隨機法跟加權(quán)輪詢法類似,根據(jù)后臺服務(wù)器不同的配置和負(fù)載情況,配置不同的權(quán)重。不同的是,它是按照權(quán)重來隨機選取服務(wù)器的,而非順序。
private static Map<String, Integer> serviceWeightMap = new HashMap<String, Integer>(); static { serviceWeightMap.put("192.168.1.100", 1); serviceWeightMap.put("192.168.1.101", 1); serviceWeightMap.put("192.168.1.102", 4); serviceWeightMap.put("192.168.1.103", 1); } public static String testWeightRandom() { // 重新創(chuàng)建一個map,避免出現(xiàn)由于服務(wù)器上線和下線導(dǎo)致的并發(fā)問題 Map<String, Integer> serverMap = new HashMap<String, Integer>(); serverMap.putAll(serviceWeightMap); //取得IP地址list Set<String> keySet = serverMap.keySet(); List<String> serverList = new ArrayList<String>(); Iterator<String> it = keySet.iterator(); while (it.hasNext()) { String server = it.next(); Integer weight = serverMap.get(server); for (int i=0; i<weight; i++) { serverList.add(server); } } Random random = new Random(); int randomPos = random.nextInt(serverList.size()); String server = serverList.get(randomPos); return server; }
這里不同的地方就是服務(wù)器是通過隨機算法獲取。
其實我們可以想一個實例:比如說在以下場景:有一個集合 S,里面比如有 A,B,C,D 這四項。這時我們想隨機從中抽取一項,但是抽取的概率不同,比如我們希望抽到 A 的概率是 50%,抽到 B 和 C 的概率是 20%,D 的概率是 10%。一般來說,我們可以給各項附一個權(quán)重,抽取的概率正比于這個權(quán)重。
4.HTTP 國際化
HTTP 報文中可以承載以任何語言表示的內(nèi)容,就像它能承載圖像、影片,或任何類型的 媒體那樣。對 HTTP 來說,實體主體只是二進制信息的容器而已。
為了支持國際性的內(nèi)容,服務(wù)器需要告知客戶端每個文檔的字母表和語言,這樣客戶端才 能正確地把文檔中的信息解包為字符并把內(nèi)容呈現(xiàn)給用戶。
服務(wù)器通過 HTTP 協(xié)議的 Content-Type 首部中的 charset 參數(shù)和 Content-Language 首部告知客戶端文檔的字母表和語言。這些首部描述了實體主體的“信息盒子”里面裝的是 什么,如何把內(nèi)容轉(zhuǎn)換成合適的字符以便顯示在屏幕上以及里面的詞語表示的是哪種語言。
同時,客戶端需要告知服務(wù)器用戶理解何種語言,瀏覽器上安裝了何種字母表編碼算法??蛻舳税l(fā)送 Accept-Charset 首部和 Accept-Language 首部,告知服務(wù)器它理解哪些字 符集編碼算法和語言以及其中的優(yōu)先順序。
感謝各位的閱讀!關(guān)于“負(fù)載均衡的算法有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。