一、背景
在搭建完集群环境后,不得不考虑的一个问题就是用户访问产生的session如何处理。
如果不做任何处理的话,用户将出现频繁登录的现象,比如集群中存在A、B两台服务器,用户在第一次访问网站时,Nginx通过其负载均衡机制将用户请求转发到A服务器,这时A服务器就会给用户创建一个Session。当用户第二次发送请求时,Nginx将其负载均衡到B服务器,而这时候B服务器并不存在Session,所以就会将用户踢到登录页面。这将大大降低用户体验度,导致用户的流失,这种情况是项目绝不应该出现的。
二、实现分布式session方式
1.粘性session
1)原理
粘性Session是指将用户锁定到某一个服务器上,比如上面说的例子,用户第一次请求时,负载均衡器将用户的请求转发到了A服务器上,如果负载均衡器设置了粘性Session的话,那么用户以后的每次请求都会转发到A服务器上,相当于把用户和A服务器粘到了一块,这就是粘性Session机制。
2)优缺点
优点:简单,不需要对session做任何处理。
缺点:缺乏容错性,如果当前访问的服务器发生故障,用户被转移到第二个服务器上时,他的session信息都将失效。
3)适用场景
发生故障对客户产生的影响较小;服务器发生故障是低概率事件。
4)实现方式
以Nginx为例,在upstream模块配置ip_hash属性即可实现粘性Session。
代码语言:javascript复制upstream mycluster{
#这里添加的是上面启动好的两台Tomcat服务器
ip_hash;#粘性Session
server 192.168.22.229:8080 weight=1;
server 192.168.22.230:8080 weight=1;
}
2.服务器session复制
1)原理
任何一个服务器上的session发生改变(增删改),该节点会把这个 session的所有内容序列化,然后广播给所有其它节点,不管其他服务器需不需要session,以此来保证Session同步。
2)优缺点
优点:可容错,各个服务器间session能够实时响应。
缺点:会对网络负荷造成一定压力,如果session量大的话可能会造成网络堵塞,拖慢服务器性能。
3)适用场景
网络带宽大
4)实现方式
tomcat-redis-session-manager
3.缓存集中式管理
1)原理
将Session存入分布式缓存集群中的某台机器上,当用户访问不同节点时先从缓存中拿Session信息
2)优缺点
优点:可靠性好
缺点:实现复杂、稳定性依赖于缓存的稳定性、Session信息放入缓存时要有合理的策略写入
3)适用场景
集群中机器数多、网络环境复杂
4.session持久化到数据库中
1)原理
拿出一个数据库,专门用来存储session信息。保证session的持久化。
2)优缺点
优点:服务器出现问题,session不会丢失
缺点:如果网站的访问量很大,把session存储到数据库中,会对数据库造成很大压力,还需要增加额外的开销维护数据库。