会话(session)保持机制


概述

现在我们有两台api机器。这就需要在它们前面搭一个nginx来做负载均衡。所谓的负载均衡就是说保证俩台机器的访问请求量大体是相同的。用专业一点的词语来说,就是pv( page view)要大致的相同,相差不多。如果俩台机器的pv相差较大,那么可能的原因也有很多。下面聊一下会话(session)保持机制对会话的影响。

什么是会话保持

    会话保持是指在负载均衡器上的一种机制,可以识别客户端与服务器之间交互过程的关连性,在作负载均衡的同时还保证一系列相关连的访问请求都会分配到一台机器上。用人话来表述就是:在一次会话过程中发起的多个请求都会落到同一台机器上。

会话(session)与连接(connection)之间的区别

   在讨论负载均衡的时候,如果我们不细加讨论的话,很容易将会话与连接混淆。

   连接:我们都知道TCP/IP协议中经常提到的:”三次握手,四次挥手“的问题。自然也知道客户端和服务器端是经过三次握手以后,建立了连接(connection)。当它们建立了连接以后,那么客户端就可以向服务端发送多次的请求。如果客户端和服务器端需要断开连接,那么就需要经过四次的挥手过程才能够断开连接。

  会话:如果用户需要登录,那么可以理解为经过三次握手以后,客户端与服务器端建立的就是会话(session)。如果用户不需要登录,那么可以理解为经过三次握手以后,客户端与服务器端建立的就是连接(connection).

 连接(会话)删除:一般来说,所有的厂商都会对负载均衡服务器的最大并发连接数有限制。每一个连接都是有时间限制的。如果在规定的时间内某个连接不再有请求,那么这个连接就会被清除掉。删除了连接以后,客户端的请求将无法继续发往同一个后端的服务器,这时候就需要遵循负载均衡器的流量分发策略。换句话说,所谓的会话保持机制,就是将客户端与服务器之间建立的多个连接,都发送到相同的服务器进行处理。如果在客户端和服务器之间部署了负载均衡设备,那么可能出现的一种情况就是这多个连接可能会被转发到不同的服务器进行处理。

场景分析

假设下面场景中的负载均衡组件都没做会话保持功能

异常场景1:(什么破系统啊,竟然需要重复登录)
某人喜欢到网上商城上面买东西,有几次偶然地发现登陆进商城后点击个人信息又要登陆一遍,这让他很困扰。
异常场景2:(见鬼了,客户端放入购物车的物品丢失了)
小康要买蛋白粉,在一个网上商城逛了很久终于找到一款合适的,他加入购物车,突然又想买个摇摇杯,把一个摇摇杯加入购物车(假设这个网站的购物车信息不存在redis中,存在jetty中),准备结算,发现购物车只有一个摇摇杯,蛋白粉不见了,这让他很困扰。

异常场景产生原因解析

场景1请求示意图

假设某人登陆进去是请求1,某人点个人信息是请求2

会话(session)保持机制_第1张图片

场景1解析
简单的来说,就是请求1和请求2被负载均衡服务器分发到了不同的机器上了。某人在机器1上登录了,但是由于没有做session共享和没有会话保持功能,所以,机器2上并不知道某人已经登录了。但是请求2又被转发到了机器2上,所以就出现了需要反复登录的这种情况。

场景2请求示意图
场景2与场景1类似,某人添加蛋白粉是请求1,某人添加摇摇杯是请求2,某人点击结账是请求3
场景2解析
某人把蛋白粉加入购物车,发送购物车添加商品请求(请求1)到服务器1
服务器1有某人的购物车信息,有蛋白粉商品
很快速地,某人把瑶瑶杯添加到购物车,发送购物车添加商品请求(请求2)到服务器n
服务器n有某人的购物车信息,有摇摇杯商品

某人点击结账,发送结账请求(请求3)到服务器n,这时,购物车里就只有摇摇杯了

场景2解决方法

一个简单的解决方法就是将购物车的物品存到数据库或者redis中,而不是jetty中,就是只要是存在一个可以共享的介质就可以了。

会话保持的实现原理
这里浅聊一下lvs的会话保持是怎么实现的
相关知识
其实会话保持是一个特性,支撑这个特性的技术叫lvs持久连接技术
IPVS(IP Virtual Server):运行在lvs下的提供负载平衡的一种技术
使用LVS架设的服务器集群系统有三个部分组成:
最前端的负载均衡层,用Load Balancer表示,里面的对象称为Director Server(分发器),也就是负载均衡服务器
中间的服务器群组层,用Server Array表示,里面的对象称为Real Server(真实主机),也就是我们部署代码的服务器
最底端的数据共享存储层,用Shared Storage表示,可以简单的理解为就是我们的数据库
图解
会话(session)保持机制_第2张图片

nginx中的iphash(比较简单的实现)
请求经过服务器,请求的ip信息及转发信息被记录到一个表中,继续转发请求

下次有请求过来,根据ip信息去找到对应的转发信息,继续转发请求,实现会话保持

会话(session)保持机制_第3张图片

缺点:当多个客户端通过代理或者地址转换的方式来访问服务器的时候,那么由于来源地址是一样的,那么所有的请求都会被分配到同一台服务器上,这样也会到时服务器之间的负载失衡严重。

session共享的会话保持
可以使用数据库,redis来保持会话。


会话保持的开启和关闭

修改keepalived配置文件,在虚拟服务器配置中可配置persistence_timeout参数

会话(session)保持机制_第4张图片


设置persistence_timeout参数
个人理解:设置了这个参数,也就是意味着需要保证同一个客户端在一个固定时间段中连接到同一个真实得服务器,ipvs就会创建连接模板,每个真实主机第一次过来的时候使用调度算法分发,接下来的分发地址都以连接模板里的地址为主
不设置persistence_timeout参数
个人理解:不设置这个参数,也就是意味着不需要保证同一个客户端在一个固定时间段中连接到同一个真实得服务器,那么ipvs会使用调度算法去调度每一个来自客户端的新请求

开启会话保持的影响

关于会话保持对负载均衡是否有影响:
经过实践我们知道,会话保持影响负载均衡
关于会话保持对响应速度是否有影响:
#会消耗部分资源创建连接模板
分发请求的时候不会使用调度算法,会有一个查找的过程,根据该客户端上次的真实主机地址转发

关于会话保持对并发是否有影响(个人理解)

可以观察到,开了会话保持,90%的pv都集中到一台机器上了,这样并发的瓶颈将会是那一台机器的最大并发量(就算有多台机器,也有可能几台机器就占了90%的pv,最大并发的瓶颈是几台机器最大并发之和)
如果关闭会话保持,pv接近平均分布,假设2台服务器,那么并发量应该是两台服务器最大并发量的总和,多台机器,pv接近平均分布,最大并发将是多台机器最大并发之和

结论

关闭会话保持,可以使系统均衡负载;
关闭会话保持,可以提高系统响应速度;
关闭会话保持,可以提高系统并发性能;


参考资料

session会话保持

理解cookie和session机制


你可能感兴趣的:(负载均衡)