Tomcat 集羣分類:css
tomcat實現session集羣的幾種方式:html
(1) nginx + tomcat cluster java
(2) httpd + tomcat cluster #基於http協議
nginx
httpd: mod_proxy, mod_proxy_http, mod_proxy_balancergit
tomcat cluster:http connectorgithub
(3) httpd + tomcat cluster #基於ajp協議
web
httpd: mod_proxy, mod_proxy_ajp, mod_proxy_balancer算法
tomcat cluster:ajp connectorapache
(4) httpd + tomcat clustervim
httpd: mod_jk #不經常使用,本文不作接受
tomcat cluster:ajp connector
實驗準備:
三臺主機:1臺nginx或者httpd作反向調度,兩臺tomcat作後端服務器(tomcatA,tomcatB)
時間同步
主機名解析
tomcat主機安裝:
yum install tomcat tomcat-lib tomcat-admin-webapps tomcat-docs-webapp tomcat-webapps
1. nginx + tomcat cluster
1.1 部署nginx反向代理
vim /etc/nginx/nginx.conf upstream tomsrvs { #http段 server 172.18.43.72:8080; server 172.18.43.73:8080; location / { #默認http-->server段: proxy_pass http://tomsrvs; } |
1.2 部署tomcat後端服務器
mkdir -pv /var/lib/tomcat/webapps/test/{classes,lib,WEB-INF,META-INF}
建立文件vim /var/lib/tomcat/webapps/test/index.jsp
tomcatA測試頁:
<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font color="red">TomcatA.magedu.com</font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("magedu.com","magedu.com"); %> <td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td> <td><%= session.getCreationTime() %></td> </tr>
</table>
</body>
</html> |
tomcatB測試頁:
<%@ page language="java" %>
<html>
<head><title>TomcatB</title></head>
<body>
<h1><font color="blue">TomcatB.magedu.com</font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("magedu.com","magedu.com"); %> <td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td> <td><%= session.getCreationTime() %></td> </tr>
</table>
</body>
</html> |
測試結果(已完成nginx反代):
2. httpd + tomcat cluster (http協議)
httpd服務器部署反向代理虛擬服務器vim /etc/httpd/conf.d/tom-http.conf
<proxy balancer://tcsrvs> BalancerMember http://172.18.43.72:8080 loadfactor=1 #定義權重 BalancerMember http://172.18.43.73:8080 loadfactor=3 ProxySet lbmethod=byrequests #設定調度算法 </Proxy> <VirtualHost *:80> ServerName lb.magedu.com ProxyVia On ProxyRequests Off #關閉正向代理 ProxyPreserveHost On <Proxy *> Require all granted </Proxy> ProxyPass / balancer://tcsrvs/ #把全部請求映射到tcsrvs ProxyPa***everse / balancer://tcsrvs/ <Location /> Require all granted </Location> </VirtualHost> |
測試略
附httpd反代相關設置:
http集羣調度算法: byrequests:輪詢(默認) bybusyness:加權輪詢 bytraffic:基於流量調度 定義後端調度主機狀態status: D:至關於down不接受請求 I:強行設置爲健康 H:熱備,至關於backup E:錯誤 N:不接受新請求
3. httpd + tomcat cluster (ajp協議)
httpd服務器部署反向代理虛擬服務器vim /etc/httpd/conf.d/tom-ajp.conf
<proxy balancer://tcsrvs> BalancerMember ajp://172.18.43.72:8009 BalancerMember ajp://172.18.43.73:8009 ProxySet lbmethod=byrequests </Proxy> <VirtualHost *:80> ServerName lb.magedu.com ProxyVia On ProxyRequests Off ProxyPreserveHost On <Proxy *> Require all granted </Proxy> ProxyPass / balancer://tcsrvs/ ProxyPa***everse / balancer://tcsrvs/ <Location /> Require all granted </Location> </VirtualHost> |
4. 關於httpd內置集羣代理管理頁面的配置
在如上設置中加入以下代碼:
<Location /balancer-manager> SetHandler balancer-manager #啓用內建處理器 ProxyPass ! #訪問這個URL時不向後端代理 Require all granted #真正使用時管理頁面不該均可訪問 </Location> |
訪問URL進行訪問效果如圖:
可在此頁面進行管理調度算法,後端主機狀態權重等。
實現Tomcat會話保持的三種方式:
1.基於http模塊route標籤實現會話粘性
1.1 http服務器與上面相比添加內容以下:
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED #新 <proxy balancer://tcsrvs> BalancerMember ajp://172.18.43.72:8009 route=TomcatA #新加 BalancerMember ajp://172.18.43.73:8009 route=TomvatB #新加 ProxySet lbmethod=byrequests ProxySet stickysession=ROUTEID #新加 |
1.2 修改兩臺後端tomcat主機
在Engine標籤裏面(在105行附近)加入jvmRoute="Tomcat*"
<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA"> #主機A <Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatB"> #主機B |
測試實現會話粘性
2. Tomcat 會話複製集羣
2.1 httpd主機註釋或刪除上例中添加部分
2.2 編輯兩臺後端tomcat主機server.xml配置文件
確保server.xml配置文件Engine的jvmRoute屬性配置正確(如上例TomcatA,TomcatB),將下列配置放置於<engine>或<host>中,注意各節點配置不一樣
<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="228.0.250.43" #tomcat主機同步多播地址,適當修改 port="45564" frequency="500" #每隔多久發一次信息(毫秒) dropTime="3000"/> #超時多久斷定爲故障 <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="172.18.43.72" #填寫本tomcat主機ip地址 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=""/> <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> </Cluster> |
2.3 添加<distributable/>元素
拷貝tomcat自帶模板到test的WEB-INF下面:
cp /etc/tomcat/web.xml /var/lib/tomcat/webapps/test/WEB-INF/web.xml |
編輯WEB-INF/web.xml,添加<distributable/>元素
vim web.xml
在任意非註釋區域添加:<distributable/>
2.4 抓包測試,可看到兩臺主機互相通訊實現會話複製
瀏覽器測試已實現會話粘性
3. session會話保持之session服務器(memcached)
3.1 memcached介紹
Memcached 是一款高效高性能的旁掛式數據緩存系統,設計簡單,程序短小。即只將數據存貯至內存中,而不寫入至硬盤,成爲緩存系統, memcached 存儲的是 kv 類型數據.全部的緩存都是 kv 類型的數據,而且 memcached 中緩存的數據能夠被修改,由於 memcached 的緩存數據存在於內存中因此,服務器宕機,數據丟失,因此只能做爲緩存使用,而不能當作存儲使用.
memcached 支持互不通訊的集羣,做爲旁掛式緩存系統。須要程序主動與 memcached 進行交互通訊。而且memcached 通常用於存儲 session。即做爲 session 服務器使用。
採用了惰性管理,即該清理掉的數據被標記爲不可用,而後在新數據到達時,進行覆蓋。
3.2 實驗環境
構建一臺httpd反向代理,兩臺後端tomcat服務器(兼memcached)。操做方法見上例 [集羣之 3 httpd + tomcat cluster (ajp協議)]
主體架構:Clients–>172.18.43.71(httpd)–>(tomcatA, tomcatB)–> (n1<–> n2)
3.3.配置tomcat
memcache不支持流式數據存儲,需藉助memcached-session-manager轉化信息。
memcached-session-manager項目地址:
http://code.google.com/p/memcached-session-manager/
https://github.com/magro/memcached-session-manager
下載以下jar文件至各tomcat節點的tomcat安裝目錄下的lib目錄中,其中的${version}要換成你所須要的版本號,tc${6,7,8}要換成與tomcat版本相同的版本號。
實驗所用包一覽:
memcached-session-manager-${version}.jar memcached-session-manager-tc${6,7,8}-${version}.jar spymemcached-${version}.jar msm-javolution-serializer-${version}.jar javolution-${version}.jar
分別在兩個tomcat上的某host上定義一個用於測試的context容器,並在其中建立一個會話管理器,以下所示:
<Context path="/test" docBase="test" reloadable="true"> <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:172.18.43.72:11211,n2:172.18.43.73:11211" failoverNodes="n2" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" /> </Context> |
重啓tomcat,memcache服務
3.4 測試
在瀏覽器中訪問http://172.18.43.71/test/index.jsp,不斷刷新,結果以下所示,其session ID在負載均衡環境中保持不變。
從測試結果能夠看出,如今啓用會話共享服務的memcache節點爲n1,此時將n1節點的memcache關閉;
刷新頁面:
此時,其session ID在負載均衡環境中保持不變,只是提供memcache服務的節點轉爲n2;
實現了基於memcache的會話保持集羣;