memcached实现tomcat集群的session共享

memcached实现tomcat集群的session共享

测试环境:windwos 64位系统

测试内容:Apache服务器做反向代理以实现集群的负载均衡,Tomcat做服务器集群,并用Memcach实现集群内的Session共享

测试工具:Apache2.2Tomcat7.0.54memcached 1.4

 

一.软件准备

首先是下载Apache2.2版本,可以去http://httpd.apache.org/download.cgi下载。

注意,该网页上的是下载unix版本的,因此我们需要找到windows版本的下载位置。

 

依次点击Other files-->binaries-->win32à选择no ssl.msi进行下载。

 

 


 

下载完成之后,安装即可。安装完成之后,可以在系统服务中看到Apache2.2

 

为了测试是否安装成功,可以在浏览器地址栏输入localhost,看到以下界面,则说明是安装成功了。 

 

接着是下载tomcat,然后将下载的压缩包解压,并复制两份,分别命名为tomcat1tomcat2,这是作为tomcat集群使用。为了方便配置,可以将其放在与Apache同一个文件目录下。

 

使用Tomcat的时候,需要注意的是要配置JAVA环境,要配置JAVA_HOMECLASSPATH系统环境变量

 

二.Apache配置

Apache 2.2集成了mod_jk功能,相对较早版本,不需要再进行繁琐的worker.properties配置,配置过程大幅简化。

首先找到Apache2.2\conf文件夹下的httpd.conf文件,打开并找到

 

