问题描述:
现在一般的公司在解决高并发,高访问量,一般都会采用集群/分布式环境。但这有会出现一个问题,如何分享session。在nginx的负载均衡下,用户user访问同一个页面2次,会分配到不同的服务器上A,B,如果没有解决session共享问题,那么就会出现在A服务器上登录过,第二次访问B服务器上的那个页面时又要登录的情况。
解决的方法:
1、粘性session
上面我们讲到在集群情况下,我们在通过nginx访问同一个页面多次,可能会访问不同服务器上的同一个页面,session不同步的问题会导致用户必须在同一个页面登录两次。
粘性session就是改变nginx负载均衡的策略。下面我们将简略的讲述nginx的几种策略。
一、nginx的upstream目前支持负载均衡方式的分配
1、RR(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
例如:
upstream tomcats {
server 10.1.1.107:88 max_fails=3 fail_timeout=3s weight=9;
server 10.1.1.132:80 max_fails=3 fail_timeout=3s weight=9;
}
2、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
例如:
upstream tomcats {
ip_hash;
server 10.1.1.107:88;
server 10.1.1.132:80;
}
3、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
4、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
所以我们可以采用ip_hash的策略使得一个用户ip只能一直访问特定的某一台服务器,所以之前的那种情况也就不会发生。
优点:不需要再session分享上做处理,因为本身就是只访问一台服务器
缺点:就是容错性很差!!如果当前访问的服务器发生故障,用户被转移到第二个服务器上时,他的session信息都将失效。
使用场景:发生故障对客户产生的影响较小;服务器发生故障是低概率事件。
2、session复制
原理:任何一个服务器上的session发生改变(增删改),该节点会把这个 session的所有内容序列化,然后广播给所有其它节点,不管其他服务器需不需要session,以此来保证Session同步。
优点:可容错,各个服务器间session能够实时响应。
缺点:会对网络负荷造成一定压力,如果session量大的话可能会造成网络堵塞,拖慢服务器性能。
实现方式:在tomcat,server.xml开启集群session复制功能