windows下Apache做負載平衡
第一次看到這個標題時我也很驚訝,Apache居然還能做負載平衡?真是太強大了。經過一番調查後發現的確可以,而且功能一點都不差。這都歸功於 mod_proxy 這個模組。不愧是強大的Apache啊。
廢話少說,下面就來解釋一下負載平衡的設定方法。
一般來說,負載平衡就是將用戶端的請求分流給後端的各個真實伺服器,達到負載平衡的目的。還有一種方式是用兩台伺服器,一台作為主伺服器(Master),另一台作為熱備份(Hot Standby),請求全部分給主伺服器,在主伺服器當機時,立即切換到備份伺服器,以提高系統的整體可靠性。
負載平衡的設定
Apache可以應對上面這兩種需求。先來討論一下如何做負載平衡。首先需要啟用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提供Proxy 伺服器功能,mod_proxy_balancer提供負載平衡功能, mod_proxy_http讓Proxy 伺服器能支援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> |
從上面的 ProxyRequests Off 這條可以看出,實際上負載平衡器就是一個反向 Proxy,只不過它的代理轉寄地址不是某台具體的伺服器,而是一個 balancer:// 協議:
| 代碼如下 |
複製代碼 |
ProxyPass / balancer://mycluster |
協議地址可以隨便定義。然後,在段中設定該balancer協議的內容即可。 BalancerMember指令可以添加負載平衡組中的真實伺服器位址。
下面那段是用來監視負載平衡的工作情況的,調試時可以加上(生產環境中禁止使用!),然後訪問 http://localhost/balancer-manager/ 即可看到負載平衡的工作狀況。
OK,改完之後重啟伺服器,訪問你的Apache所在伺服器的地址,即可看到負載平衡的效果了。開啟 balancer-manager 的介面,可以看到請求是平均分配的。
如果不想平均分配怎麼辦?給 BalancerMember 加上 loadfactor 參數即可,取值範圍為1-100。比如你有三台伺服器,負載分配比例為 7:2:1,只需這樣設定:
| 代碼如下 |
複製代碼 |
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
|
預設情況下,負載平衡會盡量讓各個伺服器接受的請求次數滿足預設的比例。如果要改變演算法,可以使用 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的文檔。
熱備份(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。
linux下Apache做負載平衡
作業系統:DEBIAN 5.03(Ubuntu也可以同理配置)
一、安裝apache載入模組
| 代碼如下 |
複製代碼 |
apt-get install apache2
|
然後進入到apache的配置目錄
| 代碼如下 |
複製代碼 |
cd /etc/apache2
|
apache的反向 Proxy和負載平衡其實利用的都是反向 Proxy的原理,至於什麼叫做反向 Proxy可以點此http://baike.baidu.com/view/1165595.htm
關鍵需要載入下面三個模組
| 代碼如下 |
複製代碼 |
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
|
由於Debian系統下apache所有的模組都是放在/usr/lib/apache2/modules/裡面的,通過/etc/apache2/mods-available裡面的*.load載入的,如果要模組的話需要在/etc/apache2/mods-enabled裡面用ln建立連結,當然你也可以再/etc/apache2/apache2.conf裡面直接把上面三句話寫進入,但是不建議這樣做。執行代碼如下
| 代碼如下 |
複製代碼 |
ln -s /etc/apache2/mods-available/proxy.load /etc/apache2/mods-enabled/proxy.load ln -s /etc/apache2/mods-available/proxy_http.load /etc/apache2/mods-enabled/proxy_http.load ln -s /etc/apache2/mods-available/proxy_balancer.load /etc/apache2/mods-enabled/proxy_banancer.load
|
做好上面幾步之後我們重啟下apache
| 代碼如下 |
複製代碼 |
| /etc/init.d/apache2 restart |
二、配置反向 Proxy功能
載入完模組後可以建立一個虛擬機器主機來作為反向 Proxy
| 代碼如下 |
複製代碼 |
vi /etc/apache2/sites_available/proxy
|
配置如下
| 代碼如下 |
複製代碼 |
Listen 202.xxx.xxx.xxx:80 (別人訪問的IP和連接埠) <VirtualHost 202.xxx.xxx.xxx:80> (同上) ServerAdmin admin@bit.net ProxyRequests Off (說明開啟的是反向 Proxy) ProxyMaxForwards 100 ProxyPreserveHost On ProxyPass / http://10.x.xx.xxx/ (轉寄到url上的請求) ProxyPassReverse / http://10.x.xx.xxx/ <Proxy *> (這段是訪問的控制) Order Deny,Allow Allow from all </Proxy> </VirtualHost>
|
然後再在/etc/apache2/sites_enabled/裡面建立ln連結
| 代碼如下 |
複製代碼 |
ln -s /etc/apache2/sites_available/proxy /etc/apache2/sites_enabled/proxy
|
重啟apache
| 代碼如下 |
複製代碼 |
/etc/init.d/apache2 restart
|
然後反向 Proxy就開啟了
當別人輸入http://202.xxx.xxx.xxx時就會通過反向 Proxy轉到http://10.x.xx.xxx上,這樣簡單的反向 Proxy功能就開啟了
三、apache負載平衡配置
a、簡單的負載平衡
然後接著講apache的負載平衡模組吧
同理建立一個虛擬機器主機來作為負載平衡
| 代碼如下 |
複製代碼 |
vi /etc/apache2/sites_available/balancer
|
配置如下
| 代碼如下 |
複製代碼 |
Listen 202.x.xx.xxx:80 (別人訪問的IP和連接埠) <VirtualHost 202.x.xx.xxx:80> ServerAdmin admin@bit.com ProxyRequests Off Proxypass / balancer://proxy/ <Proxy balancer://proxy> Order Deny,Allow Allow from all BalancerMember http://10.0.0.1 BalancerMember http://10.0.0.2 </Proxy> </VirtualHost>
|
從上面的 ProxyRequests Off 這條可以看出,實際上負載平衡器就是一個反向 Proxy,只不過它的代理轉寄地址不是某台具體的伺服器,而是一個 balancer://協議地址
ProxyPass / balancer://proxy/ 協議地址可以隨便定義。然後,在<Proxy>段中設定該balancer協議的內容即可。 BalancerMember指令可以添加負載平衡組中的真實伺服器位址。
然後再在/etc/apache2/sites_enabled/裡面建立ln連結
| 代碼如下 |
複製代碼 |
ln -s /etc/apache2/sites_available/balancer /etc/apache2/sites_enabled/balancer
|
重啟apache
/etc/init.d/apache2 restart
這樣apache的負載平衡就配置好了
如果訪問http://202.x.xx.xxx的時候會均勻地開啟http://10.0.0.1和http://10.0.0.2,比如你兩次開啟http://202.x.xx.xxx會又一次開啟http://10.0.0.1一次開啟http://10.0.0.2這樣就是兩台伺服器接受的請求平均了,達到了負載平衡的效果。
b、負載比例分配
當然如果你發現你的兩台伺服器配置不一樣,一台較好,一台較差,那麼就要開始配置不同比例的負載平衡了。如果兩台伺服器你想配置負載分配比為3:1則設定檔如下
| 代碼如下 |
複製代碼 |
Listen 202.x.xx.xxx:80 (別人訪問的IP和連接埠) <VirtualHost 202.x.xx.xxx:80> ServerAdmin admin@bit.com ProxyRequests Off Proxypass / balancer://proxy/ <Proxy balancer://proxy> Order Deny,Allow Allow from all BalancerMember http://10.0.0.1 loadfactor= 3 BalancerMember http://10.0.0.2 loadfactor= 1 </Proxy> </VirtualHost> |
c、負載分配演算法
當然你可能想通過不同的演算法實現負載平衡,比方說按照請求次數,或者按照流量均衡,這裡用到的指令是lbmethod
lbmethod可能的取值有:
lbmethod=byrequests 按照請求次數均衡(預設)
lbmethod=bytraffic 按照流量均衡
lbmethod=bybusyness 按照繁忙程度均衡(總是分配給活躍請求數最少的伺服器)
按照流量的均衡配置如下
| 代碼如下 |
複製代碼 |
Listen 202.x.xx.xxx:80 (別人訪問的IP和連接埠) <VirtualHost 202.x.xx.xxx:80> ServerAdmin admin@bit.com ProxyRequests Off Proxypass / balancer://proxy/ ProxySet lbmethod=bytraffic (加上這句) <Proxy balancer://proxy> Order Deny,Allow Allow from all BalancerMember http://10.0.0.1 loadfactor= 3 BalancerMember http://10.0.0.2 loadfactor= 1 </Proxy> </VirtualHost>
|
這樣你的負載平衡就可以按照流量均衡了
d、熱備份
在最後講一講熱備份吧,熱備份的實現很簡單,只需添加 status=+H 屬性,就可以把某台伺服器指定為備份伺服器,設定檔如下
| 代碼如下 |
複製代碼 |
Listen 202.x.xx.xxx:80 (別人訪問的IP和連接埠) <VirtualHost 202.x.xx.xxx:80> ServerAdmin admin@bit.com ProxyRequests Off Proxypass / balancer://proxy/ ProxySet lbmethod=bytraffic (加上這句) <Proxy balancer://proxy> Order Deny,Allow Allow from all BalancerMember http://10.0.0.1 BalancerMember http://10.0.0.2 status=+H </Proxy> </VirtualHost> |
從配置中可以看出請求總是流向http://10.0.0.1,一旦http://10.0.0.1掛掉, Apache會檢測到錯誤並把請求分流給 http://10.0.0.2。Apache會每隔幾分鐘檢測一下http://10.0.0.1的狀況,如果http://10.0.0.1恢複,就繼續使用http://10.0.0.1,這樣就可以實現熱備份了