Apache如何做負載均衡配置

什么是負載均衡apache中如何做負載均衡配置?下面本篇文章就來給大家介紹一下apache 負載均衡配置的方法,希望對大家有幫助。

Apache如何做負載均衡配置

什么是負載均衡

負載均衡(Load Balance)是分布式系統架構設計中必須考慮的因素之一,它通常是指,將請求/數據【均勻】分攤到多個操作單元上執行,負載均衡的關鍵在于【均勻】

常見的負載均衡方案

Apache如何做負載均衡配置

常見互聯網分布式架構如上,分為客戶端層、反向代理nginx層、站點層、服務層、數據層。可以看到,每一個下游都有多個上游調用,只需要做到,每一個上游都均勻訪問每一個下游,就能實現“將請求/數據【均勻】分攤到多個操作單元上執行”。

【客戶端層->反向代理層】的負載均衡

Apache如何做負載均衡配置

【客戶端層】到【反向代理層】的負載均衡,是通過“DNS輪詢”實現的:DNS-server對于一個域名配置了多個解析ip,每次DNS解析請求來訪問DNS-server,會輪詢返回這些ip,保證每個ip的解析概率是相同的。這些ip就是nginx的外網ip,以做到每臺nginx的請求分配也是均衡的。

【反向代理層->站點層】的負載均衡

Apache如何做負載均衡配置

【反向代理層】到【站點層】的負載均衡,是通過“nginx”實現的。通過修改nginx.conf,可以實現多種負載均衡策略:

1)請求輪詢:和DNS輪詢類似,請求依次路由到各個web-server

2)最少連接路由:哪個web-server的連接少,路由到哪個web-server

3)ip哈希:按照訪問用戶的ip哈希值來路由web-server,只要用戶的ip分布是均勻的,請求理論上也是均勻的,ip哈希均衡方法可以做到,同一個用戶的請求固定落到同一臺web-server上,此策略適合有狀態服務,例如Session(58沈劍備注:可以這么做,但強烈不建議這么做,站點層無狀態是分布式架構設計的基本原則之一,session最好放到數據層存儲)

4)…

【站點層->服務層】的負載均衡


Apache如何做負載均衡配置

【站點層】到【服務層】的負載均衡,是通過“服務連接池”實現的。

上游連接池會建立與下游服務多個連接,每次請求會“隨機”選取連接來訪問下游服務。

上一篇文章《rpc-client實現細節》中有詳細的負載均衡、故障轉移、超時處理的細節描述,歡迎點擊link查閱,此處不再展開。

【數據層】的負載均衡

在數據量很大的情況下,由于數據層(db,cache)涉及數據的水平切分,所以數據層的負載均衡更為復雜一些,它分為“數據的均衡”與“請求的均衡”

數據的均衡是指:水平切分后的每個服務(db,cache),數據量是差不多的。

請求的均衡是指:水平切分后的每個服務(db,cache),請求量是差不多的。

業內常見的水平切分方式有這么幾種:

一、按照range水平切分

Apache如何做負載均衡配置

每一個數據服務,存儲一定范圍的數據,上圖為例:

user0服務,存儲uid范圍1-1kw

user1服務,存儲uid范圍1kw-2kw

這個方案的好處是:

(1)規則簡單,service只需判斷一下uid范圍就能路由到對應的存儲服務

(2)數據均衡性較好

(3)比較容易擴展,可以隨時加一個uid[2kw,3kw]的數據服務

不足是:

(1)請求的負載不一定均衡,一般來說,新注冊的用戶會比老用戶更活躍,大range的服務請求壓力會更大

二、按照id哈希水平切分

Apache如何做負載均衡配置

每一個數據服務,存儲某個key值hash后的部分數據,上圖為例:

user0服務,存儲偶數uid數據

user1服務,存儲奇數uid數據

這個方案的好處是:

(1)規則簡單,service只需對uid進行hash能路由到對應的存儲服務

(2)數據均衡性較好

(3)請求均勻性較好

不足是:

