无状态:指的是服务器端无法知道2次请求之间的联系,即使是前后2次请求来自同一个浏览器,
也没有任何数据能够判断出是同一个浏览器的请求。后来可以通过cookie、session机制来判断。
浏览器端第一次HTTP请求服务器端时,在服务器端使用session这种技术,就可以在服务器端产生一个随机值即SessionID发给浏览器端,浏览器端收到后会保持这个SessionID在
Cookie当中,这个Cookie值一般不能持久存储,浏览器关闭就消失。浏览器在每一次提交HTTP请求的时候会把这个SessionID传给服务器端,服务器端就可以通过比对知道是谁了
1.Session通常会保存在服务器端内存中,如果没有持久化,则易丢失
2.Session会定时过期。过期后浏览器如果再访问,服务端发现没有此ID,将给浏览器端重新发新的SessionID
3.更换浏览器也将重新获得新的SessionID
4.服务器端如果故障,即使Session被持久化了,但是服务没有恢复前都不能使用这些SessionID。
5.如果使用HAProxy或者Nginx等做负载均衡器,调度到了不同的Tomcat上,那么也会出现找不到SessionID的情况。
有连接:是因为HTTP1.x基于TCP协议,是面向连接的,需要3次握手、4次断开。
短连接:Http 1.1之前,都是一个请求一个连接,而Tcp的连接创建销毁成本高,对服务器有很大的影响。所以,自Http 1.1开始,支持keep-alive,默认也开启,一个连接打开后,会保持一段时间(可设置),浏览器再访问该服务器就使用这个Tcp连接,减轻了服务器压力,提高了效率。
负载均衡 + 会话保持方式三种方式
1、nginx访法的 session sticky
Session绑定
nginx:source ip
HAProxy:cookie 实验测试在hpproxy文档中:
httpd: stickysession 实验测试在tomcat文档中:
优点:简单易配置
缺点:如果目标服务器故障后,如果没有做sessoin持久化,就会丢失session
2、session复制集群
Tomcat自己的提供的多播集群,通过多播将任何一台的session同步到其它节点。
缺点
Tomcat的同步节点不宜过多,互相即时通信同步session需要太多带宽
每一台都拥有全部session,内存占用太多
3、session server
session 共享服务器,使用memcached、redis做共享的Session服务器。
实例1: 实例1 nginx实现后端tomcat的负载均衡调度
负载均衡 + 会话保持方式 + session sticky会话黏性
1.规划
192.168.80.100 t0 调度器 Nginx、HTTPD
192.168.80.130 t1 tomcat1 JDK8、Tomcat8
192.168.80.140 t2 tomcat2 JDK8、Tomcat8
1.tomcat 设置
<Engine name="Catalina" defaultHost="www.aaa.com">
<Host name="www.aaa.com" appBase="webapps"unpackWARs="true" autoDeploy="true">
<Context path="/test" docBase="/data/test" reloadable="false" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhostA_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
tomcat 设置
<Engine name="Catalina" defaultHost="www.bbb.com">
<Host name="www.bbb.com" appBase="website"unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhostB_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
Tomcatt1和t2节点 /data/webapps/ROOT/index.jsp测试用jsp
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试页面</title>
</head>
<body>
<div>On <%=request.getServerName() %></div>
<div><%=request.getLocalAddr() + ":" + request.getLocalPort() %></div>
<div>SessionID = <span style="color:blue"><%=session.getId() %></span></div>
<%=new Date()%>
</body>
</html>
2.nginx设置
http {
upstream tomcats {
ip_hash;
server www.aaa.com:8080;
server www.bbb.com:8080;
}
server {
listen 80;
server_name www.magedu.net;
location / {
proxy_pass http://tomcats;
}
}
}
5.添加nginx和tomcat和客户端hosts解析
192.168.80.100 www.magedu.net
192.168.80.140 www.aaa.com
192.168.80.130 www.bbb.com
总结:同后端主机和同一浏览器 SessionID 不变
同后端主机和不同浏览器 SessionID 变
不同后端主机SessionID 都变。
实例2 httpd实现后端tomcat的负载均衡 调度session复制集群
负载均衡 + 会话保持方式 + session sticky会话黏性
1.规划
192.168.80.110 t0 调度器 Nginx、HTTPD
192.168.80.130 t1 tomcat1 JDK8、Tomcat8
192.168.80.140 t2 tomcat2 JDK8、Tomcat8
2.Tomcat两台主机设置
1.tomcat 设置
<Engine name="Catalina" defaultHost="www.aaa.com" jvmRoute="Tomcat1"> #添加jvmRoute="Tomcat1"
<Host name="www.aaa.com" appBase="webapps"unpackWARs="true" autoDeploy="true">
<Context path="/test" docBase="/data/test" reloadable="false" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhostA_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
tomcat 设置
<Engine name="Catalina" defaultHost="www.bbb.com" jvmRoute="Tomcat1">
<Host name="www.bbb.com" appBase="website"unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhostB_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
3.Tomcatt1和t2节点 /data/webapps/ROOT/index.jsp测试用jsp
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>lbjsptest</title>
</head>
<body>
<div>On <%=request.getServerName() %></div>
<div><%=request.getLocalAddr() + ":" + request.getLocalPort() %></div>
<div>SessionID = <span style="color:blue"><%=session.getId() %></span></div>
<%=new Date()%>
</body>
</html>
4.http设置
cat /etc/httpd/conf.d/www.conf
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<VirtualHost *:80>
ServerName www.magedu.com
ProxyRequests Off
ProxyVia On
ProxyPreserveHost On
ProxyPass / balancer://lbtomcats/
ProxyPassReverse / balancer://lbtomcats/
</VirtualHost>
<Proxy balancer://lbtomcats>
BalancerMember http://www.aaa.com:8080 loadfactor=1 route=Tomcat1
BalancerMember http://www.bbb.com:8080 loadfactor=2 route=Tomcat2
ProxySet stickysession=ROUTEID
</Proxy>
5.添加nginx和tomcat和客户端hosts解析
192.168.80.120 www.magedu.net
192.168.80.140 www.aaa.com
192.168.80.130 www.bbb.com
6.总结:同后端主机和同一浏览器 SessionID 不变
同后端主机和不同浏览器 SessionID 变
不同后端主机SessionID 都变。