读一篇文章需要把握文章结构,所以还是按照惯例,先对文章大纲列举一下。
===========本文主要内容===========
1,几个相关概念简介
——Session工作原理
——集群概念
——反向代理/负载均衡
2,集群种常见Session问题及解决方案
3,记忆方式或总结
==================================
一、几个相关概念简介
1,Session工作原理
Session我之前举例子给朋友说是服务端创建的一个水池,可以放东西进去,也可以取。
常用的如:打开浏览器访问网页,服务端会生成一个key(sessionId),放进去,并且返回给客户端,客户端拿到以后每次请求都带上它给服务端,服务端通过sessionId判断是否是同一个Session(会话)。如还不理解,请回复:session,见详解。
2,集群概念
相同的东西重复几次就是集群。相同应用,重复部署几台。
集群解决什么问题:
(1)解决访问量增高,增加服务的吞吐量。如:10000个请求过来,我可以部署100台(重复),每台处理100个请求,而不是10000个访问一台。
(2)集群还有一个作用,解决服务高可用的问题(失效转移功能),一台服务器宕机,保证访问可以到其他服务器,保证服务可用。
3,反向代理/负载均衡
上面说的重复部署100台(集群),怎么把用户请求合理分配到这100台服务器上面,就是代理需要做的事情,现在大多企业用的都是nginx,如需要对nginx理解,请回复:nginx,见详解。
负载均衡的主要是在业务访问量增加,一台服务扛不住,需要集群,而怎么把请求分发到最优的一台服务器上就是负载均衡解决的问题。比如说这台服务器压力上限5000个,结果得了1万个请求,那第5001个请求,发到另一台服务器了。见名知意——负载均衡。
注1:负载均衡策略简单说一下,其实通过心跳机制,去发现哪台服务器是正常,哪台是压力小的,哪台是最优的(需要研究的可以底部实现自行修炼)。
注2:一般企业部署项目组,也一般至少也要不做两台服务器,使用负载均衡技术能够构建一个小的那个集群,这样的话一台服务器挂了另一台可以保证运行,这样不至于服务不可用。
二、集群种常见Session问题及解决方案
集群种常见Session问题
1,session丢失问题。比如说用户一个用户登录了,然后这个用户登陆状态保存session中存放在一台服务器,但是突然这台机器挂了,这时候他的指向指向到另一台机器了,这个时候他的那个登录状态就会消失,就没有登录状态,用户在上一步操作,是登录了,下一步操作就需要重新登陆,这种这种就是session丢失的问题。
2,session管理。还有常见的,比如说像什么电子商务,一些网站吗?比如说增加购物车啊,你可能这次请求请留到这个服务器可能就挂了,你加购物车,你的session状态是不存在的,那这时候你就要重新登录,所以这个就是session丢失的问题,session管理是集群中的一个最大的一个难题。
一般有三种解决方案:
第一:session复制
第二:基于ip地址发起的负载均衡策略
第三:session单独集中管理放入缓存/数据库
第一种:Session复制,集群的服务器,同步session。session对象是每台服务器保存,比如说用户登陆这台服务器,session也保存在这台应用服务器中,那这个时候会把同步复制到另一台服务器.
这种方案存在两个问题:(1)全部重复复制耗内存,如果集群部署很大,那将将耗费系统的大量资源。(2)session同步会有延时,尤其不同服务器部署不同机房,网络传输。
第二种:基于ip地址发起的负载均衡策略,就是通过负载均衡的方式,比如说你一个ip地址,然后利用这个请求的IP,哈希算哈希算法实现,然后就是你同一个ip地址,计算出来一个哈希值,就只指向同一个服务器,也可以根据COOkie将同一个请求分发到同一个服务器上。
这样也会存在两个问题:(1)一台服务器宕机挂掉了,然后这个这个服务器上面所有的session全部都丢失了,这个时候,比如这个用户这数据访问,那么就请求就会转发到另一台服务器上,那这个时候,就用户状态就不不存在了。(2)当需要扩展的时候,比如说你现在两台吧,假如我再加入一台服务器,最后三台那个哈希算法就需要再做调整,这个所以导致哈希算法指向就不是之前一台服务器可能,造成session丢失。
第三种(最佳):session单独集中管理放入缓存/数据库。这种方式目前来说,采用可能是最优的一种方案了,就专门搞一台服务器存放session,然后session集群,进行统一管理,管理也比较方便。即使你的应用服务器重启了或宕机,也不会造成session的丢失,而且它灵活性也比较高,即使应用服务器以后再扩展,对session影响不大,因为应用服务器跟那个session可存放不同的服务器
缺点就是可能,你要单独部署,需要添加新的机器,然后呢把这个当做缓存缓存,也有一定的网络应用网络延时,有几个注意事项,比如你放缓存(一般是redis里面),你这个session里面对象要是可序列化的,另一个session失效时间是缓存的时间,而不是应用服务器配置的。
================= END ==================
领取专属 10元无门槛券
私享最新 技术干货