阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

用Redis存储Tomcat集群的Session

140次阅读
没有评论

共计 2250 个字符,预计需要花费 6 分钟才能阅读完成。

本人花了不少时间来寻求一种方法,把新开发的代码推送到到生产系统中部署,生产系统要能够零宕机、对使用用户零影响。

我的设想是使用集群来搞定,通过通知负载均衡 Nginx,取下集群中的 Tomcat 节点,然后对 Tomcat 上的应用进行升级,再通知负载均衡 Nginx,把 Tomcat 节点重新加载上去。依次这么做,把集群中的所有 Tomcat 都替换一次即可。

那么问题来了,在取下 Tomcat 节点和加载新 Tomcat 节点时如何做到对用户无影响呢?方法很简单,共享 Session。

下面,我们用实例来说明此方案。我们的例子使用了一台 Nginx 做负载均衡,后端挂接了两台 Tomcat,且每台 Tomcat 的 Session 会话都保存到 Redis 数据库中。其中,Nginx 配置为 non-sticky 运行模式,也即每一个请求都可以被分配到集群中的任何节点。当要上线新代码时,只需简单地取下 Tomcat 实例,此时所有的访问用户会被路由到活动的 Tomcat 实例中去,而且由于会话数据都是保存在 Redis 数据库中,所以活跃用户并不会受影响。当 Tomcat 更新完毕,又可以把此节点加入到 Nginx 中。

安装 Nginx

# sudo rpm -ivh nginx-1.4.2-1.el6.ngx.x86_64.rpm

修改配置文件 /etc/nginx/nginx.conf,并添加下面的内容:

http {
upstream tomcat  {
        server localhost:8080;
        server localhost:8081;
    }
include      /etc/nginx/mime.types;
default_type  application/octet-stream;

修改配置文件 /etc/nginx/conf.d/default.conf 并替换 location 部分的内容:

location / {
    proxy_pass  http://tomcat;
  }

重启 Nginx

# sudo service nginx restart

接下来,安装两个 Tomcat 实例。由于我们是在同一台服务器上做的演示,要让两台 Tomcat 不发生冲突,需要修改第二个 Tomcat 实例的端口号。由于 Nginx 配置为 non-sticky 运行模式,对每个请求采用的是 Round-robin 负载均衡方式,这意味着它会为每个请求都抽奖一个新会话。

接着,下载并安装 Redis。步骤省略,很简单。

最后,我们需要配置 Tomcat,让 Tomcat 把会话 Session 保存到 Redis 数据库。

我们要使用 tomcat-redis-session-manager 这样的第三方库,主页见:

https://github.com/jcoleman/tomcat-redis-session-manager

要注意此库并非开箱即用的,使用时需要做一些调整。你需要下载源码,并在更新了依赖库的版本后,重建项目。比如我使用了 commons-pool2-2.2.jar 和 jedis-2.6.1.jar 依赖库。要记住把这些 jar 文件复制到每一个 Tomcat 实例的 lib 子目录下。

在更新了 commons-pool、jedis 和 tomcat 版本这些库后,你可以使用 build.gradle 来构建整个项目。构建完毕后,复制新生成的 tomcat-redis-session-manager-1.2.jar 到每一个 Tomcat 实例的 lib 子目录下。并在修改每一个 Tomcat 实例的 context.xml 配置文件:

<Valve className=”com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve” />
<Manager className=”com.orangefunction.tomcat.redissessions.RedisSessionManager”
        host=”localhost”
        port=”6379″
        database=”0″
        maxInactiveInterval=”60″ />

重启 Tomcat 实例。可以检查到 Redis 确实保存了 Tomcat 的会话。然后我们对 Tomcat 实例取下或恢复时,访问用户确实没受影响。

Ubuntu 14.04 下 Redis 安装及简单测试 http://www.linuxidc.com/Linux/2014-05/101544.htm

Redis 集群明细文档 http://www.linuxidc.com/Linux/2013-09/90118.htm

Ubuntu 12.10 下安装 Redis(图文详解)+ Jedis 连接 Redis http://www.linuxidc.com/Linux/2013-06/85816.htm

Redis 系列 - 安装部署维护篇 http://www.linuxidc.com/Linux/2012-12/75627.htm

CentOS 6.3 安装 Redis http://www.linuxidc.com/Linux/2012-12/75314.htm

Redis 安装部署学习笔记 http://www.linuxidc.com/Linux/2014-07/104306.htm

Redis 配置文件 redis.conf 详解 http://www.linuxidc.com/Linux/2013-11/92524.htm

Redis 的详细介绍 :请点这里
Redis 的下载地址 :请点这里

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-20发表,共计2250字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中