负载均衡 + 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 都变。

 

 

posted @ 2022-08-07 17:40  yuanbangchen  阅读(618)  评论(0编辑  收藏  举报