什麼是負載平衡? 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 balancer://mycluster> BalancerMember http://node-a.myserver.com:8080 BalancerMember http://node-b.myserver.com:8080 </Proxy> ProxyPass / balancer://mycluster/ # 警告:以下这段配置仅用于调试,绝不要添加到生产环境中!!! <Location /balancer-manager> 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協定位址可以隨便定義。然後,在11951de53252afd7f744ef2dcc6c9390段中設定該balancer協定的內容即可。 BalancerMember指令可以新增負載平衡組中的真實伺服器位址。
下面那段ba087f03004fe4f66fd7615e84a09336是用來監視負載平衡的工作情況的,調試時可以加上(生產環境中禁止使用!),然後訪問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 balancer://mycluster> 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 balancer://mycluster> 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 balancer://mycluster> 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
向下拉动文档找到794ea01c23a0d5c1a7b2f169e4879de9节点,在DirectoryIndex index.html后加上index.jsp,这一步只是为了待会配置完tomcat后能看到小猫首页,可以不做。继续下拉文档找到Include conf/extra/httpd-vhosts.conf,去掉前面的注释符。
然后打开conf/extra/httpd-vhosts.conf,配置虚拟站点,在最下面加上
代码如下:
<VirtualHost *:80> 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 balancer://sy> 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)
以上是Apache如何做負載平衡配置的詳細內容。更多資訊請關注PHP中文網其他相關文章!