将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了。转载请保留原文链接.

你可能感兴趣的:(Architecture,AppServer)