要解決高併發問題,先要了解負載均衡。什麼是負載均衡?
當一臺伺服器的效能達到極限時,我們可以使用伺服器叢集來提高網站的整體效能。那麼,在伺服器叢集中,需要有一臺伺服器充當排程者的角色,使用者的所有請求都會首先由它接收,排程者再根據每臺伺服器的負載情況將請求分配給某一臺後端伺服器去處理。
那麼在這個過程中,排程者如何合理分配任務,保證所有後端伺服器都將效能充分發揮,從而保持伺服器叢集的整體效能最優,這就是負載均衡問題。
下面詳細介紹負載均衡的五種實現方式
(一)HTTP重定向實現負載均衡
過程描述
當用戶向伺服器發起請求時,請求首先被叢集排程者截獲;排程者根據某種分配策略,選擇一臺伺服器,並將選中的伺服器的IP地址封裝在HTTP響應訊息頭部的Location欄位中,並將響應訊息的狀態碼設為302,最後將這個響應訊息返回給瀏覽器。
當瀏覽器收到響應訊息後,解析Location欄位,並向該URL發起請求,然後指定的伺服器處理該使用者的請求,最後將結果返回給使用者。
在使用HTTP重定向來實現伺服器叢集負載均衡的過程中,需要一臺伺服器作為請求排程者。使用者的一項操作需要發起兩次HTTP請求,一次向排程伺服器傳送請求,獲取後端伺服器的IP,第二次向後端伺服器傳送請求,獲取處理結果。
排程策略
隨機分配策略
當排程伺服器收到使用者請求後,可以隨機決定使用哪臺後端伺服器,然後將該伺服器的IP封裝在HTTP響應訊息的Location屬性中,返回給瀏覽器即可。
輪詢策略(RR)
排程伺服器需要維護一個值,用於記錄上次分配的後端伺服器的IP。那麼當新的請求到來時,排程者將請求依次分配給下一臺伺服器。
由於輪詢策略需要排程者維護一個值用於記錄上次分配的伺服器IP,因此需要額外的開銷;此外,由於這個值屬於互斥資源,那麼當多個請求同時到來時,為了避免執行緒的安全問題,因此需要鎖定互斥資源,從而降低了效能。而隨機分配策略不需要維護額外的值,也就不存線上程安全問題,因此效能比輪詢要高。
優缺點分析
採用HTTP重定向來實現伺服器叢集的負載均衡實現起來較為容易,邏輯比較簡單,但缺點也較為明顯。
在HTTP重定向方法中,排程伺服器只在客戶端第一次向網站發起請求的時候起作用。當排程伺服器向瀏覽器返回響應資訊後,客戶端此後的操作都基於新的URL進行的(也就是後端伺服器),此後瀏覽器就不會與排程伺服器產生關係,進而會產生如下幾個問題:
由於不同使用者的訪問時間、訪問頁面深度有所不同,從而每個使用者對各自的後端伺服器所造成的壓力也不同。而排程伺服器在排程時,無法知道當前使用者將會對伺服器造成多大的壓力,因此這種方式無法實現真正意義上的負載均衡,只不過是把請求次數平均分配給每臺伺服器罷了。
若分配給該使用者的後端伺服器出現故障,並且如果頁面被瀏覽器快取,那麼當用戶再次訪問網站時,請求都會發給出現故障的伺服器,從而導致訪問失敗。
(二)DNS負載均衡
首先需要將我們的域名指向多個後端伺服器(將一個域名解析到多個IP上),再設定一下排程策略,那麼我們的準備工作就完成了,接下來的負載均衡就完全由DNS伺服器來實現。
當用戶向我們的域名發起請求時,DNS伺服器會自動地根據我們事先設定好的排程策略選一個合適的IP返回給使用者,使用者再向該IP發起請求。
一般DNS提供商會提供一些排程策略供我們選擇,如隨機分配、輪詢、根據請求者的地域分配離他最近的伺服器。
DNS負載均衡最大的優點就是配置簡單。伺服器叢集的排程工作完全由DNS伺服器承擔,那麼我們就可以把精力放在後端伺服器上,保證他們的穩定性與吞吐量。而且完全不用擔心DNS伺服器的效能,即便是使用了輪詢策略,它的吞吐率依然卓越。此外,DNS負載均衡具有較強了擴充套件性,你完全可以為一個域名解析較多的IP,而且不用擔心效能問題。
但是,由於把叢集排程權交給了DNS伺服器,從而我們沒辦法隨心所欲地控制排程者,沒辦法定製排程策略。
DNS伺服器也沒辦法瞭解每臺伺服器的負載情況,因此沒辦法實現真正意義上的負載均衡。它和HTTP重定向一樣,只不過把所有請求平均分配給後端伺服器罷了。
此外,當我們發現某一臺後端伺服器發生故障時,即使我們立即將該伺服器從域名解析中去除,但由於DNS伺服器會有快取,該IP仍然會在DNS中保留一段時間,那麼就會導致一部分使用者無法正常訪問網站。這是一個致命的問題!好在這個問題可以用動態DNS來解決。
動態DNS
動態DNS能夠讓我們透過程式動態修改DNS伺服器中的域名解析。從而當我們的監控程式發現某臺伺服器掛了之後,能立即通知DNS將其刪掉。
綜上所述
DNS負載均衡是一種粗獷的負載均衡方法,這裡只做介紹,不推薦使用。
(三)反向代理負載均衡(nginx+uwsgi)
什麼是正向代理,正向代理是內網透過代理訪問網路,這個代理就是正向代理。而反向代理是指,網路透過代理訪問內網,那這個代理就是反向代理。
假設把你公司的網看成是內網,那麼你從公司裡面的一臺電腦上訪問你家裡的電腦上的服務,那就的透過正向代理,而你從你家電腦訪問公司的這臺電腦,就要透過反向代理。
使用代理伺服器可以將請求轉發給內部的Web伺服器,使用這種加速模式顯然可以提升靜態網頁的訪問速度。因此也可以考慮使用這種技術,讓代理伺服器將請求 均勻轉發給多臺內部Web伺服器之一上,從而達到負載均衡的目的。這種代理方式與普通的代理方式有所不同,標準代理方式是客戶使用代理訪問多個外部Web 伺服器,而這種代理方式是多個客戶使用它訪問內部Web伺服器,因此也被稱為反向代理模式。
優點:
隱藏後端伺服器。
與HTTP重定向相比,反向代理能夠隱藏後端伺服器,所有瀏覽器都不會與後端伺服器直接互動,從而能夠確保排程者的控制權,提升叢集的整體效能。
故障轉移
合理分配任務
HTTP重定向和DNS負載均衡都無法實現真正意義上的負載均衡,也就是排程伺服器無法根據後端伺服器的實際負載情況分配任務。但反向代理伺服器支援手動設定每臺後端伺服器的權重。我們可以根據伺服器的配置設定不同的權重,權重的不同會導致被排程者選中的機率的不同。
缺點:
排程者壓力過大
由於所有的請求都先由反向代理伺服器處理,那麼當請求量超過排程伺服器的最大負載時,排程伺服器的吞吐率降低會直接降低叢集的整體效能。
制約擴充套件
當後端伺服器也無法滿足巨大的吞吐量時,就需要增加後端伺服器的數量,可沒辦法無限量地增加,因為會受到排程伺服器的最大吞吐量的制約。
(四)IP負載均衡
原理:在網路層透過修改目標地址進行負載均衡。
使用者訪問請求到達負載均衡伺服器,負載均衡伺服器在作業系統核心程序獲取網路資料包,根據演算法得到一臺真實伺服器地址,然後將使用者請求的目標地址修改成該真實伺服器地址,資料處理完後返回給負載均衡伺服器,負載均衡伺服器收到響應後將自身的地址修改成原使用者訪問地址後再講資料返回回去。類似於反向伺服器負載均衡。
優點:在響應請求時速度較反向伺服器負載均衡要快。
缺點:當請求資料較大(大型影片或檔案)時,速度較慢。
(五)資料鏈路層負載均衡
原理:在資料鏈路層修改Mac地址進行負載均衡。
負載均衡伺服器的IP和它所管理的web 服務群的虛擬IP一致;
負載均衡資料分發過程中不修改訪問地址的IP地址,而是修改Mac地址;
透過這兩點達到不修改資料包的原地址和目標地址就可以進行正常的訪問。
優點:不需要負載均衡伺服器進行地址的轉換。資料響應時不需要經過負載均衡伺服器。
缺點:負載均衡伺服器的網絡卡頻寬要求較高。
要解決高併發問題,先要了解負載均衡。什麼是負載均衡?
當一臺伺服器的效能達到極限時,我們可以使用伺服器叢集來提高網站的整體效能。那麼,在伺服器叢集中,需要有一臺伺服器充當排程者的角色,使用者的所有請求都會首先由它接收,排程者再根據每臺伺服器的負載情況將請求分配給某一臺後端伺服器去處理。
那麼在這個過程中,排程者如何合理分配任務,保證所有後端伺服器都將效能充分發揮,從而保持伺服器叢集的整體效能最優,這就是負載均衡問題。
下面詳細介紹負載均衡的五種實現方式
(一)HTTP重定向實現負載均衡
過程描述
當用戶向伺服器發起請求時,請求首先被叢集排程者截獲;排程者根據某種分配策略,選擇一臺伺服器,並將選中的伺服器的IP地址封裝在HTTP響應訊息頭部的Location欄位中,並將響應訊息的狀態碼設為302,最後將這個響應訊息返回給瀏覽器。
當瀏覽器收到響應訊息後,解析Location欄位,並向該URL發起請求,然後指定的伺服器處理該使用者的請求,最後將結果返回給使用者。
在使用HTTP重定向來實現伺服器叢集負載均衡的過程中,需要一臺伺服器作為請求排程者。使用者的一項操作需要發起兩次HTTP請求,一次向排程伺服器傳送請求,獲取後端伺服器的IP,第二次向後端伺服器傳送請求,獲取處理結果。
排程策略
隨機分配策略
當排程伺服器收到使用者請求後,可以隨機決定使用哪臺後端伺服器,然後將該伺服器的IP封裝在HTTP響應訊息的Location屬性中,返回給瀏覽器即可。
輪詢策略(RR)
排程伺服器需要維護一個值,用於記錄上次分配的後端伺服器的IP。那麼當新的請求到來時,排程者將請求依次分配給下一臺伺服器。
由於輪詢策略需要排程者維護一個值用於記錄上次分配的伺服器IP,因此需要額外的開銷;此外,由於這個值屬於互斥資源,那麼當多個請求同時到來時,為了避免執行緒的安全問題,因此需要鎖定互斥資源,從而降低了效能。而隨機分配策略不需要維護額外的值,也就不存線上程安全問題,因此效能比輪詢要高。
優缺點分析
採用HTTP重定向來實現伺服器叢集的負載均衡實現起來較為容易,邏輯比較簡單,但缺點也較為明顯。
在HTTP重定向方法中,排程伺服器只在客戶端第一次向網站發起請求的時候起作用。當排程伺服器向瀏覽器返回響應資訊後,客戶端此後的操作都基於新的URL進行的(也就是後端伺服器),此後瀏覽器就不會與排程伺服器產生關係,進而會產生如下幾個問題:
由於不同使用者的訪問時間、訪問頁面深度有所不同,從而每個使用者對各自的後端伺服器所造成的壓力也不同。而排程伺服器在排程時,無法知道當前使用者將會對伺服器造成多大的壓力,因此這種方式無法實現真正意義上的負載均衡,只不過是把請求次數平均分配給每臺伺服器罷了。
若分配給該使用者的後端伺服器出現故障,並且如果頁面被瀏覽器快取,那麼當用戶再次訪問網站時,請求都會發給出現故障的伺服器,從而導致訪問失敗。
(二)DNS負載均衡
首先需要將我們的域名指向多個後端伺服器(將一個域名解析到多個IP上),再設定一下排程策略,那麼我們的準備工作就完成了,接下來的負載均衡就完全由DNS伺服器來實現。
當用戶向我們的域名發起請求時,DNS伺服器會自動地根據我們事先設定好的排程策略選一個合適的IP返回給使用者,使用者再向該IP發起請求。
排程策略
一般DNS提供商會提供一些排程策略供我們選擇,如隨機分配、輪詢、根據請求者的地域分配離他最近的伺服器。
優缺點分析
DNS負載均衡最大的優點就是配置簡單。伺服器叢集的排程工作完全由DNS伺服器承擔,那麼我們就可以把精力放在後端伺服器上,保證他們的穩定性與吞吐量。而且完全不用擔心DNS伺服器的效能,即便是使用了輪詢策略,它的吞吐率依然卓越。此外,DNS負載均衡具有較強了擴充套件性,你完全可以為一個域名解析較多的IP,而且不用擔心效能問題。
但是,由於把叢集排程權交給了DNS伺服器,從而我們沒辦法隨心所欲地控制排程者,沒辦法定製排程策略。
DNS伺服器也沒辦法瞭解每臺伺服器的負載情況,因此沒辦法實現真正意義上的負載均衡。它和HTTP重定向一樣,只不過把所有請求平均分配給後端伺服器罷了。
此外,當我們發現某一臺後端伺服器發生故障時,即使我們立即將該伺服器從域名解析中去除,但由於DNS伺服器會有快取,該IP仍然會在DNS中保留一段時間,那麼就會導致一部分使用者無法正常訪問網站。這是一個致命的問題!好在這個問題可以用動態DNS來解決。
動態DNS
動態DNS能夠讓我們透過程式動態修改DNS伺服器中的域名解析。從而當我們的監控程式發現某臺伺服器掛了之後,能立即通知DNS將其刪掉。
綜上所述
DNS負載均衡是一種粗獷的負載均衡方法,這裡只做介紹,不推薦使用。
(三)反向代理負載均衡(nginx+uwsgi)
什麼是正向代理,正向代理是內網透過代理訪問網路,這個代理就是正向代理。而反向代理是指,網路透過代理訪問內網,那這個代理就是反向代理。
假設把你公司的網看成是內網,那麼你從公司裡面的一臺電腦上訪問你家裡的電腦上的服務,那就的透過正向代理,而你從你家電腦訪問公司的這臺電腦,就要透過反向代理。
使用代理伺服器可以將請求轉發給內部的Web伺服器,使用這種加速模式顯然可以提升靜態網頁的訪問速度。因此也可以考慮使用這種技術,讓代理伺服器將請求 均勻轉發給多臺內部Web伺服器之一上,從而達到負載均衡的目的。這種代理方式與普通的代理方式有所不同,標準代理方式是客戶使用代理訪問多個外部Web 伺服器,而這種代理方式是多個客戶使用它訪問內部Web伺服器,因此也被稱為反向代理模式。
優點:
隱藏後端伺服器。
與HTTP重定向相比,反向代理能夠隱藏後端伺服器,所有瀏覽器都不會與後端伺服器直接互動,從而能夠確保排程者的控制權,提升叢集的整體效能。
故障轉移
合理分配任務
HTTP重定向和DNS負載均衡都無法實現真正意義上的負載均衡,也就是排程伺服器無法根據後端伺服器的實際負載情況分配任務。但反向代理伺服器支援手動設定每臺後端伺服器的權重。我們可以根據伺服器的配置設定不同的權重,權重的不同會導致被排程者選中的機率的不同。
缺點:
排程者壓力過大
由於所有的請求都先由反向代理伺服器處理,那麼當請求量超過排程伺服器的最大負載時,排程伺服器的吞吐率降低會直接降低叢集的整體效能。
制約擴充套件
當後端伺服器也無法滿足巨大的吞吐量時,就需要增加後端伺服器的數量,可沒辦法無限量地增加,因為會受到排程伺服器的最大吞吐量的制約。
(四)IP負載均衡
原理:在網路層透過修改目標地址進行負載均衡。
使用者訪問請求到達負載均衡伺服器,負載均衡伺服器在作業系統核心程序獲取網路資料包,根據演算法得到一臺真實伺服器地址,然後將使用者請求的目標地址修改成該真實伺服器地址,資料處理完後返回給負載均衡伺服器,負載均衡伺服器收到響應後將自身的地址修改成原使用者訪問地址後再講資料返回回去。類似於反向伺服器負載均衡。
優點:在響應請求時速度較反向伺服器負載均衡要快。
缺點:當請求資料較大(大型影片或檔案)時,速度較慢。
(五)資料鏈路層負載均衡
原理:在資料鏈路層修改Mac地址進行負載均衡。
負載均衡伺服器的IP和它所管理的web 服務群的虛擬IP一致;
負載均衡資料分發過程中不修改訪問地址的IP地址,而是修改Mac地址;
透過這兩點達到不修改資料包的原地址和目標地址就可以進行正常的訪問。
優點:不需要負載均衡伺服器進行地址的轉換。資料響應時不需要經過負載均衡伺服器。
缺點:負載均衡伺服器的網絡卡頻寬要求較高。