简介
我们每次登录淘宝,不管在任意一台主机或手机上登录,我们的购物车里面的东西都不会变化,这是怎么做到的呢?那就是通过保存在服务端的session了。而通常像淘宝这样的网站,访问量那么大,服务端是有多台主机的,那么每次登录的时候,我们都不一定使用同一台后端主机进行。那么我们保存在服务端的session怎么进行多台后端主机的共享呢?
实现思路
1、一种方法是将所有session给每一台后端主机分发一份
2、另一种方法是所有的session都保存到同一台服务器上,后端主机每次使用时候,都向session server获取session信息。
存放session的server有redis,和memcached。不同的是redis是永久保存的,而memcached是将session保存到内存中。我们这里先使用memcached实现吧。
因为memcached是放在内存中的,一旦主机断电或损坏,都将导致数据丢失,那就最低需要两台memcached服务器了。
实现环境
1、tomcat两个节点:172.16.252.162(tomcatA),172.16.253.44(tomcatB)
2、memcached两个节点:172.16.252.162(memcachedA),172.16.253.44(memcachedB)
3、一个负载均衡节点:172.16.250.200
因为电脑不能开启多台虚拟机,就将memcached和tomcat放在了同一台主机上了。
软件要求
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
实验步骤
1、将上述5个软件放入到各tomcat节点的tomcat安装目录下的lib目录中
2、分别在两个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.252.162:11211,n2:172.16.253.44:11211"
failoverNodes="n1"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"/>
</Context>
n1和n2不是主机名,仅仅是一个标示而已
3、分别为两个context提供测试页面:
tomcatA:
# mkdir -pv /usr/share/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.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
# mkdir -pv /usr/share/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 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>
4、配置反向代理
upstream appsrvs
{
server 172.16.252.162:8080
;
server 172.16.253.44:8080
;
hash $cookie_name consistent;
}
server {
listen 80;
location / {
proxy_pass http://appsrvs/
;
index index.html index.jsp index.htm;
}
}
5、安装memcached,并启动
yum install memcached -y
systemctl start memcached
6、测试结果,
在浏览器中访问http://172.16.250.200/test,结果如下所示,其session ID在负载均衡环境中保持不变。
查看结果如下图所示:
发现两个session已经相同了,此处使用的memcached使用的是n1服务器。