基于Tomcat服务,nginx作为负载均衡器添加stick粘滞位解决数据损失,添加session实现数据交叉存放

增加测试页面:

vim /usr/local/apache-tomcat-7.0.37/webapps/ROOT/test.jsp
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster App Test</title></head>
<body>
Server Info:
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
<%
out.println("<br> ID " + session.getId()+"<br>");
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.print("<b>Session list</b>");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();/
String value = session.getAttribute(name).toString();
out.println( name + " = " + value+"<br>");
System.out.println( name + " = " + value);
}
%>
<form action="test.jsp" method="POST">
name:<input type=text size=20 name="dataName">
<br>
key:<input type=text size=20 name="dataValue">
<br>
<input type=submit>
</form>
</:/body>
</html>

添加这个测试页面之后,我们可以在浏览器上访问 http://172.25.34.2/test.jsp是一个简单的上传数据界面。

例如,访问网址后,界面上出现的是server1服务器的ip,我们可以尝试在name,key上传入数值,同时留意对应的ID,此时server1提供服务,数据被上传到server1服务器。
再一次上传数据,点击提交可以看到ID发生改变,由server2提供服务,数据被存储到sever2服务器中。

多次试验发现,由于轮询机制,存储信息是交替进行的,会损失客户数据信息,我们采用stick粘滞位的方法,来解决该问题,在实际中,不能让客户上传的数据丢失不见。

添加stick粘滞位解决数据损失

在nginx配置文件中增加tomcat模块,nginx-1.14不支持sticky,所以使用nginx-1.10版本,重新编译nginx
###注意:将/usr/local/lnmp/nginx 目录全部删除 再次编译
###如果不想删除的话,可以把之前版本的nginx移动到/mnt/,nginx -s stop 关闭服务

tar zxf nginx-sticky-module-ng.tar.gz 

cd nginx-1.10.3
./configure --prefix=/usr/local/lnmp/nginx   --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio --add-module=/usr/local/nginx-sticky-module-ng
make && make install

ln -s /usr/local/lnmp/nginx/sbin/nginx /sbin/

vim /usr/local/lnmp/nginx/conf/nginx.conf
upstream tomcat {
        sticky; ##粘滞。作用:不会让缓存的时候,来回跳转
        server 172.25.0.1:8080;
        server 172.25.0.2:8080;

}
gzip  on; #开启gzip,传出图片时会进行压缩,速度会加快
location / {
            root   /usr/local/tomcat/webapps/ROOT;
            index  index.html index.htm;
        }
       location ~ \.jsp$ {
           proxy_pass   http://tomcat;
       }
       
nginx ##开启服务

再次刷新页面,提交数据时,服务器和ID不会改变,提交的内容不再交替存储,而是存储到了一台服务器中。

添加session实现数据交叉存放

一、cookie:

在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。cookie的出现就是为了解决这个问题,第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个了。cookie存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4KB。因此使用cookie只能存储一些小量的数据。
二、session:

session和cookie的作用有点类似,都是为了存储用户相关的信息。不同的是,cookie是存储在本地浏览器,而session存储在服务器。存储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器的资源,但现在服务器已经发展至今,一些session信息还是绰绰有余的。
三、cookie和session结合使用:

web开发发展至今,cookie和session的使用已经出现了一些非常成熟的方案。在如今的市场或者企业里,一般有两种存储方式:

1、存储在服务端:通过cookie存储一个session_id,然后具体的数据则是保存在session中。如果用户已经登录,则服务器会在cookie中保存一个session_id,下次再次请求的时候,会把该session_id携带上来,服务器根据session_id在session库中获取用户的session数据。就能知道该用户到底是谁,以及之前保存的一些状态信息。这种专业术语叫做server side session。

2、将session数据加密,然后存储在cookie中。这种专业术语叫做client side session。flask采用的就是这种方式,但是也可以替换成其他形式

1)进入/usr/local/tomcat/lib目录(server1,2都做)
将以下jar包拷贝到该目录:

asm-3.2.jar
kryo-1.04.jar
kryo-serializers-0.10.jar
memcached-session-manager-1.6.3.jar
memcached-session-manager-tc7-1.6.3.jar(最重要)
minlog-1.2.jar
msm-kryo-serializer-1.6.3.jar
reflectasm-1.01.jar
spymemcached-2.7.3.jar

2)编辑/usr/local/tomcat/conf/context.xml文件,加入session共享配置
context.xml 该文件的作用是配置各种数据库的连接池

XML概念 xml常用于数据存储和传输,文件后缀为 .xml 它是可扩展标记语言(Extensible Markup
Language,简称XML),是一种标记语言 标记,指计算机所能理解的信息符号; 通过此种标记,计算机之间可以处理包含各种信息的文章等

XML设计用来传送及携带数据信息,不用来表现或展示数据,所以XML用途的焦点是它说明数据是什么,以及携带数据信息。而HTML语言则用来表现数据

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

3)添加memcache缓存功能

yum install memcached -y
systemctl memcached start
yum install telnet -y 

4)重启tomcat

 /usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh 

浏览器访问:172.25.34.2/test.jsp
例如:在server1上传数据之后,会自动保存数据到server2的memcache(对应n2),可以分别用telent命令在服务器上测试,发现server2上存有数据,数据经过加密

5)再次测试,如果服务器挂了,session不会被重置
在server1上关闭Tomcat服务,模拟服务器故障,这时会切换到server2提供服务,数据依旧存在,数据由server2中的memcache提供

测试的时候:想更改n1 n2 的时候 可以手动停掉server1 server2上的tomcat和memcached

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值