緩存 Tomcat session 變量
做 Tomcat 集群的目的是為了提供更高的負載能力,把訪問均攤到不同的服務器上。以下圖的結構框架作為例。
阿里云集群一般分為兩種模式,一種是完全集中 SESSION,各個集群點保持一致;還有一種就是基于一次會話指定某一個集群中節點提供服務。
ECS 安裝 TOMCAT 和 JDK。
本例中用的是TOMCAT 7 以及 JDK 7。建議 TOMCAT 先下載到本地,配置好了再上傳到 ECS。
TOMCAT 增加 memcached 支持的 lib 包。
配置 memcached-session-manager,請參考該文檔。
本步驟主要下載一些 lib,下載地址在上面的文檔中有給出。把下載到的 lib 放到 Tomcat/lib 目錄里面, 如下圖所示。(注意:每個文件的前綴“msm-”本來是沒有的,是為了方便管理加的。)
有了這些包之后就可以配置 TOMCAT 連接到 Memcache。
TOMCAT 同步 Session 到 Memcache。
該步驟要做 TOMCAT 具體配置了,有兩種配置模式:STICKY 和 NON-STICKY。
STICKY:負載均衡會根據用戶會話,每次都分配到同一個集群節點上。用戶每次獲取會話數據都是從 TOMCAT 里面取得,TOMCAT 會備份一個 SESSION 到 Memcache,這樣可以保持最高效地獲取 SESSION。
NON-STICKY:負載均衡不會管用戶會話,而是按每次連接分別分發的方式,會話都保持在 Memcache 上,每次讀寫都在 Memcache 上。由于會遠程訪問數據,所以效率會低一些,但是這種卻是最符合集群或集中緩存預期效果的。
在 /Tomcat/conf/context.xml 中編輯連接到 Memcache 的配置,在
<Context>
元素下增加下述的配置描述即可。下面分別是 TOMCAT 的兩種配置模式:STICKY 模式
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="Memcache 的地址:11211"
username="Memcache 實例名"
password="Memcache 密碼"
memcachedProtocol="binary"
sticky="true"
sessionBackupAsync="true"
sessionBackupTimeout="1000"
requestUriIgnorePattern=".*\.(gif|jpg|jpeg|png|bmp|swf|js|css|html|htm|xml|json)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" ></Manager>
NON-STICKY 模式
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="Memcache 的地址:11211"
username="Memcache 實例名"
password="Memcache 密碼"
memcachedProtocol="binary"
sticky="false"
lockingMode="auto"
sessionBackupAsync="false"
sessionBackupTimeout="1000"
requestUriIgnorePattern=".*\.(gif|jpg|jpeg|png|bmp|swf|js|css|html|htm|xml|json)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />
注意:必須要有
memcachedProtocol="binary"
,因為 Tomcat memcached 插件模式這個屬性值是 text,而阿里云支持的是 binary 模式的數據。
修改 TOMCAT 的 JVM 設置以及 NIO。
在 /Tomcat/bin/ 目錄下修改 JVM 設置,增加 setenv.sh 文件,寫定要優化的配置。
CATALINA_OPTS="-server -Xms3072m -Xmx3072m -Xmn1024m -XX:PermSize=96m -XX:MaxPermSize=128m -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSMaxAbortablePrecleanTime=50 -XX:+CMSPermGenSweepingEnabled"
在 /Tomcat/conf/context.xml 文件中修改 NIO 設置。
注釋掉原有的 Connector=8080 的定義,增加如下的配置定義,使用 NIO 方式。
<Connector port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
URIEncoding="UTF-8"
useBodyEncodingForURI="true"
enableLookups="false"
redirectPort="8443" />
創建一個檢查 SESSION 的 JSP。
創建一個 JSP 文件到 Tomcat/webapps/ROOT 目錄下。
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'session.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<h1>
<%
out.println("This is (TOMCAT1), SESSION ID:" + session.getId());
%>
</h1>
</body>
</html>
上傳配置好的 TOMCAT 到 ECS。
上傳后啟動,就可以看見你的 TOMCAT 了:<服務器地址>:8080/session.jsp。 如看見的是如下字樣,說明 TOMCAT 連接 Memcache 成功了。
This is (TOMCAT1), SESSION ID:CAC189E5ABA13FFE29FCB1697F80182B-OCS
注意: 在網站負載較低情況下,能正常使用 Memcache 來緩存 tomcat session。如果負載較高,即發現 session 頻繁失效,需要升級 Memcache 規格才能正常使用。