做 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 规格才能正常使用。