(1)不容易擴展,擴展一個數據服務,hash方法改變時候,可能需要進行數據遷移

總結

負載均衡(Load Balance)是分布式系統架構設計中必須考慮的因素之一,它通常是指,將請求/數據【均勻】分攤到多個操作單元上執行,負載均衡的關鍵在于【均勻】。

(1)【客戶端層】到【反向代理層】的負載均衡,是通過“DNS輪詢”實現的

(2)【反向代理層】到【站點層】的負載均衡,是通過“nginx”實現的

(3)【站點層】到【服務層】的負載均衡,是通過“服務連接池”實現的

(4)【數據層】的負載均衡,要考慮“數據的均衡”與“請求的均衡”兩個點,常見的方式有“按照范圍水平切分”與“hash水平切分”

Apache負載均衡設置方法

一般來說,負載均衡就是將客戶端的請求分流給后端的各個真實服務器,達到負載均衡的目的。還有一種方式是用兩臺服務器,一臺作為主服務器(Master),另一臺作為熱備份(Hot Standby),請求全部分給主服務器,在主服務器當機時,立即切換到備份服務器,以提高系統的整體可?

第一次看到這個標題時我也很驚訝,Apache居然還能做負載均衡?真是太強大了。經過一番調查后發現的確可以,而且功能一點都不差。這都歸功于 mod_proxy 這個模塊。不愧是強大的Apache啊。?

廢話少說,下面就來解釋一下負載均衡的設置方法。?

一般來說,負載均衡就是將客戶端的請求分流給后端的各個真實服務器,達到負載均衡的目的。還有一種方式是用兩臺服務器,一臺作為主服務器(Master),另一臺作為熱備份(Hot Standby),請求全部分給主服務器,在主服務器當機時,立即切換到備份服務器,以提高系統的整體可靠性。?

1. 負載均衡的設置?

1).基本配置?

Apache可以應對上面這兩種需求。先來討論一下如何做負載均衡。假設一臺apache服務器域名為www.a.com, 首先需要啟用Apache的幾個模塊:?

代碼如下:

LoadModule?proxy_module?modules/mod_proxy.so? ?LoadModule?proxy_balancer_module?modules/mod_proxy_balancer.so? ?LoadModule?proxy_http_module?modules/mod_proxy_http.so

mod_proxy提供代理服務器功能,mod_proxy_balancer提供負載均衡功能, mod_proxy_http讓代理服務器能支持HTTP協議。如果把mod_proxy_http換成其他協議模塊(如mod_proxy_ftp),或許能支持其他協議的負載均衡,有興趣的朋友可以自己嘗試一下。?
然后要添加以下配置:?

代碼如下:

ProxyRequests?Off? ?<proxy>? ?BalancerMember?http://node-a.myserver.com:8080? ?BalancerMember?http://node-b.myserver.com:8080? ?</proxy>? ?ProxyPass?/?balancer://mycluster/? ?#?警告:以下這段配置僅用于調試,絕不要添加到生產環境中!!!? ?<location>? ?SetHandler?balancer-manager? ?order?Deny,Allow? ?Deny?from?all? ?Allow?from?localhost? ?</location>

注:node-a.myserver.com,node-b.myserver.com是另外兩臺服務器的域名,不是當前服務器的域名?

從上面的 ProxyRequests Off 這條可以看出,實際上負載均衡器就是一個反向代理,只不過它的代理轉發地址不是某臺具體的服務器,而是一個 balancer:// 協議:?

ProxyPass / balancer://mycluster協議地址可以隨便定義。然后,在段中設置該balancer協議的內容即可。 BalancerMember指令可以添加負載均衡組中的真實服務器地址。?

下面那段是用來監視負載均衡的工作情況的,調試時可以加上(生產環境中禁止使用!),然后訪問 http://localhost/balancer-manager/ 即可看到負載均衡的工作狀況。?

OK,改完之后重啟服務器,訪問你的Apache所在服務器的地址(www.a.com),即可看到負載均衡的效果了。?

