负载均衡 + session sticky 会话保持 一
无状态:指的是服务器端无法知道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文档中:https://www.cnblogs.com/Yuanbangchen/p/16512511.html httpd: stickysession 实验测试在tomcat文档中:https://www.cnblogs.com/Yuanbangchen/p/16557748.html 优点:简单易配置 缺点:如果目标服务器故障后,如果没有做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 都变。