将图中几行代码前面的注释(也就是代码之前的“#”)去掉,作用是使Apache在启动时自动加载代理(proxy)模块。

继续下拉文档找到Include conf/extra/httpd-vhosts.conf,去掉前面的注释符。

用文本编辑器打开conf/extra/httpd-vhosts.conf,配置虚拟站点,在最下面加上

 

 这里balancer://是告诉Apache需要进行负载均衡的代理,后面的cluster是集群名,可以随意取,两个日志引擎ErrorLog负责记录错误,CustomLog负责记录所有的http访问以及返回状态,日志名可以自己取,这里取为lbtesthttpd-vhosts.conf配置完毕,回到httpd.conf,在文档最下面加上

 


 ProxyRequests Off 是告诉Apache需要使用反向代理(利用Apache进行负载均衡必须使用反向代理), 用于配置工作在tomcat集群中的所有节点,这里的"cluster"必须与上面的集群名保持一致。

Apache通过ajp协议与tomcat进行通信,ip地址和端口唯一确定了tomcat节点和配置的ajp接受端口。loadfactor 是负载因子,Apache会按负载因子的比例向后端tomcat节点转发请求,负载因子越大,对应的tomcat服务器就会处理越多的请求,如两个 tomcat都是1Apache就按11的比例转发,如果是21就按21的比例转发。route参数对应后续tomcat配置中的引擎路径 jvmRoute

至此,Apache的配置完成。

 

三.Tomcat配置

之前在文件夹已经新建了两个Tomcat服务器,保持tomcat1的配置不变,找到tomcat2目录下conf文件夹下的server.xml文件,打开并修改如下三个端口:

 

这是关闭端口,默认值为8005

 

这是侦听端口,默认值为8080

 

这是tomcat接收从Apache过来的ajp连接请求时使用的端口,默认值为8009

 

因为我们需要在一台电脑上部署两台服务器,为了避免端口冲突,所以修改服务器端口是必要的。如果服务器安装在两台不同的电脑上,则可以不修改端口号。

端口配置完毕后,需要配置route参数。打开tomcat1/conf/server.xml文件,找到


<Engine>标签里添加jvmRoute,参数应当和Apache配置中httpd.conf文件最后添加的route参数相同。这里我们根据Apache配置,将tomcat1中的jvmRoute赋值为jvm1。同样的将tomcat2jvnRoute参数赋值为jvm2。做这个修改则是为了实现负载均衡。

接下来,我们分别在两个tomcat里的webapps文件里新建一个news文件夹,并在里面新建index.jsp文件。编写测试代码如下:

分别重启Apachetomcat1tomcat2,然后在浏览器地址栏输入http://localhost/news/index.jsp。会看到如下页面:

再次刷新页面,则会看到:

这里我们可以看到两点:

1. 每次刷新页面,页面中的一串session id都会改变。因为是两台服务器在处理请求。

2. 每次刷新页面,jvm1jvm2交替出现。事实上,jvm1jvm2正是我们刚才配置的集群里的两台服务器。之所以会交替出现,是因为在Apache配置负载均衡时,我们将比例其配置为1:1,此项可在Apache中修改。

 

三.Session共享

作为一个服务器集群,没有session共享显然是不行的。试想一个用户登录后,向服务器重新发送一个请求,这时若没有session共享,那么则需要一只重复登录。对于用户而言,体验会很差;而对于服务器而言,数据访问的压力会很大。此次测试,我采用了两种session共享的办法:

1. 利用tomcat里自带的session复制功能,它配置简单。是以组播的方式向集群中所有的服务器复制session。即session一旦改变,则会向急群众其他的服务器发送新的session。这样很容易会引起广播风暴。


tomcatconf/server.xml文件中找到

 

将其注释去掉。接着,在我们刚刚建立的news文件夹下新建一个WEB-INF的文件夹,并在其中新建web.xml文件。在<web-app>节点中添加

<distributable/>,告诉服务器,要作分布式处理。

两个tomcat都做同样的处理,接着重启tomcat服务器,可以看到如下效果:

 

 

这说明,两次请求分分别由tomcat1tomcat2处理,并且sessionid并没有改变,说明实现了sessionId的共享。

 

2. 利用高性能分布式缓存系统memcachd来达到session共享的目的。Memcached系统中有一个memcached-session-manager工具,他可以将session中的信息缓存到内存,仅当session信息改变的时候从memcached内存中存取,其余时候则从本机读取。这样,从内存中存取session不但能够大大提高访问速率,而且减少了访问数据库的次数,降低了数据库压力。

 

首先需要安装memcached.有关于所有memcached的资料,都可以在下面一个网站找到,包括它的安装包,所用到的jar包,以及如何配置的。

https://code.google.com/p/memcached-session-manager/wiki/SetupAndConfiguration

使用memcached比较麻烦的就是要下对相应版本的jar包,如下列表是我本次环境成功测试所用到的jar包。

准备好需要的东西后,开始安装memcached。下载文件中有个memcached.exe文件,但是在windows下直接双击安装是无效的的。我们需要打开命令行,并进入到memcached.exe所在文件目录,并在命令行输入memcached.exe –d install。这是安装命令。安装完成后,在服务窗口可以看见有一个Memcache服务。

 

这时候可以手动启动memcached,也可以在memcached.exe所在目录下输入如下指令memcached.exe –d start,这样就启动了memcached

我们可以检验一下memcached是否成功安装并启动。在命令行窗口输入如下指令:telnet 127.0.0.1 11211,回车。

11211memc服务的默认端口,可以通过-p指令修改。

输入上面指令之后,会跳出一个新界面,再次输入stats,则会看到如下参数:

 

这就说明,我们的memcached服务已经成功启动了。

接下来将我们刚刚下载的jar包都放入tomcat/lib目录下。在tomcat/conf/context.xml文件中加入下面一段代码:


这里我们采用的是kyro序列化方式,因为此种方式序列化速度相较于默认的java序列化方式快很多。设置了一个节点n1,意味着session是从n1这个节点的缓存中获取的。重新启动tomcat服务器,并刷新页面,可以看到如下两张图。

 

 

 

首先实现了负载均衡,jvm1jvm2各出现一次。其次实现了session共享,因为两次请求后sessionid并没有改变。Session id后面跟的n1就是我们刚刚所设置的节点。

至此,我们用Apache实现了tomcat的反向代理和负载均衡,并用memcached实现了集群的负载均衡。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值