什么是負載均衡?apache中如何做負載均衡配置?下面本篇文章就來給大家介紹一下apache 負載均衡配置的方法,希望對大家有幫助。
什么是負載均衡
負載均衡(Load Balance)是分布式系統架構設計中必須考慮的因素之一,它通常是指,將請求/數據【均勻】分攤到多個操作單元上執行,負載均衡的關鍵在于【均勻】。
常見的負載均衡方案
常見互聯網分布式架構如上,分為客戶端層、反向代理nginx層、站點層、服務層、數據層。可以看到,每一個下游都有多個上游調用,只需要做到,每一個上游都均勻訪問每一個下游,就能實現“將請求/數據【均勻】分攤到多個操作單元上執行”。
【客戶端層->反向代理層】的負載均衡
【客戶端層】到【反向代理層】的負載均衡,是通過“DNS輪詢”實現的:DNS-server對于一個域名配置了多個解析ip,每次DNS解析請求來訪問DNS-server,會輪詢返回這些ip,保證每個ip的解析概率是相同的。這些ip就是nginx的外網ip,以做到每臺nginx的請求分配也是均衡的。
【反向代理層->站點層】的負載均衡
【反向代理層】到【站點層】的負載均衡,是通過“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)…
【站點層->服務層】的負載均衡
【站點層】到【服務層】的負載均衡,是通過“服務連接池”實現的。
上游連接池會建立與下游服務多個連接,每次請求會“隨機”選取連接來訪問下游服務。
上一篇文章《rpc-client實現細節》中有詳細的負載均衡、故障轉移、超時處理的細節描述,歡迎點擊link查閱,此處不再展開。
【數據層】的負載均衡
在數據量很大的情況下,由于數據層(db,cache)涉及數據的水平切分,所以數據層的負載均衡更為復雜一些,它分為“數據的均衡”與“請求的均衡”。
數據的均衡是指:水平切分后的每個服務(db,cache),數據量是差不多的。
請求的均衡是指:水平切分后的每個服務(db,cache),請求量是差不多的。
業內常見的水平切分方式有這么幾種:
一、按照range水平切分
每一個數據服務,存儲一定范圍的數據,上圖為例:
user0服務,存儲uid范圍1-1kw
user1服務,存儲uid范圍1kw-2kw
這個方案的好處是:
(1)規則簡單,service只需判斷一下uid范圍就能路由到對應的存儲服務
(2)數據均衡性較好
(3)比較容易擴展,可以隨時加一個uid[2kw,3kw]的數據服務
不足是:
(1)請求的負載不一定均衡,一般來說,新注冊的用戶會比老用戶更活躍,大range的服務請求壓力會更大
二、按照id哈希水平切分
每一個數據服務,存儲某個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協議地址可以隨便定義。然后,在
下面那段
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解壓到任意目錄,賦值一個另命名?起名和路徑對配置沒有影響?但要保證端口不要沖突,如果裝有oracle或iis的用戶需要修改或關閉相關接口的服務?當然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
向下拉動文檔找到
然后打開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)