文章目录
一、什么是session
Session
是指会话控制,是保存在服务器上一种机制,当客户端访问服务器的时候,服务器会把信息以某种形式记录在服务器上,恰恰和Cookie相反。
Session经常用于会话过程中保证一定状态的信息,比如,用户在登录的时候,需要浏览web应用程序,并且存储是在页面重新被加载的时候,Session始终保持着任何时间都可以在设备上进行访问,但是随着用户的增多,Session的服务器内存也要不断加大,Session也会使用持久方法的限制。
session和cookie的作用有点类似,都是为了存储用户相关的信息。不同的是,cookie是存储在本地浏览器,而session存储在服务器。存储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器的资源,但现在服务器已经发展至今,一些session信息还是绰绰有余的。
1.1 session的工作原理
http协议是无状态的,即你连续访问某个网页100次和访问1次对服务器来说是没有区别对待的,因为它记不住你
当客户端向服务器发出请求的时候,服务器会保存一个session
,当session第一次被启用时,同时也是在客户端上形成一个cookie文件,首次使用session_start()函数,并且PHP去加载已经储存的session变量,并且通过函数去注册变量,当脚本执行完毕后,会自动保存到session库中,已方便下次使用。
1.2 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.3 Nginx+tomcat+memcached
使用nginx作为前端服务器来实现tomcat负载均衡及高可用,同时基于jsp的动态特征,我们将引入memcache来保持网页在连接过程中的session保持,利用memcached把多个tomcat的session集中管理
图解:
客户端请求时nginx通过负载调度算法将请求调度至某一后端服务器;tomcat 把会话通过组播的方式复制到集群各节点;所有节点共享会话;
当memcached有两个时可以采用交叉存储,可以更好的避免单点故障
二、session共享具体实现
在上一篇博客中,我们已经实现了会话保持,但是仍旧出现问题,当一台tomcat服务器宕机,另一台服务器无法获取数据,造成数据丢失,现在我们就来解决这个问题。上篇博客只是介绍了一下cookie。
实验环境
该实验环境与上上篇博客一样,都是真机测试,server1lnmp主机,server2、server3为tomcat服务器,所以可以接着博客来做。
主机(版本:ip) | 功用 |
---|---|
虚拟机server1(rhel7.3:172.25.2.1) | lnmp环境主机 |
虚拟机server2(rhel7.3:172.25.2.2) | tomcat1服务器 |
虚拟机server2(rhel7.3:172.25.2.2) | tomcat2服务器 |
真机(rhel7.3:172.25.2.250) | 测试机 |
1、实现负载均衡和不轮询
(ip_hash,上篇博客中不轮询的实现是在nginx中加入了nginx-sticky-module模块实现的cookie绑定)
step1 编写测试页内容:
在server2中:
cd /usr/local/tomcat/webapps/ROOT/ #tomcat默认发布目录
vim test.jsp
写入:
<%@ page contentType="text/html; charset=GBcdK" %>
<%@ 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> session " + session.getId()+"<br>");
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
%>
发给server3:
scp test.jsp root@172.25.254.3:/usr/local/tomcat/webapps/ROOT/test.jsp
step2 测试:
访问172.25.254.2:8080/test.jsp和172.25.254.3:8080/test.jsp
访问172.25.254.1/test.jsp #依旧轮询
本质轮询页面一样,这是为了看负载均衡效果这样设置,可以就看出session信息变了,并没有保持,下边通过ip_hash
step3 不轮询的设置:
在server1中:
cd /usr/local/lnmp/nginx/conf/
vim nginx.conf
写入21行内容:
17 http {
18 include mime.types;
19 default_type application/octet-stream;
20 upstream tomcat {
21 ip_hash;
22 server 172.25.254.2:8080;
23 server 172.25.254.3:8080;
24 }
nginx -t
nginx -s reload
step4 测试:
访问172.25.254.1/test.jsp #不再轮询
cd /usr/local/tomcat
bin/shutdown.sh #宕掉server2的服务器,才会访问到server3
2.实现交叉存储
在server2和server3中:
step1 把需要的安装包放在指定目录下:
cp * /usr/local/tomcat/lib/
step2 修改测试页内容:
vim /usr/local/tomcat/conf/context.xml
写入: #server3的文件内容只需要修改38行的n2为n3即可
36 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
37 memcachedNodes="n2:172.25.254.2:11211,n3:172.25.254.3:11211"
38 failoverNodes="n2"
39 requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
40 transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
41 />
42 </Context>
- xml常用于数据存储和传输,文件后缀为 .xml
它是可扩展标记语言(Extensible Markup Language,简称XML),是一种标记语言 。
标记,指计算机所能理解的信息符号;
通过此种标记,计算机之间可以处理包含各种信息的文章等
1 、标记,指计算机所能理解的信息符号;
2、 通过此种标记,计算机之间可以处理包含各种信息的文章等。
XML设计用来传送及携带数据信息,不用来表现或展示数据,所以XML用途的焦点是它说明数据是什么,以及携带数据信息。而HTML语言则用来表现数据
step3 安装并开启memcached:
yum install memcached -y
systemctl start memcached
netstat -anlp| grep memcached
step4 重启tomcat:
cd /usr/local/tomcat/
bin/shutdown.sh
bin/startup.sh
step5 测试:
刷新页面:
- 访问server2时出现n3表示:已经把数据存放到了server3中
- 访问server3时出现n2表示:已经把数据存放到了server2中
- 访问http://172.25.254.1/test.jsp时:server3的数据写在server2上,而当使用bin/shutdown.sh命令将server3的tomcat服务宕掉时,再刷新页面,server2来提供服务,而刚刚的数据已经保存在了server2的服务器上,所以我们之前的数据并不会丢失,而server2的数据也被写在server3中,即使server2的tomcat服务挂掉,我们也能从server3中获取到我们的数据。这样就实现了交叉存储。
注意:这里是挂掉服务而不是整个服务器宕掉。因为如果服务器宕掉的话,memcache也就挂掉了,就无法实现交叉存储。