负载均衡浅析

负载均衡浅析
  • 主要浅析负载均衡解决了并发问题,但是导致的session问题
为什么会有session问题?

(1)负载均衡解决的问题和引入的问题

  • 负载均衡可以解决并发问题
  • 负载均衡带来的问题:session问题
  • 为什么会存在session问题:
    a.http协议的特性(①无状态 ②有连接 ③短连接)
    b.由于http协议本身的设计问题加上现在WEB网页的发展(网页后端程序动态生成) ==> 需要保持一个会话状态。

带来session问题的原因?
(2)session问题的原因详解:

   一个连接将占据WEB server一个socket和一个文件描述符fd,在高并发的场景下,服务器端承受不了与客户端一直保持连接,因此在http短连接的基础上实现连接复用(keepalived)。

   目前的动态网页技术时,需要知道上一次请求和这一次请求之间是否属于同一用户?是否有关联性?因此需要知道是否有关联性?就必须保持状态。eg:登录

   session与cookie 见下面(3)


session与cookie?
(3)session与cookie

   cookie:客户端数据的持久化技术保存在浏览器。server端将cookie发给浏览器,浏览器收到cookie一般会按域保存cookie,然后再发起对某域请求时,将在request请求的header中携带没有过期的cookie发送至WEB server。(注:无论是不是动态WEB server均可以设置cookie,cookie是http数据报文header的一部分)。

   session依赖于cookie,在cookie中设置一个特殊的cookie的值(key-value),eg:sessionID=“hash string(哈希字串)”,但是将sessionID="hash string(哈希字串)"这变成会话级存储,让WEB server将sessionID=xxx保存,当浏览器关闭,sessionID=xxx才立即销毁(用于保存当前会话状态)

  • 浏览器支持cookie,浏览器中的代码会对过期的代码进行清理(sessionID过期)或者会话级的sessionID,关闭浏览器,浏览器就清理会话级sessionID。因为sessionID不会存至磁盘,在内存中保存着。当然这是’ 正经的浏览器 ',如果假设自己编写一个浏览器,将sessionID保存于磁盘,也是可以的,这说明WEB框架中或者作为server端,client的一切东西都是不可信的。

   对于动态服务器,一般都会对初次访问的client发送sessionID,用于保存当前client的会话状态,目前是动态服务器的标准配置,动态服务器会在内存中开辟出一段空间生成session并保存session。注意:动态服务器端开辟的空间可不仅仅保存sessionID,但是发送给client的仅仅是sessionID。

   浏览器访问web server图示过程:
负载均衡浅析_第1张图片


session的解决方案?
(4)session问题的解决方案:
  • ①源地址hash或者基于cookie hash,然后将其请求一直绑定至后端某一动态服务器。<存在问题:指标不治本,万一后端动态服务器故障><不推荐使用这种解决方案>

  • ②session复制:让后端所有的动态服务器实现session同步。<存在问题:对内网络和后端服务器内存消耗均是极大> <使用场景:后端服务器较少,数据较少>

  • session共享:②也要经过网络,反正都要经过网络传输数据,那么直接使用缓存服务保存session信息,实现后端动态服务器的session同步。<目前一般使用的解决方案>


session共享?
(5)session共享 - 用于解决动态服务器保存session的问题,主要是为解决一段时间内保持用户与当前服务器通信的会话状态。
  • 目前session共享服务使用最多的:redis 和 memcache.

  • 实现session共享涉及到跨主机跨进程通信(是否跨主机,要看缓存服务部署在哪个位置了)。
    <进程间通信:https://blog.csdn.net/wdirdo/article/details/103135648>


你可能感兴趣的:(web,Tomcat,redis)