出錯提示:? 訪問網頁提示Internal?Serveral?Error,察看error.log文件

Error.log代碼?

[warn]?proxy:?No?protocol?handler?was?valid?for?the?URL?/admin/login_form.?If?you?are?using?a?DSO?version?of?mod_proxy,?make?sure?the?proxy?submodules?are?included?in?the?configuration?using?LoadModule.

原因是配置:# ProxyPass / balancer://mycluster 可能少了一個/?

2). 負載比例分配?

打開 balancer-manager 的界面,可以看到請求是平均分配的。?

如果不想平均分配怎么辦?給 BalancerMember 加上 loadfactor 參數即可,取值范圍為1-100。比如你有三臺服務器,負載分配比例為 7:2:1,只需這樣設置:?

Httpd.conf代碼?

ProxyRequests?Off? ?<proxy>? ?BalancerMember?http://node-a.myserver.com:8080?loadfactor=7? ?BalancerMember?http://node-b.myserver.com:8080?loadfactor=2? ?BalancerMember?http://node-c.myserver.com:8080?loadfactor=1? ?</proxy>? ?ProxyPass?/?balancer://mycluster

3).負載分配算法?

默認情況下,負載均衡會盡量讓各個服務器接受的請求次數滿足預設的比例。如果要改變算法,可以使用 lbmethod 屬性。如:?

代碼如下:

ProxyRequests?Off? ?<proxy>? ?BalancerMember?http://node-a.myserver.com:8080?loadfactor=7? ?BalancerMember?http://node-b.myserver.com:8080?loadfactor=2? ?BalancerMember?http://node-c.myserver.com:8080?loadfactor=1? ?</proxy>? ?ProxyPass?/?balancer://mycluster? ?ProxySet?lbmethod=bytraffic

lbmethod可能的取值有:?

  • lbmethod=byrequests 按照請求次數均衡(默認)?

  • lbmethod=bytraffic 按照流量均衡?

  • lbmethod=bybusyness 按照繁忙程度均衡(總是分配給活躍請求數最少的服務器)?

各種算法的原理請參見Apache的文檔。?

2. 熱備份(Hot Standby)?

熱備份的實現很簡單,只需添加 status=+H 屬性,就可以把某臺服務器指定為備份服務器:?

代碼如下:

ProxyRequests?Off? ?<proxy>? ?BalancerMember?http://node-a.myserver.com:8080? ?BalancerMember?http://node-b.myserver.com:8080?status=+H? ?</proxy>? ?ProxyPass?/?balancer://mycluster

從 balancer-manager 界面中可以看到,請求總是流向 node-a ,一旦node-a掛掉, Apache會檢測到錯誤并把請求分流給 node-b。Apache會每隔幾分鐘檢測一下 node-a 的狀況,如果node-a恢復,就繼續使用node-a。

apache負載均衡的安裝和實現方法

其實無論是分布式,數據緩存,還是負載均衡,無非就是改善網站的性能瓶頸,在網站源碼不做優化的情況下,負載均衡可以說是最直接的手段了?其實拋開這個名詞,放開了說,就是希望用戶能夠分流,也就是說把所有用戶的訪問壓力分散到多臺服務器上,也可以分散到多個tomcat里,如果一臺服務器裝多個tomcat,那么即使是負載均衡,性能也提高不了太多,不過可以提高穩定性,即容錯性?當其中一個主tomcat當掉,其他的tomcat也可以補上,因為tomcat之間實現了Session共享?待tomcat服務器修復后再次啟動,就會自動拷貝所有session數據,然后加入集群?這樣就可以不間斷的提供服務?如果要真正從本質上提升性能,必須要分布到多臺服務器?同樣tomcat也可以做到?網上相關資料比較多,可以很方便的查到,但是質量不算高?我希望可以通過這篇隨筆,系統的總結?

本文的 例子是同一臺服務器上運行兩個tomcat,做兩個tomcat之間的負載均衡?其實多臺服務器各配置一個tomcat也可以,而且那樣的話,可以使用安裝版的tomcat,而不用是下文中的免安裝的tomcat,而且tomcat端口配置也就不用修改了?下文也會提到??

