說到負載均衡LVS這套技術,有很多種實現方法。
本文所說,主要就是利用apache服務器實現反向代理,實現負載均衡。
首先,傳統的正向代理如下圖所示,正如我們用的游戲加速代理,大多的個人PC把請求發給正向代理服務器,代理服務器通常配置高端的帶寬,替我們請求相應的服務。
而負載均衡中的反向代理,通常意義上,是一個請求轉發的代理。類似一個收發室的管理人員,外來的很多郵件,傳到收發室,然后由管理員分配給不同的辦公室。通過這樣的操作,可以使每台服務器避免過多的負載導致宕機。而轉發的這個過程,通常也有很多種不同的算法。下圖所示,就是一個反向代理的過程:
實現這樣一個架構,需要幾台服務器,不論是linux 或者 windows都可以實現。
如果如圖所示,實現,則需要四台服務器,1台apache反向代理服務器,實現請求的轉發分配。3台后台的主服務器。
在apache代理服務器上面,如果安裝的centos系統,那么自帶的httpd服務,就不用再安裝apache服務器了。它的apache服務器的配置文件在/etc/httpd/conf/httpd.conf文件中,可以通過vi命令打開。
1 確保需要的mod_proxy模塊均加載,主要的模塊如下:
mod_proxy.so mod_proxy_ajp.so mod_proxy_balancer.so mod_proxy_connect.so mod_proxy_ftp.so mod_proxy_http.so
2 配置相關的代理設置,在httpd.conf文件末尾添加:
ProxyRequest off <Proxy balancer://testcluster> BalancerMember http://192.168.0.1 route=jvm1 BalancerMember http://192.168.0.2 route=jvm2 BalancerMember http://192.168.0.3 route=jvm3 </Proxy> Proxy /tt balancer://test/tt stickysession=JSESSIONID | jsessionid nofailover=On ProxyPass Reverse /tt balancer://test/tt
3 在后面的主服務器1(例如JBOSS服務器)的/jboss/server/default/deploy/jboss-web.service/servers.xml中
<Engine name="jboss.web" defaultHost="localhost" jvmRoute="jvm1">
....
這樣一個負載均衡就大致 形成了。
其中可能有人考慮到,如果一個請求時登陸請求,而第二個請求時操作,結果第二個請求轉發到第二個服務器上面。那么如何操作。這個不用擔心,apache反向代理有 session粘連這樣一個概念,它會把所有關於cookie的文件保存在apache服務器上面,其他的操作均會讀取這樣一個文件。
不同的負載分配方案
1 如果按照上面的配置方案:
ProxyRequest off <Proxy balancer://testcluster> BalancerMember http://192.168.0.1:8080 route=jvm1 BalancerMember http://192.168.0.2:8080 route=jvm2 BalancerMember http://192.168.0.3:8080 route=jvm3 </Proxy> Proxy /tt balancer://test/tt stickysession=JSESSIONID | jsessionid nofailover=On ProxyPass Reverse /tt balancer://test/tt
apache服務器會按照請求,挨個轉發,第一個轉發給jvm1服務器。第二個請求轉發給jvm2服務器。第4個請求轉發給jvm1服務器等等
2 如果某台服務器的性能要優於其他幾台,那么可以通過loadfactor參數實現負載的分配
ProxyRequest off <Proxy balancer://testcluster> BalancerMember http://192.168.0.1:8080 route=jvm1 loadfactor=1 BalancerMember http://192.168.0.2:8080 route=jvm2 loadfactor=2 BalancerMember http://192.168.0.3:8080 route=jvm3 loadfactor=3 </Proxy> Proxy /tt balancer://test/tt stickysession=JSESSIONID | jsessionid nofailover=On ProxyPass Reverse /tt balancer://test/tt
這樣第一個請求發給jvm1,第二個和第三個發給jvm2,第四個到第六個發給jvm3