为什么负载均衡后要共享session
上一节提到了负载均衡,可以通过nginx将请求分发到不同的tomcat上,但是负载均衡后就会存在一个问题,如果用户第一次访问的是服务器1,但是第二次访问的时候被分配给服务器2,那么就显示他没有登录,用户体验就会很差。
方法一:ip_hash
ip_hash即就是通过标记IP地址,如果请求来自同一ip就会分发到同一个服务器上。但是该方案由两个弊端:
- 如果大量的请求来自同一个局域网,那么负载均衡就失去意义了。
- 如果其中的一个服务器宕机了,那么只能分配到另一个服务器了,此时还会出现上述的问题。
实现如下:1
2
3
4
5upstream tomcat_8111_82222{
server 127.0.0.1:8111 weight=2;
server 127.0.0.1:8222 weight=2;
ip hash;
}
方法二:redis+tomcat-sessoin-manager
第二种方案就是使用redis来存取session实现session共享。
步骤如下:
- 启动自己的本地的redis服务。
- 下载tomcat读取redis需要的jar包并进行配置。
需要用到jar包:jedis-2.5.2.jar,
commons-pool2-2.0.jar,
tomcat-redis-session-manager1.2.jar
将下载好的jar包放到tomcat的lib目录。
然后修改tomcat的context.xml文件。1
2
3
4
5
6<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="127.0.0.1"
port="6379"
database="0"
maxInactiveInterval="60" />