负载均衡 + 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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的负载均衡调度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
负载均衡 + 会话保持方式 + 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复制集群 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
负载均衡 + 会话保持方式 + 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 @   yuanbangchen  阅读(1295)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示