负载均衡 + 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 都变。 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现