将Session会话存储在Redis并使用Nginx来实现Tomcat负载均衡
一段时间以来,我一直在寻找一种方式来发布代码到生产系统而不需要宕机,不影响任何活动用户。出人意料的是,该解决方案花了很少的时间就实现了。我们有Nginx负载平衡的Tomcat两个实例。Tomcat的Session存储在Redis里。 nginx配置成无粘性的,因为一个请求可以分到群集中的任何节点。当我们需要发布新代码,只需停下任何Tomcat实例。当前所有用户将被路由到其他活动实例。由于会话数据外部存储在Redis,活跃的用户将不会受到影响。一旦不活动实例已被更新,重启并可恢复服务。
我们先从Nginx开始:
[raoul@raoul-wp ~]$ sudo rpm -ivh nginx-1.4.2-1.el6.ngx.x86_64.rpm
编辑/etc/nginx/nginx.conf并添加下面文字
http {
2.
upstream tomcat {
3.
server localhost:8080;
4.
server localhost:8081;
5.
}
6.
include /etc/nginx/mime.types;
7.
default_type application/octet-stream;
修改/etc/nginx/conf.d/default.conf,用下面的替换location部分:
location / {
2.
proxy_pass http://tomcat;
重启Nginx:
[raoul@raoul-wp nginx]$ sudo service nginx restart
接下来,安装Tomcat两个实例。改变第二个实例的服务器端口,使他们不冲突。如果你在浏览器中输入https://localhost,将进入默认的tomcat页面。但是,由于我们还没有建立粘性会话,每个请求将以轮询的方式获得负载平衡,这实际上意味着它会每个请求创建一个新的会话。使用内置的tomcat的例子可以很容易地看到这种行为,导航到http://localhost/examples/servlets/servlet/SessionExample 并刷新此页面几次,并注意会话ID每次都改变。现在来解决这个问题。
下载并安装Redis。在http://redis.io/download有个好文档,所以不打算详谈。启动服务器,并使用客户端程序检查它是否正常工作。
最后,需要配置Tomcat来存储会话在Redis。为此,我们将使用Tomcat的Redis会话管理器(https://github.com/jcoleman/tomcat-redis-session-manager)。这个不能开箱即用需要进行一些调整。您需要下载这个项目的源代码,并更新相关的库版本后,重新构建它。我用的版本是commons-pool2-2.2.jar和jedis-2.6.1.jar。将这些JAR复制到两个Tomcat实例的lib目录。
更新在 tomcat-redis-session-manager 中build.gradle指定的commons-pool,jedis和tomcat的版本,构建项目。然后将tomcat-redis-session-manager-1.2.jar复制到每个实例的tomcat的lib目录下。修改两个tomcat的context.xml:
<
Valve
className
=
"com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve"
/>
2.
<
Manager
className
=
"com.orangefunction.tomcat.redissessions.RedisSessionManager"
3.
host
=
"localhost"
4.
port
=
"6379"
5.
database
=
"0"
6.
maxInactiveInterval
=
"60"
/>
重新启动Tomcat实例,我们就大功告成了。现在你可以看到Tomcat的会话存储在Redis了。转载请保留原文链接.