第一种:黏贴Session
原理:黏贴Session是指将用户锁定到某一个服务器上,比如上面说的例子,用户第一次请求时,负载均衡器将用户的请求转发到了A服务器上,如果负载均衡器设置了黏贴Session的话,那么用户以后的每次请求都会转发到A服务器上,相当于把用户和A服务器粘到了一块,这就是粘性Session机制。
优点:简单,不需要对Session做任何处理。
确定:缺乏容错性,如果当前访问的服务器发生故障,用户将被转移到第二个服务器上时,他的Session信息都将失效。
适用场景:发生故障对客户产生的影响较小;服务器发生故障时低概念事件。
实现方式:以Nginx为例,在upstream模块配置ip_hash属性即可实现粘性Session。
第二种:服务器Session复制
原理:任何一个服务器上的Session发生改变(增删改),改节点会把这个Session的所有内容序列化,然后广播给所有其他节点,不管其他服务器需不需要Session,以此来保证Session同步。
优点:各个服务器间Session能够实时响应。
缺点:会对网络负荷造成一定压力,如果Session量大的话可能会造成网络堵塞,拖慢服务器性能。
第三种:Session共享机制
使用分布式缓存方案比如memcached、redis,但是要求Memcached或Redis必须是集群。使用Session共享也分两种机制,如下:
- 粘性Session处理方式
原理:不同的Tomcat指定访问不同的主Memcached。多个Memcached之间信息是同步的,能主从备份和高可用。用户访问时首先在Tomcat中创建Session,然后将Session复制一份放到它对应的Memcached上。Memcached只起备份作用,读写都在Tomcat上。当某一个Tomcat挂掉后,集群将用户的访问定位到备Tomcat上,然后根据cookie中存储的SessionId找Session,找不到时,再去相应的Memcached上去找Session,找到之后将其复制到Tomcat上。
- 非粘性Session处理方式
原理:Memcached做主从复制,写入Session都往从Memcached服务上写,读取都从主Memcached读取,Tomcat本身不存储Session
优点:可容错,Session实时响应。
第四种:Session持久化到数据库
原理:拿出一个数据库,专门用来存储Session信息。保证Session的持久化。
忧点:服务器出现问题,Session不会丢失。
缺点:如果网站的访问量很大,把Session存储到数据库中,会对数据库造成很大压力,还需要增加额外的开销维护数据库。
第五种:terracotta实现Session复制
原理:Terracotta的基本原理是对于集群间共享的数据,当在一个节点发生变化的时候,Terracotta只把变化的部分发送给Terracotta服务器,然后由服务器把它转发给真正需要这个数据的节点。可以看成是对第二种方案的优化。
有点:这样对网络的压力就非常小,各个节点也不必浪费CPU时间和内存进行大量的序列化操作。把这种集群间数据共享的机制应用在Session同步上,既避免了对数据库的依赖,有能达到负载均衡和灾难恢复的效果。

