Apache配置負載均衡和集群使用mod_jk的方式比較多。
但是mod_jk已經停止更新,並且配置相對復雜。
Apache2.2以后,提供了一種原生的方式配置負載均衡和集群,比mod_jk簡單很多。
1.Apache配置反向代理
正向代理一般是指PC連接到代理服務器,由代理服務器轉發請求到網站。而反向代理指的是用戶將請求發送給反向代理服務器,由反向代理服務器將請求路由轉發到具體的服務器。
比如機房有兩個Tomcat提供服務,但是由於防火牆的原因,用戶不能直接訪問。這個時候,可以使用反向代理服務器,將請求轉發到Tomcat。而防火牆只需要開啟反向代理服務器的端口即可。
下面實驗假設內網Tomcat提供谷歌服務,外網通過反向代理,訪問這個服務。
修改/etc/httpd/conf/httpd.conf 增加下面的配置
訪問鏈接:http://192.168.1.105/google
2.負載均衡
負載均衡應該是最常用的橫向擴展技術。Apache負載均衡將前端的請求,按照配置的比例轉發給后台的Tomcat服務器,從而提高了並發訪問量。作為mod_proxy方式,配置負載均衡十分簡單,就是在反向代理的基礎上,將請求發送到balancer。
首先,修改War包程序的web.xml文件,增加標識。
其次,修改每個Tomcat服務器的server.xml,配置jvmRoute
最后,修改apache的httpd.conf文件,增加如下內容
其中ProxyPass /images ! 表示/images開頭的請求不會轉發給Tomcat,而是作為靜態資源在Apache的images目錄下尋找資源文件。
而反向代理將所有的/Test請求都轉發給名叫mycluster的balancer。
而這個balancer有兩個Tomcat成員。
loadfactor表示請求的權值,該值默認為1,可以將該值設置為1到100之間的任何值。
lbmethod表示負載均衡的算法,lbmethod可能的取值有:
lbmethod=byrequests 按照請求次數均衡(默認)
lbmethod=bytraffic 按照流量均衡
lbmethod=bybusyness 按照繁忙程度均衡(總是分配給活躍請求數最少的服務器)
stickySession=JSESSIONID表示開啟粘性Session。他的意思是如果第一次請求分到了worker1的Tomcat,那么這個用戶的后續請求,都會分配給worker1的這個Tomcat。
使用一個測試頁面查看粘性Session
index.jsp
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <%@ page import="java.util.*" %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>Insert title here</title>
- </head>
- <body>
- <%
- System.out.println(session.getId());
- out.println("
SESSION ID:" + session.getId()+"
"); - // 如果有新的請求,則添加session屬性
- String name = request.getParameter("name");
- if (name != null && name.length() > 0) {
- String value = request.getParameter("value");
- session.setAttribute(name, value);
- }
- out.print("Session List:");
- Enumeration<String> names = session.getAttributeNames();
- while (names.hasMoreElements()) {
- String sname = names.nextElement();
- String value = session.getAttribute(sname).toString();
- out.println( sname + " = " + value+"
"); - System.out.println( sname + " = " + value);
- }
- %>
- <form action="index.jsp" method="post">
- 名稱:<input type=text size=20 name="name">
- <br>
- 值:<input type=text size=20 name="value">
- <br>
- <input type=submit value="提交">
- </form> </body>
- </html>
可以看到,由於粘性Session的作用,對網頁的反復操作,都被Apache發送到了同一個Tomcat(worker2)
查看firefox的cookie信息,apache就是根據JSESSIONID后面的routeid實現粘性Session的。
3.集群
我覺得集群和負載均衡的區別就是集群包括Session復制和故障轉移。
Session復制是廣義的,實際上就是故障轉移的時候,還可以繼續讀取這個用戶的Session。
Session復制只是其中的一種方式,也可以采用Session服務器的方式。
例如:
http://blog.itpub.net/29254281/viewspace-1063018/
在負載均衡的基礎上配置集群
首先,開啟Tomcat的Session復制功能
- <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
- <Manager className="org.apache.catalina.ha.session.DeltaManager"
- expireSessionsOnShutdown="false"
- notifyListenersOnReplication="true"/>
- <Channel className="org.apache.catalina.tribes.group.GroupChannel">
- <Membership className="org.apache.catalina.tribes.membership.McastService"
- address="224.0.0.0"
- port="45564"
- frequency="500"
- dropTime="3000"/>
- <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
- address="192.168.1.100"
- port="4000"
- autoBind="100"
- selectorTimeout="5000"
- maxThreads="6"/>
- <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
- <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
- </Sender>
- <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
- <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
- </Channel>
- <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
- filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
- <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
- <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
- <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
- </Cluster>
然后在Apache配置故障轉移(nofailover=Off)
配置了集群之后,請求從前端過來,假如分配到了worker1,那么因為粘性Session,他會一直訪問worker1.
如果worker1宕機,這個用戶的后續請求會自動轉移到worker2.
由於Tomcat配置了Session復制,所以Session信息沒有丟失。
整個過程對於用戶是完全透明的。
參考:
http://www.ibm.com/developerworks/cn/opensource/os-lo-apache-tomcat/
http://snowolf.iteye.com/blog/743611
http://www.iteye.com/topic/757125
官方文檔:
http://apache.jz123.cn/mod/mod_proxy.html