tomcat的負載均衡需要apache服務器的加入來實現?在進行配置之前請先卸載調已安裝的tomcat,然后檢查apache的版本?我這次配置使用的是apache-tomcat-6.0.18免安裝版本,我親自測試后推斷安裝版的tomcat在同一臺機子上會不能啟動兩個以上,可能是因為安裝版的tomcat侵入了系統,導致即使在server.xml里修改了配置,還是會引起沖突?所以我使用tomcat免安裝版??

apache使用的是apache_2.2.11-win32-x86-no_ssl.msi?如果版本低于2.2Apache負載均衡的配置要有所不同,因為這個2.2.11和2.2.8版本集成了jk2等負載均衡工具,所以配置要簡單許多?別的版本我沒有具體測試,有待考究?這兩個軟件可以到官方網站下載??

把Apache安裝為運行在80端口的windows服務,安裝成功后在系統服務列表中可以看到Apache2.2服務?服務啟動后在瀏覽器中輸入http://localhost進行測試,如果能看到一個”It works!”的頁面就代表Apache已經正常工作了?把tomcat解壓到任意目錄,賦值一個另命名?起名和路徑對配置沒有影響?但要保證端口不要沖突,如果裝有oracleiis的用戶需要修改或關閉相關接口的服務?當然jdk的配置也是必須的,這個不再過多敘述??

想要達到負載均衡的目的,首先,在Apache安裝目錄下找到conf/httpd.conf文件,去掉以下文本前的注釋符(#)以便讓Apache在啟動時自動加載代理(proxy)模塊?

代碼如下:

LoadModule?proxy_module?modules/mod_proxy.so? ?LoadModule?proxy_ajp_module?modules/mod_proxy_ajp.so? ?LoadModule?proxy_balancer_module?modules/mod_proxy_balancer.so? ?LoadModule?proxy_connect_module?modules/mod_proxy_connect.so? ?LoadModule?proxy_ftp_module?modules/mod_proxy_ftp.so? ?LoadModule?proxy_http_module?modules/mod_proxy_http.so

向下拉動文檔找到節點,在DirectoryIndex index.html后加上index.jsp,這一步只是為了待會配置完tomcat后能看到小貓首頁,可以不做?繼續下拉文檔找到Include conf/extra/httpd-vhosts.conf,去掉前面的注釋符??

然后打開conf/extra/httpd-vhosts.conf,配置虛擬站點,在最下面加上?

代碼如下:

<virtualhost>? ?ServerAdmin?管理員郵箱? ?ServerName?localhost? ?ServerAlias?localhost? ?ProxyPass?/?balancer://sy/?stickysession=jsessionid?nofailover=On? ?ProxyPassReverse?/?balancer://sy/? ?ErrorLog?"logs/sy-error.log"? ?CustomLog?"logs/sy-access.log"?common? ?</virtualhost>

然后回到httpd.conf,在文檔最下面加上?

代碼如下:

ProxyRequests?Off? ?<proxy>? ?BalancerMember?ajp://127.0.0.1:8009?loadfactor=1?route=jvm1? ?BalancerMember?ajp://127.0.0.1:9009?loadfactor=1?route=jvm2? ?</proxy>

ProxyRequests Off 是告訴Apache需要使用反向代理,ip地址和端口唯一確定了tomcat節點和配置的ajp接受端口?loadfactor是負載因子,Apache會按負載因子的比例向后端tomcat節點轉發請求,負載因子越大,對應的tomcat服務器就會處理越多的請求,如兩個tomcat都是1,Apache就按1:1的比例轉發,如果是2和1就按2:1的比例轉發?這樣就可以使配置更靈活,例如可以給性能好的服務器增加處理工作的比例,如果采取多臺服務器,只需要修改ip地址和端口就可以了?route參數對應后續tomcat負載均衡配置中的引擎路徑(jvmRoute)

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享