nginx+tomcat+memcache交叉存储实现的session保持

接着上一篇博客

现在我们是能访问到test.jsp,并且实现了负载均衡,但是子最大的问题是session不能保持,提交的内容在浏览器刷新后,nginx轮询到另外一台tomcat主机,session内容丢失。
首先想到的解决方法:
在nginx定义调度算法为ip_hash,根据源地址进行判断,这个地址只要访问到了一台tomcat主机上,那么他以后访问的还是此台tomcat主机。
但是此想法马上就感觉行不通,此方法可行的前提是:用户直接访问到nginx,再由nginx进行调度。
但是,现实情况是用户直接访问不到nginx,而是经过层层代理到达的nginx,源地址变为了CDN的ip地址,且在同一区域的用户的源地址都变为了CND地址,使用ip_hash无法解决问题。

经过上网查找后,发现可以使用sticky模块解决此问题,stiky是基于浏览器的cookie进行的。
但是我们的openresty目前没有此模块,所以需要将此模块编译到openresty,
编译方法:与原先编译openresty的参数保持一致,新添加 --add-module参数,后接下载的sticky模块的路径,再次编译,编译完成后make(不需要make install),将objs目录中新编以的nginx复制到openresty/nginx/sbin/nginx对元有的nginx进行覆盖。
在nginx配置文件中添加sticky:
在这里插入图片描述
完成后reload nginx,
在这里插入图片描述

进行测试:
在这里插入图片描述
测试结果为,提交的数据没有丢失,刷新页面后sission保持。

新的问题又来了,此时我们访问的是server3上的tomcat,要是将server3的tomcat关掉,再次刷新页面应该会访问的是server4,但是我们体检的信息还会在吗?
测试:

[root@server3 bin]# ./shutdown.sh 
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar

访问:
在这里插入图片描述
成功调度到server4上,但是之前提交的信息已经没有了。

我们提交的信息是存放在tomcat的内存区域中,当tomcat3节点宕机后,server4接管用户请求,但是server4不能在server3中的tomcat中获取信息。信息自然就会丢失,所以进行设想,我们提交的数据在往tomcat内存中保存的同时,能不能也放到其他地方,比如memcache?

思路:

  • 可以设计共享存储,两台tomcat的数据都存放在一个memcache,当一台tomcat宕机后,另外一台就能在memcache取到信息。
    在这里插入图片描述
    此方法可行,但是最大的问题:memcache为单点,万一memcache挂掉比起tomcat挂掉还要严重。

两个memcache?
在这里插入图片描述
在server3和server4上各起memcache,一台机器挂掉后还是不能解决问题。

交叉存储?
在这里插入图片描述
此方法可行性根高,server3上的sisson信息同时保存到本机的memcache和server4上的memcache,当server3宕机后,server4机关用户请求,可以在本机的memcache取到session信息,对session进行保持,同时也没有单点的存在。

针对第方法进行部署:
首先在网上找到相应的jar包:
在这里插入图片描述
将jar包拷贝到/usr/localtomcat/lib/(我自己的tomcat安装位置时在/usr/local)【server3、server4】
注意:没有memcache-session=manager-tc6-1.6.3.jar
注意删除。

server3:
编辑/usr/local/tomcat/conf/context.xml :
添加内容:

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.5.3:11211,n2:172.25.5.4:11211"##n1对应server3 n2对应server4
failoverNodes="n1" ##当出现故障时存储的位置
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>

server4:

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.5.3:11211,n2:172.25.5.4:11211"
failoverNodes="n2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>

编辑完成后server3、server4重启tomcat。
server3、server4打开memcached:

systemctl start memcached 

测试:
在这里插入图片描述
可以看到目前访问的时server4上的tomcat,存储位置在n1(server3上的memcache),提交几条信息。此时关掉server4上的tomcat:

[root@server4 bin]# ./shutdown.sh 
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar

刷新浏览器页面:

在这里插入图片描述
可以看到此时处理用户请求的为server3上的tomcat,存储位置为n1
session成功保持!
再次关掉server3上的memcached(n1):

[root@server3 bin]# systemctl stop memcached

再次刷新页面:
在这里插入图片描述
session保持,存储切换到了n2(server4上的memcache),且能继续提交信息。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值