应用服务器的高可用架构设计主要基于服务无状态这一特性,但事实上,业务总是有状态的,Web应用中将那些多次请求修改使用的上下文对象称为会话即Session,为了实现高可用无可避免需要集群部署,并通过负载均衡进行请求转发,那么集群多节点之间如何实现Session的共享?
- Session复制
即在集群各节点之间通过Web容器,即Tomcat等,实现Session复制,缺点是如果集群规模较大,集群服务器间需要大量的通信进行Session复制,占用服务器和网络资源,系统不堪重负,并且由于Session本身数据存储在应用服务器内存中,在大量用户访问的情况下,可能导致内存不足,引发应用性能问题。在用户、业务规模不大时使用。 - Session绑定
利用负载均衡的原地址Hash算法实现,负载均衡服务器总是将源于同一IP的请求分发到同一个节点上(也可以根据Cookie信息将同一个用户的请求总是分发到同一台服务器上),整个会话期间,用户所有的请求都在同一台服务器上,这种方法叫做会话粘滞。这种方法不符合高可用需求,一旦某台服务器宕机,用户的Session就会丢失,因此很少使用。 - 利用Cookie记录Session
是一种较为早期的方法,将用户会话信息记录在Cookie即用户客户端中,受Cookie大小限制,能记录的信息有限;且每次请求响应都得带上Cookie,影响性能;如果用户关闭Cookie就无法使用。 - Session服务器
可用性高、伸缩性好、性能也不错的方案,对信息大小也没有限制,采用独立的Session服务器集群管理Session。常用的方式是利用分布式缓存、数据库。Spring就封装了相关的解决方案,例如使用redis。