1. 程式人生 > >tomcat基於session會話保持以及msm會話保持

tomcat基於session會話保持以及msm會話保持

tomcat會話保持

實驗一、基於tomcat集群會話保持

一、實驗環境:

一臺nginx服務器,兩臺tomcat集群,出於實驗的原因,我就把nginx也放在其中一臺的tomcat服務器上。也就是一共兩臺機器,都是centos7的環境。

二、實驗原理:

DeltaManager會話管理器是tomcat默認的集群會話管理器,它主要用於集群中各個節點之間會話狀態的同步維護。集群增量會話管理器的職責是將某節點的會話該變同步到集群內其他成員節點上,它屬於全節點復制模式,所謂全節點復制是指集群中某個節點的狀態變化後需要同步到集群中剩余的節點,非全節點方式可能只是同步到其中某個或若幹節點。在集群中全節點會話復制的一個大致步驟如圖所示,客戶端發起一個請求,假設通過一定的負載均衡設備分發策略分到其中一個結點node1,如果還未存在session對象的話web容器將會創建一個會話對象,接著執行一些邏輯處理,在對客戶端響應之前有個重要的事情是要把session對象同步到集群中其他節點上,最後再響應客戶端。當客戶端第二次發起請求時,假如分發到node3節點上,由於同步了node1的session會話,所以在執行邏輯時並不會取不到session的值。如果刪除某個會話對象,則要同時通知其他節點把相應會話刪除,如果修改了某個會話的某些屬性也同樣要更新到其他節點的會話中。

三、實驗拓撲圖:

技術分享圖片

四、實驗步驟:

第一步:搭建nginx服務

配置文件如下:vim /etc/nginx/nginx.conf

技術分享圖片

第二步:安裝tomcat環境,這個不需要說了,註意的地方就是先需要實現Java環境。

第三步:配置tomcat,支持會話保持,兩邊的tomcat都是一樣的配置。

<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.0.4" port="45564" frequency="500" dropTime="3000"/>

<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"

address="172.17.254.171" 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"/>

<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>

</Cluster>

第四步:編寫一個小教本進行測試。

Tomcat1: vim /usr/local/tomcat/webapps/test/index.jsp

<%@ page language="java" %>

<html>

<head><title>TomcatA</title></head>

<body>

<h1><font color="blue">TomcatA </h1>

<table border="1">

<tr>

<td>Session ID</td>

<% session.setAttribute("abc","abc"); %>

<td><%= session.getId() %></td>

</tr>

<tr>

<td>Created on</td>

<td><%= session.getCreationTime() %></td>

</tr>

</table>

</body>

</html>

Tomcat2:

<%@ page language="java" %>

<html>

<head><title>TomcatB</title></head>

<body>

<h1><font color="blue">TomcatB </h1>

<table border="1">

<tr>

<td>Session ID</td>

<% session.setAttribute("abc","abc"); %>

<td><%= session.getId() %></td>

</tr>

<tr>

<td>Created on</td>

<td><%= session.getCreationTime() %></td>

</tr>

</table>

</body>

</html>

第五步:需要在當前腳本所在目錄下自定義一個WEB-INF的目錄,加上一個分布式存儲的標簽

mkdir test/WEB-INF

cp /usr/local/tomcat/conf/web.xml /usr/local/tomcat/webapps/test/WEB-INF/

vim web.xml

技術分享圖片

第六步:測試結果,發現結果都是一樣的,說明實驗成功

技術分享圖片技術分享圖片

技術分享圖片

易錯點:tomcat是通過組播的方式復制session的,所以組播地址最好加上路由,避免自動綁定的ip地址不在一個網段上,不然就把Receiver的IP自動獲取改成自己手動配置。

技術分享圖片


實驗二:tomcat結合memcached實現seesion共享

一、實驗環境:兩臺tomcat,一臺nginx負載均衡器,兩臺memcache緩存

二、實驗原理:雖然由tomcat自身帶的機制可以實現session復制,但是這只是能實現小並發的情況,大並發的session復制對於tomcat來說資源消耗太大,每一個會話復制上千臺機器負載太大,所以需要新的機制來實現這個問題,這就是我們所說的memcache緩存可以解決的問題,也就是我們常說的memcached-session-manager-2.1.1.jar,簡稱msm.把用戶訪問的session都存儲到一臺memcache上,就能實現數據的一致性。

三、實驗拓撲圖:

技術分享圖片

四、實驗步驟:

第一步:下載tomcat需要的支持memcache的庫文件。每個tomcat都需要。

下載如下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需要的會話管理器。

分別在兩個tomcat上的某host上定義一個用於測試的context容器,並在其中創建一個會話管理器,如下所示:

<Context path="/test" docBase="/usr/local/tomcat/webapps/test" reloadable="true">

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

memcachedNodes="n1:172.16.100.9:11211,n2:172.16.100.10:11211"

failoverNodes="n1"

requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"

transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"/>

</Context>

第三步:提供測試頁面

別為兩個context提供測試頁面:

tomcatA:

# mkdir -pv /usr/local/tomcat/webapps/test/WEB-INF/{classes,lib}

# vim /usr/local/tomcat/webapps/test/index.jsp

添加如下內容:

<%@ page language="java" %>

<html>

<head><title>TomcatA</title></head>

<body>

<h1><font color="red">TomcatA</font></h1>

<table 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:

# mkdir -pv /usr/local/tomcat/webapps/test/WEB-INF/{classes,lib}

# vim /usr/local/tomcat/webapps/test/index.jsp

添加如下內容:

<%@ page language="java" %>

<html>

<head><title>TomcatB</title></head>

<body>

<h1><font color="blue">TomcatB.magedu.com</font></h1>

<table 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>

第四步:配置反向代理

vim /etc/nginx/nginx.conf

upstream tomcat_cluster {

#ip_hash;

server 172.17.254.171:8080 weight=1;

server 172.17.254.181:8080 weight=2;

}

server {

listen 80;

server_name xiaomi;

root /usr/local/tomcat/webapps/ROOT;

# Load configuration files for the default server block.

include /etc/nginx/default.d/*.conf;

index index.jsp;

location ~* \.(jsp|do)$ {

proxy_pass http://tomcat_cluster;

}

測試頁面:

技術分享圖片

技術分享圖片


技術分享圖片


tomcat基於session會話保持以及msm會話保持