在互聯網發展呢的今天,咱們通常會把多臺機器組成一個集羣對外提供服務。然而,咱們的網站對外提供的訪問入口都是一個的,好比 www.baidu.com 那麼當用戶在瀏覽器輸入 www.baidu.com 的時候如何將用戶的請求分發到集羣中不一樣的機器上呢,這就是負載均衡在作的事情。html
負載均衡的分類
負載均衡就是一種計算機網絡技術,用來在多個計算機(計算機集羣)、網絡鏈接、CPU、磁碟驅動器或其餘資源中分配負載,以達到最佳化資源使用、最大化吞吐率、最小化響應時間、同時避免過載的目的。那麼,這種計算機技術的實現方式有多種。大體能夠分爲如下幾種,其中最經常使用的是四層和七層負載均衡:算法
請求到達後,將客戶端發送到負載均衡器的請求依次輪流地轉發給服務集羣的某個節點。數據庫
優勢:實現簡單,每一個集羣節點平均分擔全部的請求。後端
缺點:當集羣中服務器硬件配置不一樣、性能差異大時,沒法區別對待。引出下面的算法。瀏覽器
隨機(Random)隨機選取集羣中的某個節點來處理該請求,由機率論的知識可知,隨着請求量的變大,隨機算法會逐漸演變爲輪詢算法,即集羣各個節點會處理差很少數量的請求。服務器
優勢:簡單使用,不須要額外的配置和算法。cookie
缺點:隨機數的特色是在數據量大到必定量時才能保證均衡,因此若是請求量有限的話,可能會達不到均衡負載的要求。網絡
加權加權算法主要是根據集羣的節點對應機器的性能的差別,給每一個節點設置一個權重值,其中性能好的機器節點設置一個較大的權重值,而性能差的機器節點則設置一個較小的權重值。權重大的節點可以被更多的選中。它是和隨機、輪訓一塊兒使用的。session
優勢:能夠根據機器的具體狀況,分配不一樣的負載,達到能者多勞。架構
缺點:須要額外管理加權係數。
最小鏈接數主要是根據集羣的每一個節點的當前鏈接數來決定將請求轉發給哪一個節點,即每次都將請求轉發給當前存在最少併發鏈接的節點。
優勢:能夠根據集羣節點的負載狀況來進行請求的動態分發,即機器性能好,處理請求快,積壓請求少的節點分配更多的請求。避免某個節點由於處理超過自身所能承受的請求量而致使宕機或者響應過慢。
hash將對請求的IP地址或者URL計算一個哈希值,而後與集羣節點的數量進行取模來決定將請求分發給哪一個集羣節點。它不是真正意義上的負載均衡,在某些意義上也是一個單點服務。
優勢:實現簡單
缺點:若是某個節點掛了,會使得一部分流量不可用。
負載均衡分類 1. 硬件負載均衡常見的硬件有比較昂貴的F5和Array等商用的負載均衡器,它的優勢簡單,有專業的人負責;缺點就是 貴 若是你是土豪,能夠考慮,可是對於規模較小的網絡服務來講暫時尚未須要使用。
2. 軟件負載均衡目前使用最普遍的三種負載均衡軟件Nginx/LVS/HAProxy,他們都是開源免費的負載均衡軟件,這些都是經過軟件級別來實現,因此費用較低。足以見得,搞軟件的是多麼不值錢!
3. 成熟的架構負載均衡業界早已有成熟的架構,比較經常使用的有LVS+Keepalived、Nginx+Keepalived、HAProxy+Keepalived。
常見負載均衡軟件 Nginx
Nginx的負載均衡支持:
rr:輪叫,輪流分配到後端服務器; wrr:權重輪叫,根據後端服務器負載狀況來分配; lc:最小鏈接,分配已創建鏈接最少的服務器上; wlc:權重最小鏈接,根據後端服務器處理能力來分配。
Nginx優勢:
1.簡單:安裝和配置比較簡單、測試也簡單 2.穩定:單機通常能支撐幾萬次的併發量 3.輕量:能ping通就就能進行負載功能 4.易用:明確的錯誤碼、超時提醒 5.強大:負載均衡、反向代理、WEB容器等功能
Nginx缺點:
1.僅能支持http、https和Email協議 2.對後端服務器的健康檢查, 只支持經過端口來檢測,不支持經過url來檢測 roundrobin:輪詢,輪流分配到後端服務器; static-rr:根據後端服務器性能分配; leastconn:最小鏈接者優先處理; source:根據請求源IP,與Nginx的IP_Hash相似。LVS
LVS的負載均衡支持:
roundrobin:輪詢,輪流分配到後端服務器; static-rr:根據後端服務器性能分配; leastconn:最小鏈接者優先處理; source:根據請求源IP,與Nginx的IP_Hash相似。
LVS優勢:
1.高效:工做在網絡4層之上 僅做分發之用,沒有流量的產生,這個特色也決定了它在負載均衡軟件裏的性能最強的 ,對內存和cpu資源消耗比較低 2.易用:配置性比較低,簡化操做成本 3.穩定:自己抗負載能力很強,自身有完整的雙機熱備方案 4.應用廣:由於LVS工做在4層,因此它幾乎能夠對全部應用作負載均衡,包括http、tcp、數據庫、在線聊天室等
LVS缺點:
1.不能作動靜分離 2.大型網站LVS+Keepalived實施起來就比較複雜,配置成本高HAProxy
HAProxy負載均衡策略很是多,包括:
roundrobin,表示簡單的輪詢,這個很少說,這個是負載均衡基本都具有的; static-rr,表示根據權重,建議關注; leastconn,表示最少鏈接者先處理,建議關注; source,表示根據請求源IP,這個跟Nginx的IP_hash機制相似,咱們用其做爲解決session問題的一種方法,建議關注; ri,表示根據請求的URI; rl_param,表示根據請求的URl參數’balance url_param’ requires an URL parameter name; hdr(name),表示根據HTTP請求頭來鎖定每一次HTTP請求; rdp-cookie(name),表示根據據cookie(name)來鎖定並哈希每一次TCP請求。
HAProxy的優勢可以補充Nginx的一些缺點, 好比支持Session的保持,Cookie的引導;同時支持經過獲取指定的url來檢測後端服務器的狀態。
HAProxy跟LVS相似,自己就只是一款負載均衡軟件;單純從效率上來說HAProxy會比Nginx有更出色的負載均衡速度,在併發處理上也是優於Nginx的。
支持TCP協議的負載均衡轉發,能夠對MySQL讀進行負載均衡,對後端的MySQL節點進行檢測和負載均衡。
常見微服務框架的負載均衡 Dubbo支持4種算法(隨機、輪詢、活躍度、Hash一致性),並且算法裏面引入權重的概念。
SpringCloud Feign支持不少種算法,包括:輪詢、隨機、最小鏈接、區域加權、重試以及ResponseTime加權。也能夠本身實現負載均衡算法